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. C++标准库之 Lower_Bound, upper_Bound

    关于二分查找,这绝对是最简单却又最难的实现了,其各种版本号能够參见http://blog.csdn.net/xuqingict/article/details/17335833 在C++的标准库中,便 ...

  2. CSDN挑战编程——《数学问题》

    数学问题 题目详情: 给你两个长度为n的正整数序列分别为{a1,a2,a3...an},{b1,b2,b3...bn},0<ai,bi<=100: 设S=max{x1*a1+x2*a2+x ...

  3. Android系统更改状态栏字体颜色

    随着时代的发展,Android的状态栏都不是乌黑一片了,在Android4.4之后我们可以修改状态栏的颜色或者让我们自己的View延伸到状态栏下面.我们可以进行更多的定制化了,然而有的时候我们使用的是 ...

  4. linux下U盘的读取

    1.虚拟机vmware右下角,找到大容量存储设备图标,右键->connect(disconect from host):使U盘连接到虚拟机中来. 2.打开终端:fdisk -l [root@lo ...

  5. Linux系统最小化安装之后的系统基础环境安装以及内核优化脚本

    #!/bin/bash #添加epel和rpmforge的外部yum扩展源 cd /usr/local/src wget http://mirrors.ustc.edu.cn/fedora/epel/ ...

  6. 10、第十节课jq420151012

    1.点击交替显示隐藏功能  点击交替执行的:fadeToggle(1000) , slideToggle() ,  toggle(1000);      2.点击单独执行    单独显示/隐藏:sho ...

  7. Java字符串的10大热点问题,你都懂吗?

    转自 威哥干JAVA http://www.codingke.com 下面我为大家总结了10条Java开发者经常会提的关于Java字符串的问题,如果你也是Java初学者,仔细看看吧: 1.如何比较字符 ...

  8. javascript判断浏览器

    function getExplorer() { //IE if (navigator.userAgent.indexOf("MSIE")>=0) { } //Firefox ...

  9. 武汉科技大学ACM :1006: 华科版C语言程序设计教程(第二版)习题7.15

    Problem Description 输入n个字符串(n<=100),输出其中最长的串,如果有多个则取最先找到的那一个. Input 多组测试数据. 每组测试数据第一行包含一个整数n,表示一共 ...

  10. debain 解决无法显示中文

    首先先配置编码:vim /etc/locale.gen  去掉前面的# en_US.UTF-8 UTF-8 zh_CN GB2312 zh_CN.GBK GBK zh_CN.UTF-8 UTF-8 然 ...