MD中bitmap源代码分析--状态机实例
2015-07-19 01:04
225 查看
1. page_attrs的状态转换关系
![](http://images0.cnblogs.com/blog2015/602416/201507/190100326739791.png)
之前说过,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的这3个page的页属性为BITMAP_PAGE_DIRTY,每个bit对应的*bmc置为2,马上*bmc++,此时这些*bmc = 3。
2、 激活守护进程之后,在守护进程下发写请求之前,执行bitmap_unplug(),遍历bitmap file缓存的所有page,因为只有这3个page属性是BITMAP_PAGE_DIRTY,所以只操作这3个page。以page为单位,将这3个page的bit下刷到磁盘bitmap file,清除各page对应的页属性BITMAP_PAGE_DIRTY。等待bit刷磁盘完全结束之后,再进行写bio下发。
3、 当最后一个写bio成功回调之后,执行bitmap_endwrite(),对于这3个page对应的每个bit的*bmc递减,此时这些*bmc = 2。将3个page的页属性置为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设置为0,bit逐一清零,将3个页属性BITMAP_PAGE_ NEEDWRITE清除,bitmap对于3个page的bit下刷到磁盘。
转载请注明出处:http://www.cnblogs.com/fangpei/
相关文章推荐
- c++进行文件摘要
- 事件监听器与适配器
- Python编程规范及性能优化
- javaweb之Filter过滤器详解
- Cantor表
- wyh2000 and a string problem(bc题)
- C#事件与委托
- C++中二维数组的动态创建与处理
- Java _Map接口的使用(转载)
- GO语言练习:channel select 超时机制
- Python模块常用的几种安装方式
- Spring-02-IOC容器
- 053.Local Variable 代码块局部变量
- LAMP + Yii,并且隐藏Yii url的inde.php
- C#GDI绘制渐变线条,可用于添加阴…
- C#GDI绘制自定义字体
- C#中的DataTable详解
- C# List<>简单用法
- C#常见转义字符
- C#常见转义字符