在完全公平调度下,时间片是否取决于进程优先级?

在完全公平调度下,时间片是否取决于进程优先级?

我试图理解完全公平调度程序(CFS)。根据罗伯特·洛夫 (Robert Love) 在Linux内核开发,第三版(斜体是他的,粗体是我的):

CFS 不是为每个进程分配一个时间片,而是根据可运行进程总数来计算进程应运行的时间。 CFS 不使用 Nice 值来计算时间片,而是使用 Nice 值来衡量进程要接收的处理器比例:较高值(较低优先级)的进程接收相对于默认 Nice 值的分数权重,而较低值(更高优先级)进程获得更大的权重。

然后,每个进程运行一个“时间片”,该时间片与其权重除以所有可运行线程的总权重成正比。为了计算实际的时间片,CFS 为其近似完美多任务处理中的“无限小”调度持续时间设置了一个目标。这个目标称为目标延迟...假设目标延迟为 20 毫秒,并且我们有两个具有相同优先级的可运行任务。无论这些任务的优先级如何,每个进程都会运行 10 毫秒,然后再抢占另一个进程。如果我们有四个相同优先级的任务,每个任务将运行 5 毫秒。如果有 20 个任务,每个任务将运行 1 毫秒......

现在,让我们再次考虑两个可运行进程的情况,除了具有不同的 Nice 值之外,例如,一个具有默认的 Nice 值(零),另一个具有良好的值 5。这些 Nice 值具有不同的权重,因此我们的两个进程收到处理器时间的不同比例。在这种情况下,权重对于 Nice-5 进程来说大约是 1/3 的惩罚。如果我们的目标延迟再次为 20 毫秒,则我们的两个进程将分别接收 15 毫秒和 5 毫秒的处理器时间。

第一个粗体句子表示任务具有相同的时间片,无论优先级如何,而第二个句子表示时间片取决于好的值。哪个是正确的,或者我错过了什么?

答案1

这 2 句话只是解释了 CFS 如何工作的 2 个实例 - 前者是当 2 个任务具有相同的 Nice 值时,后者是当 2 个任务具有不同的 Nice 值时。一般来说,为每个任务计算的时间片可以归结为以下公式:

timeslice = (weight/total_weight)*target_latency

weight是当前任务的权重,取决于分配给该任务的nice值。

total_weight是运行队列中所有任务的权重之和。

target_latency是 CFS 将尝试一次调度运行队列中的所有任务的时间间隔。

回到原来的公式,当两个任务具有相同的nice值时,它们也将具有相同的weight值。通过将其weight视为常数,我们的新公式是:

timeslice = (target_latency/total_weight)

如您所见,运行队列中每个任务的时间片不再依赖于其weight值,因此每个任务将接收相同的时间片。这是书中提到的第一个案例。

第二种情况提到了nice值不同,因此weight值也会不同。每个任务都会相应地收到其时间片。

相关内容