FreeBSD调度器和Linux调度器有哪些区别?
有几种可用调度程序。本答案假设使用默认调度程序:CFS(Linux)和ULE(FreeBSD)。
CFS是“完全公平调度程序”的缩写。最显著的区别在于,CFS不基于运行队列进行进程选择。相反,它使用一个由CPU时间花费为索引的具有O(log N)复杂度的红黑树。
另一个值得注意的细节是,CFS使用纳秒进行时间核算。来自Kernel Trap:
CFS使用纳秒粒度核算,不依赖任何jiffies或其他HZ细节。因此,CFS调度程序没有“时间片”概念,也没有任何启发式。只有一个中央可调整项:
/proc/sys/kernel/sched_granularity_ns
该设置可用于从“桌面”(低延迟)调整到“服务器”(良好的批处理)工作负载来优化调度程序。默认情况下,它适用于桌面工作负载。SCHED_BATCH也由CFS调度程序模块处理。
ULE是传统BSD调度程序的继承者。它在SMP系统和单处理器系统上都提供了大大改进的性能。它遵循更传统的设计,具有运行队列和时间片。它力求公平,但可以被指示支持交互式进程。
这里是ULE作者在研究CFS源代码时发现的一些结果链接。他们还在评论中讨论了CFS调度程序算法的复杂性(经过激烈辩论)。
两个调度程序都适用于桌面使用。设置
kern.sched.interact
后,ULE会优先考虑交互式进程。没有这个设置,CFS和ULE应该同样公平。ULE大约有3000行代码,而CFS则接近其两倍。