bitmap的清零是由bitmap_daemon_work()来实现的。Raid1守护进程定期执行时调用md_check_recovery,然后md_check_recovery会调用bitmap_daemon_work根据各种状态进行清零的操作。Bitmap_daemon_work的实现比较复杂,bitmap的清理需要两次调用bitmap_daemon_work来完成的。下面主要以图的形式逐步分析bitmap清除的全部过程。

  刚进入这个函数的时候内存bitmap file的页bitmap_attr设置为BITMAP_PAGE_CLEAN。

  每次进入bitmap_daemon_work首先判断该函数是否睡够,如果没有睡够,则直接返回。这个睡眠是为了将一定时间见内的写盘操作集中批量处理。为了达到异步刷磁盘的效果,bitmap_daemon_work函数进行两轮才完成bit的清除。

  第一次bitmap_daemon_work()的作用

  1. 将所有的内存bitmap file的页bitmap_attr的属性BITMAP_PAGE_CLEAN清除;
  2. 设置bit所在页属性为BITMAP_PAGE_CLEAN和BITMAP_PAGE_NEEDWRITE;
  3. 处理到的每个bit对应的*bmc值设置为1。

  第二次bitmap_daemon_work()的作用:

  1. 将所有的内存bitmap file的页bitmap_attr属性BITMAP_PAGE_CLEAN清除;
  2. bit对应的*bmc设置为0;
  3. bit逐一清零;
  4. 将bitmap_attr属性BITMAP_PAGE_NEEDWRITE清除;
  5. bitmap对于一个page的bitmap file一次下刷到磁盘。

  不论哪次进入bitmap_daemon_work(),处理流程都是以page为单位来对bitmap file缓存处理,从第一个page逐步处理到最后一个page,作为一个大循环遍历所有的page。在page内部,以每个bit和对应的chunk来处理,从第一个chunk逐步处理到最后一个chunk。

  具体处理流程见下面几幅图所示,注意其中的lastpage的含义可能会有不同,已经在图中标出,需要注意的是每一步的先后顺序,bitmap_attr属性设置、bitmap刷磁盘的时机,每次处理bitmap file的page的不同之处已经用红框标出。

  这种异步清零的机制好处在于,在还未清零或者内存位图清0但没有刷到磁盘的时候,又有对该页的写请求到来,就只用增加bmc计数器或者只是把内存位图置位,而不用再写到外存的位图文件中,从而减少了一次写外存位图的io。另外,bit清零不用急着去做,异步则可以使系统资源转向处理更要紧的进程。

……

……

……

……

……

……

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

MD中bitmap源代码分析--清除流程的更多相关文章

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

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

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

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

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

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

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

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

  5. MD中bitmap源代码分析--状态机实例

    1. page_attrs的状态转换关系 之前说过,bitmap的优化核心是:bitmap设置后批量写入:bitmap延时清除.写bit用bitmap_statrwrite() + bitmap_un ...

  6. Raid1源代码分析--同步流程

    同步的大流程是先读,后写.所以是分两个阶段,sync_request完成第一个阶段,sync_request_write完成第二个阶段.第一个阶段由MD发起(md_do_sync),第二个阶段由守护进 ...

  7. Raid1源代码分析--写流程

    正确写流程的总体步骤是,raid1接收上层的写bio,申请一个r1_bio结构,将其中的所有bios[]指向该bio.假设盘阵中有N块盘.然后克隆N份上层的bio结构,并分别将每个bios[]指向克隆 ...

  8. Raid1源代码分析--读流程(重新整理)

    五.Raid1读流程分析 两个月前,刚刚接触raid1,就阅读了raid1读流程的代码,那个时候写了一篇博客.现在回过头看看,那篇的错误很多,并且很多地方没有表述清楚.所以还是决定重新写一篇以更正之前 ...

  9. Raid1源代码分析--读流程

    这篇博文不足之处较多,重新整理了一下,链接:http://www.cnblogs.com/fangpei/p/3890873.html 我阅读的代码的linux内核版本是2.6.32.61.刚进实验室 ...

随机推荐

  1. [转] postgresql常用命令

    PS: 数据库安装后,里面的每个数据库有自己的用户密码,需要dump的时候,指定用户pg_dump -U xxx <数据库>  > 某个地址 最近一直在学习Postgresql,下面 ...

  2. js函数中变量的作用域

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...

  3. 使用Xmanager工具连接Linux服务器

    测试环境:RHEL5.8 1.# vi /usr/share/gdm/defaults.conf --修改以下三项Enable=true DisplaysPerHost=10 Port=177 All ...

  4. Configuring Network Configuration-RHEL7

    1.查看网络状态systemctl status NetworkManager You can use the  systemctl status NetworkManager  command to ...

  5. 安装Microsoft oneDrive(原skyDrive)

    oneDrive下载地址:https://onedrive.live.com/about/zh-cn/download/ 安装时报错:Error 0x80040ca0 解决方案:关闭安装程序,按下面的 ...

  6. hdu 2304

    题意: 插座插空问题 水题.....只要知道最后一个不需要插即可.... 直接贴代码.. AC代码: #include <iostream> using namespace std; in ...

  7. SQL从入门到基础 - 01 数据库开发及ADO.Net

    一.数据库概述 1. 用自定义文件格式保存数据的劣势:并发性差,查找数据的速度差. 2. DBMS(DataBase Management System数据库管理系统)和数据库.平时谈到“数据库”的含 ...

  8. MySQL中的binlog相关命令和恢复技巧

    操作命令: 复制代码 代码如下: show binlog events in 'mysql-bin.000016' limit 10; reset master 删除所有的二进制日志 flush lo ...

  9. myeclipse 8.5打开文件Could not open the editor: Invalid thread access 异常

    最近打开了一个好久没用的myeclipse 8.5下的工作区间,导入一个项目,想打开文件编辑提示Could not open the editor: Invalid thread access

  10. Core Data 学习简单整理01

    Core Data是苹果针对Mac和iOS平台开发的一个框架, 通过CoreData可以在本地生成数据库sqlite,提供了ORM的功能,将对象和数据模型相互转换 . 通过Core Data管理和操作 ...