CFS什么时候安排新任务?

CFS什么时候安排新任务?

我正在通过阅读“Three Easy Pieces”来学习操作系统,并且我被困在有关完全公平调度程序的章节上(可以阅读这里,p。 8-10)。我知道每个任务的时间片是根据其优度/权重动态计算的,每个任务的运行时间都是通过(也是动态计算的)vruntime 进行跟踪的,并且当上下文切换发生时,当前 vruntime 最低的任务将被选择为预定下一个。

我不明白的是操作系统何时决定进行上下文切换。书中在某个时候指出:

请注意,CFS 使用周期性定时器中断,这意味着它只能以固定的时间间隔做出决策。该中断频繁发生(例如,每 1 毫秒),使 CFS 有机会唤醒并确定当前作业是否已到达其运行末尾。

操作系统如何确定任务运行的结束?是当任务的实际运行时间(由于已调度)已达到其时间片值时吗?或者当它的虚拟运行时间从调度开始达到时间片时?或者操作系统是否会在每次频繁中断时更新任务的 vruntime,并检查是否存在另一个任务的虚拟运行时间较低?

答案1

操作系统如何确定任务运行的结束?

作者对于这一点非常直接。

操作系统是否会在每次频繁中断时更新任务的 vruntime

是的。但为了避免过于频繁地进行昂贵的上下文切换,它通常会让当前任务继续运行。

之前他们给出了 n = 4 个进程运行的示例,并将sched_latency48 毫秒的 a 除以 4,得到每个 max(6, 12) 的时间片等于 12 毫秒。他们解释说:

然后,CFS 调度第一个作业并运行它,直到它使用了 12 毫秒的(虚拟)运行时,然后检查是否有一个具有较低 vruntime 的作业来运行。

因此,十几个调度程序滴答声会发现第一个作业正在运行,并且只有在最后一个滴答声中,CFS 才会将其驱逐以调度另一个作业。

是当任务的实际运行时间(由于已调度)已达到其时间片值时吗?

实际运行时间可能远小于一个周期,例如,如果任务开始运行并立即陷入阻塞 read()。这称为自愿抢占,并且与程序逻辑同步,而不是在异步计时器关闭时发生。所以读取会排队,并且然后vruntime调度程序确实会寻找接下来要运行的低任务。但是,当中断触发时,将检查当前正在运行的任务,并且通常允许其继续运行。

相关内容