Linux块设备驱动与I/O调度算法详解
1. 块设备驱动的解阻塞与请求处理
在Linux系统中,块设备驱动的工作流程涉及到多个关键步骤。当需要解阻塞块设备时,会有一个内核线程执行 q->unplug_work 数据结构中存储地址对应的函数,即 blk_unplug_work() 函数。该函数又会调用请求队列的 q->unplug_fn 方法,通常由 generic_unplug_device() 函数实现。
generic_unplug_device() 函数负责解阻塞块设备,其具体步骤如下:
1. 检查队列是否仍处于活动状态。
2. 调用 blk_remove_plug() 函数。
3. 执行策略例程( request_fn 方法),开始处理队列中的下一个请求。
2. I/O调度算法概述
当新请求添加到请求队列时,通用块层会调用I/O调度器来确定新元素在队列中的准确位置。I/O调度器的目标是按扇区对请求队列进行排序,这样可以减少磁盘寻道次数,提高磁盘性能。因为按顺序处理请求时,磁盘头可以线性移动,而不是随机跳跃。这种调度方式类似于电梯处理不同楼层请求的算法,因此I/O调度器也被称为电梯调度器。
在高负载情况下,严格按照扇区编号顺序的I/O调度算法效果不佳。因为数据传输的完成时间很大程度上取决于数据在磁盘上的物理位置。如果设备驱动正在处理队列头部的请求,而新的低扇区编号请求不断添加到队列
超级会员免费看
订阅专栏 解锁全文
601

被折叠的 条评论
为什么被折叠?



