大家都知道Linux内核task调度器经历了O(n),O(1)调度器,目前是CFS,期间也出现了几个优秀的候选调度器,但最终都没能并入内核,我们只能从一些零散的patch和文章中知道它们的存在。
但Linux内核的世界乃是非常之宽广,在主线内核之外还有很多支线可供观摩。
本文我来介绍Linux主线内核之外的两个非常有意思的适合桌面使用的task调度器BFS和MuqSS。
Linux内核其实有很多支线分支,其中Linux-CK就是著名的一支:
Con Kolivas的信仰是 万事不能一刀切,没有放之四海而皆准的真理! 所以,他主要关注Linux桌面,他不相信存在one-size-fits-all的调度器,所以他设计了专门适用于桌面交互的BFS。
BFS不是一个普适的task调度器,相反,它仅仅适用于桌面交互的环境。所以,为你的水冷游戏机使用BFS,而不是在携带众核CPU嗡嗡作响的2U服务器上使用它。
MuqSS则是BFS的改进版。MuqSS的全称是 Multiple Queue Skiplist Scheduler。
有必要先介绍一下什么是BFS,然后我们看MuqSS进行了什么改进。
简单来讲,BFS是一种向O(n)算法的回归,Con Kolivas认为:
桌面系统的task数量不会太多。
对于主线内核的调度算法太复杂。
基于这种认知,Con Kolivas设计了BFS。他认为 让一个支持4096个CPU的调度器去调度桌面交互应用的task是错误且可笑的做法 ,下面的BFS宣传漫画说明了这一点:
本文主要概括BFS以及其增强版MuqSS的核心思路而不是实现细节。
关于BFS的细节请参考下面的一篇文章:
https://blog.csdn.net/dog250/article/details/7459533
BFS的核心数据结构非常简单,就是普通双向链表,每次选择task时,该链表会被遍历,具有最小 Virtual Deadline 的task将会被选中。
显然,这个过程的时间复杂度是O(n)。其中, Virtual Deadline 的计算方法如下:
BFS虽然简单,但是两个问题却非常明显:
遍历查找的O(n)问题。
多CPU操作全局链表的锁问题。
众所周知, “O(n)时间复杂度和锁” 在计算机领域一直饱受诟病,它们似难兄难弟一般的存在。BFS却毫不忌讳地同时将它们采纳到自己的核心算法中。
<