我正在努力理解完全公平的日程安排(CFS)。根据Robert在Linux内核开发,第三版(斜体他的,大胆的地雷):
CFS不为每个进程分配时间间隔,而是根据可运行进程的总数计算一个进程应该运行多长时间。CFS没有使用尼斯值来计算时间间隔,而是使用尼斯值来加权进程要接收的处理器的比例:高值(低优先级)进程相对于默认的尼斯值接收分数权重,而低值(高优先级)进程获得更大的权重。然后,每个进程运行一个与其重量成比例的“时间间隔”,除以所有可运行线程的总重量。为了计算实际的时间间隔,CFS为其近似于完美多任务处理中的“无限小”调度时间设置了一个目标。这个目标称为目标延迟.假设目标延迟为20毫秒,我们有两个优先级相同的可运行任务。不管这些任务的优先级如何,每个任务都会运行10毫秒,然后先发制人。如果我们有四个优先级相同的任务,每个任务将运行5毫秒。如果有20个任务,每个任务运行1毫秒.现在,让我们再次考虑两个可运行的进程的情况,除了不同的好值--比如,一个默认的尼斯值(零),一个的好值为5。这些很好的值具有不同的权重,因此我们的两个进程得到了处理器时间的不同比例。在这种情况下,重量计算出约1/3的点球对尼斯-5进程。如果我们的目标延迟再次是20毫秒,我们的两个进程将分别收到15毫秒和5毫秒的处理器时间。
第一个粗体句子表示,无论优先级如何,任务都有相同的时间间隔,而第二个句子则表示时间取决于良好的值。哪个是正确的,还是我错过了什么?
发布于 2021-12-31 03:38:05
这两个句子只是解释了两个CFS如何工作的例子-前者是当2个任务具有相同的好值时,而后者是当两个任务有不同的好值时。通常,为每个任务计算的时间片段归结为以下公式:
timeslice = (weight/total_weight)*target_latencyweight是当前任务的权重,它依赖于分配给任务的很好的值。
total_weight是运行队列中所有任务的权重之和。
target_latency是CFS尝试一次调度运行队列中所有任务的时间间隔。
回到原来的公式,当两个任务具有相同的好值时,它们也将具有相同的weight值。通过将weight视为常数,我们的新公式是:
timeslice = (target_latency/total_weight)正如您所看到的,运行队列中每个任务的时间切片不再依赖于其weight值,因此每个任务将接收相同的时间切片。这是书中提到的第一个案例。
第二个例子提到了nice值的不同,因此weight值会有所不同。每个任务都会相应地收到它的时间片段。
https://unix.stackexchange.com/questions/156708
复制相似问题