磁盘读写过程总结+debugfs总结

来源:互联网 发布:淘宝助理很卡 编辑:程序博客网 时间:2024/05/22 05:15

本文参考~http://hi.baidu.com/_kouu/item/4e9db87580328244ef1e53d0和http://blog.yufeng.info/archives/751两篇博客,主要是对两篇内容进行总结。



普通磁盘文件的读写流程:

1.VFS:用户下发read或者write操作,然后在VFS层调用f_op->read/f_op->write

2.高速缓存:用于将磁盘的内容缓存在内存中,加速文件的读写,实际上,read,write只跟缓存打交道,只有读的数据不在缓存中,则触发读盘操作,。cache中存储inode节点信息,每个inode都内嵌一个address_space结构,维护一颗radix树,用于磁盘高速缓存的内存页面就挂在这棵树上,inode被载入内存的时候,对应的磁盘高速缓存是空的(radix树上没有页面),随着文件的读写,磁盘上的数据被载入内存,相应的内存页被挂到radix树相应位置。如果文件打开时,指定了O_DIRECT选项选项,则表示绕开磁盘高速缓存,直接与通用块层打交道(我们的测试中,选择指定O_DIRECT选项,避免缓存,为了全面观察读写操作下发的整个流程)

3.通用块层:把块设备看做由若干个扇区组成的数组空间,扇区是磁盘读写的最小单位,通过扇区号可以指定要访问的磁盘扇区。

4.IO调度器层:磁盘是通过磁头来写数据的,磁头在定位扇区的过程中需要做机械移动,相比于电和磁的传递,机械运动是非常慢速的,这也是磁盘慢的主要原因。IO调度器要做的事情就是在完成现有请求的前提下,让磁头尽可能少移动,从而提高磁盘的读写效率。最有名的就是”电梯算法“

。在IO调度器中,上层提交的bio被构造成request结构,一个request中包含一组顺序的bio,而每个物理设备会对应一个request queue,里面顺序存放着相关的request。新的bio可能被合并到request_queue中已有的request结构中,也可能生成新的request结构并插入到request_queue中。除了电梯算法,还有nono算法,也是就没有算法,先来先服务,因为现在很多块设备已经很好支持随机访问(SSD),没有必要使用电梯算法。

io调度器除了改变请求顺序,还可能延迟触发对请求的处理,因为只有当请求队列有一定数目的请求时,”电梯算法“才能发挥其功效,否则极端情况下,它将退化成先来先服务算法。

这种延迟触发请求,是通过plug/unplug来实现的。

5.设备驱动程序:

设备驱动程序要做的事就是从request_queue中取出请求,然后操作硬件设备,逐个去执行这些请求。除了处理请求,设备驱动程序还要选择IO调度算法,因为设备驱动程序是最知道设备属性的,知道用什么样的IO调度算法最合适。甚至于,设备驱动程序可以将IO调度器屏蔽掉,直接对上层bio进行处理。


0 0