CFQ调度算法

时间:2013-05-19 18:34:13

标签: scheduling hard-drive

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]

算法如何处理这个?

:FCFS:

[1,23,5,76,3]

或通过对块进行排序:

[1,3,4,23,76]

也许我对算法不了解,找不到足够的文档。如果有人有链接或纸张更详细的解释,请转介我。

1 个答案:

答案 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时的公平性;但总的来说它减少了   性能