zoukankan      html  css  js  c++  java
  • 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的这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/

  • 相关阅读:
    数据库分表之Mybatis+Mysql实践
    mysql中You can't specify target table for update in FROM clause错误
    SQL中的limit用法
    在电脑端打开apk文件
    mysql进阶(五)数据表中带OR的多条件查询
    Java之——汉字转换拼音(大小写)
    数据库查询模糊匹配
    produces在@requestMapping中的使用方式和作用
    JSONP跨域请求数据报错 “Unexpected token :”的解决办法
    C# TcpClient的Connect超时处理(Timeout)
  • 原文地址:https://www.cnblogs.com/fangpei/p/4657977.html
Copyright © 2011-2022 走看看