linux对块设备请求的处理是一种层次体系结构,可以分为5层:
1.vfs:这层对所有文件系统的一种封装
2.mapping layer:这层用来定位数据的物理位置
这个操作分为2步:
a.首先确定包含文件的文件系统的block size,然后计算请求的数据包含多少file block。
b.调用跟文件系统有关的函数来访问文件的inode,确定请求的数据在磁盘上的逻辑块地址,事实上磁盘被看成由一个一个的block组成,所以kernel需要确定请求数据的起始块号,这层跟下层的区别在于这层看不到sector结构,只看到block结构
3.generic block layer:
这层有个核心的数据结构bio,它代表一次i/o操作,读取连续的磁盘扇区,如果请求的数据不是连续的,那么需要发送多个bio结构,也就是多次i/o操作。这层将block转到对应的sector。
4.i/o scheduler layer:
这层负责将i/o操作进行排序,采用某种算法来高效地处理操作,下面将进行详细阐述
5.block device driver:
这层实现真正的数据传输,通过发送命令给磁盘控制器
I/O scheduler负责处理对物理设备的操作调度,采用的是电梯调度算法。但是为了满足其它的需求。linux提供四种调度策略:
1.the noop elevator:
这种策略没有order队列,只有一个dispatch队列,每来一个操作请求就将其放在dispatch队列的最后。
2.the cfq(complete fairness queueing) elevator:
这种策略核心是一个hashtable,它将到来的操作请求按所属进程组的id,散列到hashtable中,hashtable的每个项可以看做是一个队列,调度的时候按照round-robin的方式进行,一个队列一个队列进行处理。
3.the deadline elevator:
这种策略有四个order队列,其中的两个包括read和write队列,另外两个是deadline队列,也分为read和write两种。当一个操作被长时间搁置时,就会将其加入到deadline队列中去,调度的时候先调度deadline队列,再调度普通队列。read操作请求的过期时间比write操作请求的过期时间(expire time)要短,因为read操作经常会阻塞进程。
4.the anticipatory elevator:
这种队列跟第3种队列差不多,只是设计的时候更sophisticated,比方说当elevator连续接到一个进程2次I/O请求,那么elevator会假设该进程会发第3次请求,因此它会停止调度一段时间等进程发出第3次调用,这些假设都是基于进程的一些统计信息的
阅读(972) | 评论(0) | 转发(0) |