has*_*ste 13
有几种调度程序可用.这个答案假设默认的调度程序:CFS(Linux)和ULE(FreeBSD).
CFS是Completely Fair Scheduler的缩写.最显着的区别是CFS不基于进程选择的运行队列.相反,它使用一个红黑树,其O(log N)复杂度由CPU花费的时间索引.
另一个值得注意的细节是CFS在其时间计算中使用纳秒.来自内核陷阱:
CFS使用纳秒粒度计算,不依赖于任何jiffies或其他HZ细节.因此,CFS调度程序没有"timeslices"的概念,也没有任何启发式方法.只有一个中央可调:
Run Code Online (Sandbox Code Playgroud)/proc/sys/kernel/sched_granularity_ns可用于将调度程序从"桌面"(低延迟)调整为"服务器"(良好的批处理)工作负载.它默认为适合桌面工作负载的设置.SCHED_BATCH也由CFS调度程序模块处理.
ULE是传统BSD调度程序的后继者.它在SMP系统和单处理器系统上提供了大大改进的性能.它遵循更传统的设计,包括运行队列和时间片.它力求公平,但可以指示支持互动过程.
这里是ULE作者在研究CFS源代码时的一些发现的链接.他们还在评论中讨论了CFS调度程序中算法的复杂性(已经过多次辩论).
两种调度程序都适合桌面使用.通过kern.sched.interactset,ULE支持交互式流程.没有它,CFS和ULE应该同样公平.
ULE落后大约3000行代码,而CFS正在接近其中的两倍.