gpt4 book ai didi

linux-kernel - Linux CFS 志愿者上下文切换 SCHED_OTHER SCHED_FIFO

转载 作者:行者123 更新时间:2023-12-02 15:36:56 24 4
gpt4 key购买 nike

我正在为我的操作系统类做一些 Linux CFS 分析,并且有一个我无法解释的观察结果。

对于两个在其他方面完全相同的进程,当它们使用 SCHED_OTHER 策略执行时,与使用 SCHED_FIFO 或 SCHED_RR 策略执行它们时相比,我发现自愿上下文切换大约多 50%。

对于非自愿 切换,这不会让我感到惊讶,因为 SCHED_OTHER 的优先级要低得多,所以它必须放弃 CPU。但为什么自愿开关会出现这种情况。为什么 SCHED_OTHER 会比实时进程更频繁地自愿放弃 CPU?这是一个相同的过程,所以它只是在切换到 I/O 时自愿放弃 CPU,对吗?而且我认为策略的选择不会影响 I/O 尝试的频率。

任何 Linux 人有想法吗?谢谢!

最佳答案

首先了解调度策略只不过是在内核中实现的调度算法。所以SCHED_FIFO、SCHED_RR、SCHED_OTHER是内核中不同的算法。 SCHED_FIFO 和 SCHED_RR 属于实时调度算法“类”。 SCHED_OTHER 只不过是系统中正常进程的调度算法,更通俗地称为 CFS(Completely Fair Scheduler)算法。

SCHED_OTHER has a much lower priority

准确地说,它的优先级并没有“低很多”,而是比实时调度类低“一个”。 Linux Scheduler中共有三个调度类——Real-Time调度类、Normal Process调度类和Idle Tasks调度类。优先级如下:

  1. 实时调度类(class)。
  2. 普通任务调度类。
  3. 空闲任务调度类。

系统上的任务属于这些类别之一。 (请注意,在任何时间点,一项任务只能属于一个调度类,尽管它的类可以更改)。 Linux中的调度器首先检查实时类中是否有任务。如果有的话,它会调用 SCHED_FIFO 或 SCHED_RR 算法,具体取决于系统上的配置。如果没有实时任务,则调度程序检查正常任务并根据是否有任何正常任务准备运行来调用 CFS 算法。还有

回到主要问题,当您在两个不同的调度类中运行相同的进程时,为什么会看到更多的上下文切换。有两种情况:

  1. 一般在一个简单的系统上,几乎没有实时任务,大部分任务属于普通任务类。因此,当您在实时类中运行该进程时,您将独占该进程的所有处理器(因为实时调度类比普通任务调度类具有更高的优先级,并且没有(/很少有实时)时间共享 CPU 的任务)。当您在普通任务类中运行相同的进程时,该进程必须与其他各种进程共享处理器,从而导致更多的上下文切换。
  2. 即使系统中有许多实时任务,所讨论的实时调度算法(FIFO 和 RR)的性质也会导致较低的上下文切换。在 FIFO 中,处理器在当前任务完成之前不会切换到其他任务,而在 RR 中,有一个固定的时间间隔(时间份额)提供给进程。当你看 CFS 时,进程获得的时间片与处理器运行队列中的任务数成正比。它是其权重和处理器运行队列总权重的函数。我假设您已经精通 FIFO 和 RR,因为您正在上操作系统类(class)。有关 CFS 的更多信息,我会建议您使用谷歌搜索,或者如果您足够勇敢,请查看其源代码。

希望答案是完整的:)

关于linux-kernel - Linux CFS 志愿者上下文切换 SCHED_OTHER SCHED_FIFO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15670460/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com