最新Linux内核度器的实现 一
1.调度器概览:
对于程序而言,在多任务并发执行过程中,任务之间必须公平地共享CPU的时间,而同时有要考虑不同任务的优先级。任务必须完成两个部分的工作:一个是调度策略,即CPU在不同任务之间切换的时机选择原则(在Linux中通过进程数据结构task_struct 的policy来描述该任务的调度策略),另一个是任务的上下文切换。通过对特定于处理器的底层操作完成换出任务相关细节的保存工作和换入任务相关细节的载入工作(在Linux中上下文切换通过调用两个特定于CPU的函数完成,swith_mm更换对task_struct->mm描述的内存管理上下文。switch_to切换CPU寄存器内容和内核栈)完成。
2.Linux中调度器的实现:
Linux调度器的一个杰出特性是它不需要时间片的概念。经典的调度器对系统中的进程分别计算时间片,是进程运行直至时间片用尽。在所有进程时间片用尽,则需要重新计算时间片。调度器的一般原则是,按分配的计算能力,向系统中每一个进程提供最大的公正性。
操作系统通过各个进程的高频率来回切换实现多任务,那么当前运行的进程待遇要好于那些等待的进程,等待的进程受到了不公平的对待,不公平性正比于等待时间。调度器每次挑选具有最高等待时间的进程,不CPU提供给该进程,那么不公平性就不会累积,均匀地分到所有进程,也就公平了。
现在我们来看看Linux是如何来完成这项工作的:每一个CPU都有且仅有一个称为按等待时间的长短排序,通过红黑树方式组织在一起,所有的进程组织成一个排序好的就续队列。对于红黑树来说,等待cpu最长的进程放在最左侧项,调度器下一次会考虑该进程。除了红黑树之外,就绪队列还装备了虚拟时钟。所有进程CPU虚拟时钟总和等于实际占用CPU的时间。
好晚了,今天先写到这里,明天继续...
浙公网安备 33010602011771号