EEVDF:Linux 如何判断哪个任务“最该先用 CPU”?

TL;DR

EEVDF 是 Linux 调度器的一种公平调度思路:先判断任务是否获得了应有份额,再按虚拟截止时间安排运行机会。本文用共享厨房的比喻,解释它如何兼顾长期公平与短期响应,并澄清它并非硬实时保证。

EEVDF 是 Linux 调度器的一种公平调度思路:先判断任务是否获得了应有份额,再按虚拟截止时间安排运行机会。本文用共享厨房的比喻,解释它如何兼顾长期公平与短期响应,并澄清它并非硬实时保证。

EEVDF:Linux 如何判断哪个任务“最该先用 CPU”?

想象一台电脑里有几十个程序都在等着使用 CPU:浏览器想响应点击,音频播放器怕断音,后台任务则希望尽快跑完。操作系统每隔很短时间就要决定“下一小段时间轮到谁”。EEVDF 是 Linux 调度器采用的一种公平调度思路,它试图同时回答两个问题:谁长期得到的 CPU 时间偏少?谁眼下最需要尽快获得一次运行机会?

EEVDF 的全称是 Earliest Eligible Virtual Deadline First,可译作“最早合格虚拟截止时间优先”。它不是按现实世界的钟表给进程排一个硬期限,而是在公平份额的基础上,为任务计算虚拟时间与虚拟截止时间。虚拟时间可以理解为一把经过校准的尺:任务实际运行越多,刻度前进越快;权重较高的任务则相当于用不同速度计量。这样,调度器就能比较不同任务相对其应得份额究竟是“超前”还是“落后”。

这里的“合格”很关键。若某任务此前拿到的 CPU 少于它按权重应得的份额,它就处于合格状态;一个已经明显超前的任务,不会仅仅因为自己的截止时间看起来靠前,就一直抢占别人。调度器先筛出合格任务,再在其中选择虚拟截止时间较早的任务运行。运行一段后,它会重新计算状态,做下一次选择。

为什么还要有截止时间?单纯追求长期平均公平,不一定能让交互操作及时得到响应。虚拟截止时间给每个任务的运行机会排出相对次序,搭配运行片段长度等因素,能在公平与响应性之间做更细的安排。延迟敏感的工作可以申请较短的运行片段,尽早得到一次服务;这不等于它能无限占用处理器,公平性约束仍在起作用。

可以把它想成共享厨房:每位厨师按约定拥有不同份额的灶台时间,系统会照顾排队较久、实际用时不足的人,同时把下一轮机会交给虚拟排期靠前者。它比“谁先来谁一直做”复杂一些,但也更能兼顾长期份额与短期响应。

需要注意,EEVDF 不是实时系统中的硬截止期调度器。它不能保证某个普通应用必定在指定毫秒前完成,也不意味着所有桌面操作都会变得更快。最终体验仍受 CPU 负载、任务优先级、内核配置和程序自身行为影响。它解决的是通用调度器如何公平分配处理器时间的问题,而不是把每个任务变成有硬时限的实时任务。

简而言之,EEVDF 的重点是“先看谁有资格,再看谁的虚拟截止时间更早”。这让调度器有机会在长时间公平与短时间响应之间更灵活地折中。想继续深入,可以从 Linux 内核文档对虚拟运行时间、lag 和 eligible 队列的说明入手。

来源:Linux 内核文档:EEVDF Scheduler

KEEP READING