Raid1源代码分析--Barrier机制】的更多相关文章

本想就此结束Raid1的专题博客,但是觉得Raid1中自己构建的一套barrier机制的设计非常巧妙,值得单独拿出来分析.它保证了同步流程和正常读写流程的并发性,也为设备冻结/解冻(freeze/unfreeze)机制提供了保障. Barrier的意思就是,在某个请求设置上barrier之后,要先挡住barrier请求之后到来的请求,并催促barrier请求之前还未完成的请求执行,等待之前的请求全部返回完成之后,开始处理barrier请求,直到barrier请求完成之后,才允许barrier请求…
前段时间由于一些事情耽搁了,最近将raid1方面的各流程整理了一遍.网上和书上,能找到关于MD下的raid1的文档资料比较少.决定开始写一个系列的关于raid1的博客,之前写过的一篇读流程也会在之后加一些修改,我阅读的代码的linux内核版本是2.6.32.61.进入实验室的时间不长,关于磁盘管理等内核方面的理解不足或者有误之处,希望批评指正. 一.Raid1简介 Raid1又称为镜像磁盘阵列.由两块或者多块盘构成这样一个阵列,并且每块盘所存储的内容都是完全一致的.意思就是盘与盘之间互为镜像,而…
Nginx源代码分析-进程间通信机制 从nginx的进程模型能够知道.master进程和worker进程须要通信,nginx中通信的方式有套接字.共享内存.信号.对于master进程,从外部接受信号,master进程主要就是监控.接受外部信号,将有必要的信号传递给worker进程,master进程大部分时间都是堵塞在sigsuspend()函数调用上.Worker进程屏蔽了全部的外部信号,那么Master进程就通过套接字和worker进程通信,worker进程改动全局变量,使得worker进程接…
Raid1的源码的读.写.同步,在本系列博客中都已经分析完成.除了barrier机制要专门拿出来分析(下一篇会写)以外,有一些问题值得思考和注意,分析如下. 1.freeze_array是如何做的? 通过barrier挡住上层用户io请求,并且nr_waiting++计数.nr_pending表示未完成的请求数,nr_queue表示retrylist的r1_bio数量.conf->nr_pending == conf->nr_queued+1表示没有正常的处理请求了,满足这个条件的时候就进行r…
五.Raid1读流程分析 两个月前,刚刚接触raid1,就阅读了raid1读流程的代码,那个时候写了一篇博客.现在回过头看看,那篇的错误很多,并且很多地方没有表述清楚.所以还是决定重新写一篇以更正之前理解的错误和不足之处,与大家分享.博客上不好排版,希望不会对表述产生影响.还有理解上的不足之处,希望批评指正.我阅读的代码的linux内核版本是2.6.32.61. 正确读流程的总体步骤是,raid1接收上层的读bio,申请一个r1_bio结构.然后根据read balance算法选出盘阵中的一块盘…
正确写流程的总体步骤是,raid1接收上层的写bio,申请一个r1_bio结构,将其中的所有bios[]指向该bio.假设盘阵中有N块盘.然后克隆N份上层的bio结构,并分别将每个bios[]指向克隆出来一个bio结构,然后进行相应设置. 对于没有Write Behind模式而言,之后将所有这些bios[](共用页结构)放入队列pending_list中,对内存bitmap置位.接着由守护进程摘取pending_list链中的bio,然后将内存bitmap同步下刷到磁盘,紧接着立即一次性下发bi…
同步的大流程是先读,后写.所以是分两个阶段,sync_request完成第一个阶段,sync_request_write完成第二个阶段.第一个阶段由MD发起(md_do_sync),第二个阶段由守护进程发起. 如果是用户发起的同步请求.该请求下发到raid1层,首先进入同步读函数sync_request.在正常的成员盘中,将所有active可用的盘(rdev->flags中有In_sync标记)设置为read盘,而所有不可用的盘不做设置.对每一个可用盘对应的bios[]都单独申请页结构,对所有的…
这篇博文不足之处较多,重新整理了一下,链接:http://www.cnblogs.com/fangpei/p/3890873.html 我阅读的代码的linux内核版本是2.6.32.61.刚进实验室什么都不懂,处于摸索阶段,近期的任务就是阅读raid1的源码.第一次接触raid相关的东西,网上分析源码的资料又比较少,不详细.逐行阅读代码,做了笔记.如果要对raid1的读流程有个整体上的把握,需要将笔记中的主线提炼出来,这里不写了.理解不足或者有误之处,希望批评指正. 读流程主要涉及以下函数:…
初始化流程代码量比较少,也比较简单.主要是run函数.(我阅读的代码的linux内核版本是2.6.32.61) 四.初始化流程分析 run函数顾名思义,很简单这就是在RAID1开始运行时调用,进行一些初始化的操作.主要是对RAID1中的conf进行初始化.run函数在md.c的do_md_run中被调用.   run函数的具体流程 0.传入参数mddev就是指RAID1所处的MD设备. 1.  定义相关变量. 1.1  定义conf指针,类型为raid1_private_data_s,是raid…
[转]hostapd源代码分析(二):hostapd的工作机制 原文链接:http://blog.csdn.net/qq_21949217/article/details/46004433 在我的上一篇文章<hostapd源代码分析(一):网络接口和BSS的初始化>中,介绍了两个重要的数据结构hostapd_iface和hostapd_data以及网络接口和BSS的初始化设置的过程.下面,我要在这一篇文章中详细介绍hostapd的工作机制.hostapd的模块结构如下 从上图中可以看出,hos…