1. page_attrs的状态转换关系

  之前说过,bitmap的优化核心是:bitmap设置后批量写入;bitmap延时清除。写bit用bitmap_statrwrite() + bitmap_unplug()两个函数,实现了bitmap设置后的批量写入;清bit用bitmap_endwrite()+两轮bitmap_deamon_work()实现了bitmap延迟清除。

 

2. 一个实例分析

  下面以一个写请求实例来进行分析。假设写之前的chunk的数据都是一致的,还是以写3*4096*8(3个page)个chunk的数据,对整个盘阵仅仅只有这1次写请求,分析例子如下5步操作:

  1、 raid1的make_request()接收这个写请求,在将写bio挂到pending_list上之后,执行bitmap_startwrite(),然后激活守护进程。bitmap_startwrite()设置bitmap file的这3page的页属性为BITMAP_PAGE_DIRTY,每个bit对应的*bmc置为2,马上*bmc++,此时这些*bmc = 3

  2、 激活守护进程之后,在守护进程下发写请求之前,执行bitmap_unplug(),遍历bitmap file缓存的所有page,因为只有这3个page属性是BITMAP_PAGE_DIRTY,所以只操作这3个page。以page为单位,将这3pagebit下刷到磁盘bitmap file清除各page对应的页属性BITMAP_PAGE_DIRTY等待bit刷磁盘完全结束之后,再进行写bio下发

  3、 当最后一个写bio成功回调之后,执行bitmap_endwrite(),对于这3个page对应的每个bit的*bmc递减,此时这些*bmc = 23page的页属性置为BITMAP_PAGE_CLEAN

  4、 当守护进程执行时,调用bitmap_daemon_work(),遍历整个bitmap file缓存。对这3个page的每个bit的*bmc设置为1,并对这3个page再增加BITMAP_PAGE_NEEDWRITE页属性

  5、 当守护进程再次执行时,再次调用bitmap_daemon_work(),遍历整个bitmap file缓存。对这3个page页属性BITMAP_PAGE_CLEAN清除,相应的每个bit的*bmc设置为0bit逐一清零,将3个页属性BITMAP_PAGE_ NEEDWRITE清除,bitmap对于3个page的bit下刷到磁盘

转载请注明出处:http://www.cnblogs.com/fangpei/

MD中bitmap源代码分析--状态机实例的更多相关文章

  1. MD中bitmap源代码分析--数据结构

    本篇分析bitmap的数据结构的设计,并基于此分析bitmap的工作机制. 为了后面更清楚的理解,先有个总体印象,给出整体的结构图: 在下面的描述中涉及到的内容可以对照到上图中相应部分,便于理解. 首 ...

  2. MD中bitmap源代码分析--SYNC IO和RAID5的补充

    最近在做bwraid的R6的设计工作,需要调研一下bitmap下刷磁盘的IO属性(是否为SYNC IO),还有raid5中bitmap的存储和工作方式. 1.bitmap刷磁盘是否为 SYNC IO? ...

  3. MD中bitmap源代码分析--入题概述

    在MD模块中,各级raid都使用的一份bitmap的源码,也就是说共用一种bitmap的流程,下面以raid1的使用为例来分析bitmap的工作原理. 在使用raid1磁盘阵列的时候,对于数据的可靠性 ...

  4. MD中bitmap源代码分析--清除流程

    bitmap的清零是由bitmap_daemon_work()来实现的.Raid1守护进程定期执行时调用md_check_recovery,然后md_check_recovery会调用bitmap_d ...

  5. MD中bitmap源代码分析--设置流程

    1. 同步/异步刷磁盘 Bitmap文件写磁盘分同步和异步两种: 1) 同步置位:当盘阵有写请求时,对应的bitmap文件相应bit被置位,bitmap内存页被设置了DIRTY标志.而在下发写请求给磁 ...

  6. javascript 引擎Rhino源代码分析 浅析 实例函数对象及this

    http://blog.csdn.net/liantian_wu/article/details/49797481

  7. Spark2.3(三十五)Spark Structured Streaming源代码剖析(从CSDN和Github中看到别人分析的源代码的文章值得收藏)

    从CSDN中读取到关于spark structured streaming源代码分析不错的几篇文章 spark源码分析--事件总线LiveListenerBus spark事件总线的核心是LiveLi ...

  8. 【VS开发】【Live555-rtsp】RTSP服务器实例live555源代码分析

    原文地址:RTSP服务器实例live555源代码分析作者:mozheer 1. RTSP连接的建立过程 RTSPServer类用于构建一个RTSP服务器,该类同时在其内部定义了一个RTSPClient ...

  9. Twitter Storm源代码分析之ZooKeeper中的目录结构

    徐明明博客:Twitter Storm源代码分析之ZooKeeper中的目录结构 我们知道Twitter Storm的所有的状态信息都是保存在Zookeeper里面,nimbus通过在zookeepe ...

随机推荐

  1. 通过 Linux 容器进行虚拟化

    简单介绍 Linux 容器是一种轻量级"虚拟化"方法,用于在单个控制主机上同一时候执行多个虚拟装置(容器).还有一个可用来描写叙述 Linux 容器所执行的操作的术语是" ...

  2. [Angular 2] Using a Reducer to Change an Object's Property Inside an Array

    Reducers are also often used for changing a single property inside of other reducers. This lesson sh ...

  3. Topcoder SRM 648 (div.2)

    第一次做TC全部通过,截图纪念一下. 终于蓝了一次,也是TC上第一次变成蓝名,下次就要做Div.1了,希望div1不要挂零..._(:зゝ∠)_ A. KitayutaMart2 万年不变的水题. # ...

  4. ASP.NET-FineUI开发实践-6

    FineUI4.1.0更新,传说的V4版稳定版,很多人也从3.0+升级了,接着又连续更新了几次,现在是V4.1.3 2014-09-09日更新的.更新的挺快,感觉跟不上节奏,我很欣慰,看来开原版还是靠 ...

  5. JY05-JavsScript-JS基础01

    JavaScript第一天 1.前端三层 HTML   结构层 语义 骨架 css  表现层 审美 衣服 JavsScript 行为层 行为交互 动作 2.转义字符\r\n\t \r return 回 ...

  6. Git系列(1) Windows下Git服务器搭建

    作为对前两天Git服务器搭建的一个整理,我想分别从服务端和客户端两个角度来记录下整个搭建过程,为了达到目标,我们需要哪些操作. (一)服务端软件和账号的安装配置 我们这里只需要两个软件git和ssh, ...

  7. 利用eclipse开发php<转>

    1.安装php环境 Eclipse支持PHP自动提示 其实如果你已经安装好了php环境(安装过程见)的话,只需要下面2步就可以了.hoho,很简单的. 1,下载eclipse中php的插件phpecl ...

  8. Android Studio 实用快捷键

    ctrl + alt + 方向键   跳转到上次或下次编辑位置 ctrl + alt +n   查找文件 shift + f6       重构之重命名 ctrl + f12       导航到类方法 ...

  9. C#之重定向输入输出

    当我们写完程序,想要在另一个平台上跑我们所写的程序的时候,就需要用到重定向输入输出. 重定向有两中方式,即同步和异步. 下面来讲讲同步 代码: Process process = new Proces ...

  10. JQuery 操作DOM

    DOM(Document Object Model—文档对象模型):一种与浏览器, 平台, 语言无关的接口, 使用该接口可以轻松地访问页面中所有的标准组件DOM 操作的分类:    DOM Core: ...