由“通用块层与bio”我们知道,一次io操作就是一个bio结构,虽然我们的块设备驱动程序完全可以一次处理一个bio请求来执行一次io操作,但这会导致磁盘性能的下降,因为确定bio在磁盘上的起始扇区是很费时的,取而代之的是只要可能,内核就试图把几个相邻扇区的bio合并在一起,这样只用一次寻址。因此引入了一个新的结构request,我们将在后面对该结构进行分析。
当我们要读写一些磁盘数据时,实际上创建一个bio请求,本质上说bio描述的是所请求的扇区以及要对它执行的类型。然而并不是请求一发出就立刻执行——io操作仅仅被调度,执行会向后推迟。这种延迟有利于io合并,是提高块设备性能的关键,当请求传送一个新的数据块时,内核检查能否通过扩展前面处于等待的请求而满足新的请求。
请求描述符request
每个块设备的待处理请求都是用一个请求描述符request来表示的,request结构如下(只列出了较为重要的项):
struct request {
union {
struct list_head queuelist; //请求队列链表的指针,将在同一请求队列的request链接在一起
struct llist_node ll_list;
};
struct request