6
20
2014
0

文件系统写浅析--博客阅读笔记

博客阅读笔记

http://hi.baidu.com/_kouu/item/4e9db87580328244ef1e53d0

文件读写浅析笔记

1.VFS.

how f_op->read/f_op->write被掉用,见http://hi.baidu.com/_kouu/item/6bfca5cc5d9778d4964452d0

 

2.Disk Caches 磁盘高速缓存

磁盘上数据缓存在内存中,加速读写。一般,read/write只与缓存打交道。

how实现:每个文件的inode内嵌了一个address_space结构,通过inode->i_mapping访问。address_space结构维护了一颗radix树,高速缓存的内存页面就挂在该树上。故磁盘高速缓存与inode相关,打开文件的每一个进程共用一份缓存。

inode刚被载入内存时,对应的radix树为空,随着读写进行,radix树逐渐有了内容。

当需要读写的内容未载入radix树,read/write与底层的“通用块层”发起读请求,将数据读入。

若打开文件指定了O_DIRCET,则绕开磁盘高速缓存,直接与“通用块层”打交道

内核线程pdflush定期将每个inode上的脏页更新到磁盘,同时将radix页面回收。

 

3.Generic Block Layer 通用块层

linux内核把块设备抽象成统一的模型,即由扇区组成的数据空间。扇区是磁盘设备读写的最小单位。

上层的读写请求在通用块层被构造成了一个或多个bio结构

上层的一次请求可能跨多个扇区,形成非连续扇区段。每个扇区段,对应一个bio结构。

接下来拓展讨论内存的组织。上层的一次请求肯能跨扇区,故它页可能跨磁盘高速缓存上的多个页。故一个bio可能对应一组内存页。内存页单独分配,故内存地址可能不连续。块设备访问能一组连续扇区,关于是否能访问不连续的内存地址,这与DMA有关。

块设备一般通过DMA,将开设备上的一组连续扇区的数据拷贝到一组连续的内存页面。这里不扩展了。结论是,支持io-mmu体系,则可以在一次DMA中完成。若不支持,则一个bio在设备驱动程序中被拆分为多个设备请求。

每个bio都会提交到IO调度器中

 

4 I/O SchedulerLayer I/O调度器层

IO调度器要做的是,在完成所有任务的前提下,让磁头尽量少移动,从而提高磁盘读写效率。

在IO调度器中,上层提交的bio构造成request,一个request结构中包含了一组顺序的bio,每一个物理设备对应一个request_queue,里面顺序放着request。

新的bio可能被合并request_queue中已有的request结构中(甚至合并到已有的bio中),也可能生成新的request插入到request_queue对应位置。这取决于IO调度算法。

IO调度器除了重排请求顺序,还可能延迟触发队请求的处理。因为在请求队列有一定数目,才用调度算法,否则,先来先服务

延迟请求是对request_queue的plug/unplug实现的。plug停用,unplug恢复。请求少时request_queue停用,请求到达一定数目或者超市,request_queue才恢复,恢复时,驱动程序提供的回调函数被调用,于是程序开始处理request_queue。

一般来说,read/write系统调用到这里就返回了。

 

5.Device Driver 设备驱动程序

设备驱动层从request_queue中取出请求,操作硬件设别,逐个执行这些请求。

设备驱动程序有权选择IO调度算法。甚至可将IO调度层屏蔽,直接对bio处理。即,IO调度器是内核提供给设备驱动程序的一组方法,使用与否,是否使用,选择权在于设备驱动程序。

Category: 文件系统 | Tags: 文件系统; | Read Count: 1456

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter

Host by is-Programmer.com | Power by Chito 1.3.3 beta | Theme: Aeros 2.0 by TheBuckmaker.com