unplug

Linux Block子系统——IO调度层

徘徊边缘 提交于 2020-05-09 21:43:14
概述 本文主要来讨论Linux Block子系统中的IO调度层。我们知道应用层发起磁盘数据访问时内核并不会立即将请求下发到磁盘的驱动程序中进行响应,而是做适当的延迟,尝试能否扩展之前请求的磁盘范围来满足该请求。这样做的好处也很明显,以机械硬盘为例,访问不同位置的数据是通过磁头的移动实现的,如果下发给驱动程序的请求是按照磁头移动的方向进行了排序,那么磁盘只需要按照特定的方向连续的访问数据即可响应这些请求,节省了磁头移动定位的时间。对IO请求进行排序和并就是IO调度层的主要工作,由于这种机制很像我们显示生活中的电梯(只朝着一个方向运行),因此IO调度层所使用的算法也被统称为电梯调度算法。 数据结构 IO调度层涉及到的数据结构主要为两种,request表示IO请求,由通用块层的bio初始化或者合并得到;request_queue表示请求队列,包含了对一个块设备的所有request。下面我们来看一下这两种数据结构中主要的成员。 struct request { #ifdef __GENKSYMS__ union { struct list_head queuelist; struct llist_node ll_list; }; #else struct list_head queuelist; #endif union { struct call_single_data csd; RH