在linux系统中,单处理器也是多线程处理信号、事件等。这就需要一个核心算法来进行进程调度。这个算法就是CFS(Completely Fair Scheduler)。在 LInux Kernel Development 一书中用一句话总结CFS进程调度:
运行rbtree树中最左边叶子节点所代表的那个进程。
在一个自平衡二叉搜索树红黑树rbtree的树节点中,存储了下一个应该运行进程的数据。在这里我们看到了二叉搜索树的完美运用。具体可参见Introduction to Algorithms Page 174~182。
而进程调度的主要入口函数就是schedule()。它定义在文件kernel/sched.c中。
我们先看一个在等待队列中进行进程调度的例子:
其实我们可以这么理解这段代码。现在有一个任务要等待事件到来才能运行,怎么实现呢?就是阻塞加查询。但是这样会使得这段代码独占整个操作系统。为了解决这个问题,就在阻塞查询之中加入了队列和进程调度schedule(),从而不耽误其它线程的执行。
再来看一看schedule()函数的结构:
schedule()函数结构
schedule()函数的目的在于用另一个进程替换当前正在运行的进程。因此,这个函数的主要结果就是设置一个名为next的变量,以便它指向所选中的 代替current的进程的描述符。如果在系统中没有可运行进程的优先级大于current的优先级,那么,结果是next与current一致,没有进程切换发生。
References
[1].UNDERSTANDING THE LINUX KERNEL. Page 276
[2].Linux Kernel Development. Page 52
[3].http://hi.baidu.com/zengzhaonong/item/20d9e8207b04cb8f6e2cc323