MD中bitmap源代码分析--状态机实例
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的这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/
MD中bitmap源代码分析--状态机实例的更多相关文章
- MD中bitmap源代码分析--数据结构
本篇分析bitmap的数据结构的设计,并基于此分析bitmap的工作机制. 为了后面更清楚的理解,先有个总体印象,给出整体的结构图: 在下面的描述中涉及到的内容可以对照到上图中相应部分,便于理解. 首 ...
- MD中bitmap源代码分析--SYNC IO和RAID5的补充
最近在做bwraid的R6的设计工作,需要调研一下bitmap下刷磁盘的IO属性(是否为SYNC IO),还有raid5中bitmap的存储和工作方式. 1.bitmap刷磁盘是否为 SYNC IO? ...
- MD中bitmap源代码分析--入题概述
在MD模块中,各级raid都使用的一份bitmap的源码,也就是说共用一种bitmap的流程,下面以raid1的使用为例来分析bitmap的工作原理. 在使用raid1磁盘阵列的时候,对于数据的可靠性 ...
- MD中bitmap源代码分析--清除流程
bitmap的清零是由bitmap_daemon_work()来实现的.Raid1守护进程定期执行时调用md_check_recovery,然后md_check_recovery会调用bitmap_d ...
- MD中bitmap源代码分析--设置流程
1. 同步/异步刷磁盘 Bitmap文件写磁盘分同步和异步两种: 1) 同步置位:当盘阵有写请求时,对应的bitmap文件相应bit被置位,bitmap内存页被设置了DIRTY标志.而在下发写请求给磁 ...
- javascript 引擎Rhino源代码分析 浅析 实例函数对象及this
http://blog.csdn.net/liantian_wu/article/details/49797481
- Spark2.3(三十五)Spark Structured Streaming源代码剖析(从CSDN和Github中看到别人分析的源代码的文章值得收藏)
从CSDN中读取到关于spark structured streaming源代码分析不错的几篇文章 spark源码分析--事件总线LiveListenerBus spark事件总线的核心是LiveLi ...
- 【VS开发】【Live555-rtsp】RTSP服务器实例live555源代码分析
原文地址:RTSP服务器实例live555源代码分析作者:mozheer 1. RTSP连接的建立过程 RTSPServer类用于构建一个RTSP服务器,该类同时在其内部定义了一个RTSPClient ...
- Twitter Storm源代码分析之ZooKeeper中的目录结构
徐明明博客:Twitter Storm源代码分析之ZooKeeper中的目录结构 我们知道Twitter Storm的所有的状态信息都是保存在Zookeeper里面,nimbus通过在zookeepe ...
随机推荐
- c# linq的一些运用
最近在学习xml.linq 网上也找了一些资料都不大全面,因此在这写了一点东西和大家分享,由于本人知识有限,如有错误请指证 可扩展标记语言,标准通用标记语言的子集,一种用于标记电子文件使其具有结构性的 ...
- 使用JDK自带缓存(Cache)实现Cookie自动登陆
自定义一个缓存类AdminCache package jw.admin.common; import jw.base.entity.Admin; import sun.security.util.Ca ...
- PYCURL ERROR 22 - "The requested URL returned error: 403 Forbidden"
RHEL6.5创建本地Yum源后,发现不可用,报错如下: [root@namenode1 html]# yum install gcc Loaded plugins: product-id, refr ...
- SpringMVC06以对象的方式获取前台的数据
========创建需要的两个实体类================ public class School { private String sName; private String addres ...
- await, anync
public Form1() { InitializeComponent(); } // The following method runs asynchronously. The UI thread ...
- Ajax跨域请求中的Cookie问题(默认不带cookie等凭证)
1.原生Ajax请求方式,设置跨域请求附带详细参数 var xhr = new XMLHttpRequest(); xhr.open("POST", "http://xx ...
- How to Build CyanogenMod for One X (codename: endeavoru)
来源:http://wiki.cyanogenmod.org/w/Build_for_endeavoru#What_you.E2.80.99ll_need How to Build CyanogenM ...
- SQL 2008R2 日期转换
--SQL CONVERT日期转换 print GETDATE() --相同 Select CONVERT(varchar(100), GETDATE(), 0) AS NDateTime --: 0 ...
- hadoop2.4.1伪分布式搭建
1.准备Linux环境 1.0点击VMware快捷方式,右键打开文件所在位置 -> 双击vmnetcfg.exe -> VMnet1 host-only ->修改subnet ip ...
- iOS 网络与多线程--6.下载并保存网络图片
使用二进制数据对象的,从制定网站获取数据的方法,下载网络图片,并转化为二进制数据,然后将二进制数据保存到磁盘 按照注释需要进行阅读以下代码 // Created by JinXin on 15/12/ ...