CFQ算法使用一组有序的队列,这些队列基于发出请求的进程的I / O优先级。这意味着有一个优先级处理队列,比如1,优先级为2的另一个队列等等。
我理解该算法从每个队列获取第一个请求,对它们进行排序(以避免不必要的头部移动)并将它们放入调度队列以进行处理。但是,由于单个请求可以有许多块可供读取(不一定是连续的),这种可能性如何?我的意思是,如果我有:
Request1 = [1,2,345,6,423]
和
Request2 = [3,4,2344,664]
是[a,b,c]块a,b和c的列表,请求1和2如何放入调度队列?如您所见,它们具有非空交集(例如,块6位于块3和4之后)
我还没有得到的另一件事是,因为请求可以有多个块来读取,在它内部进行了什么样的调度?先来先服务?还是订购了这些街区?
例如,假设我们有一个包含以下要读取的块列表的请求:
[1,23,5,76,3]
算法如何处理这个?
[1,23,5,76,3]
或通过对块进行排序:
[1,3,4,23,76]
也许我对算法不了解,找不到足够的文档。如果有人有链接或纸张更详细的解释,请转介我。
答案 0 :(得分:0)
我理解,CFQ不会安排单个跟踪请求,而是为多个请求安排时间片。 引自IA64wiki:
CFQ调度程序旨在公平地分配磁盘时间 竞争访问磁盘的进程。另外,它使用 预期和最后期限,以提高绩效,并尝试 约束延迟。
每个发出I / O的进程都会得到一个时间片 对同步请求的独占访问。时间片是有界的 通过两个参数:
slice_sync
根据进程的I / O优先级进行调整 给出每个切片的长度(以毫秒为单位);并且quantum
给出了 可以发出的请求数量。所有进程共享一组17个异步I / O队列,一个用于 每个有效的I / O优先级。每个队列都基于获得时间片
slice_async
按优先级调整),并处理队列 循环。在每个切片中,请求被合并(正面和背面),和 根据SCAN发布,追溯到
back_seek_max
允许,但被back_seek_penalty
与前锋相比有偏见 寻找。对于进程,CFQ将在切片内等待slice_idle
ms 发出更多I / O.这允许预期,并且也改善 当一个进程发出突发性I / O时的公平性;但总的来说它减少了 性能