0

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 块之后)

我不明白的另一件事是,由于一个请求可以有多个要读取的块,所以在其中进行了什么样的调度?FCFS?还是它订购积木?

例如,假设我们有一个包含以下要读取的块列表的请求:

[1,23,5,76,3]

算法将如何处理这个问题?

通过 FCFS:

[1,23,5,76,3]

或通过对块进行排序:

[1,3,4,23,76]

也许我不理解算法,找不到足够的文档。如果有人有更详细解释的论文链接,请参考我。

4

1 回答 1

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毫秒,以等待进程发出更多 I/O。这允许预期,并在进程发出突发 I/O 时提高公平性;但总的来说,它会降低性能。

于 2013-06-03T11:48:14.770 回答