调度器的实现

来源:互联网 发布:xp关闭445端口的方法 编辑:程序博客网 时间:2024/06/07 00:40

   内存中保存了对每个进程的唯一描述,并通过若干结构与其他进程连接起来。调度器面对的情形就是这样,其任务是在程序之间共享CPU时间创造并行执行的错觉。该任务分为两个不同的部分:一个涉及调度策略,另一个涉及上下文切换。

1.内核必须提供一种方法,在各个进程之间尽可能的公平的共享CPU时间,而同时又要考虑不同的任务优先级。

  下面是linux内核采用的解决方案。

    Schedule函数是理解=调度操作的起点。它定义在kernel/sched.c中。调度器的实现受若干因素的影响和稍显模糊。

  l 在多处理器系统上,必须注意几个细节,以避免调度器自相干扰。

  l 不仅实现了优先调度,还实现了Posix标准需要的其他两种软实时策略。

  l 使用Goto已生成中最优的汇编语言代码。这些语句在C代码中来回的跳转,与结构化程序设计的所有原理背道而驰。

 

Linux调度器的一个杰出的特性是,它不需要时间片的概念,至少不需要传统的时间片。经典的调度器对系统的进程分别计算时间片,使进程运行直至时间片用尽。在所有的进程的时间片用尽时,需要重新计算。

相比之下,当前的调度器只考虑进程的等待时间,即进程在就绪队列中等待了多少时间。对CPU时间的需求最严格的进程被调度执行。

调度器最一般的原理是,按所能分配的计算能力,向系统中的每个进程提供最大的公平性。它试图确保没有进程被亏待。但就CPU时间而论,公平与否意味着什么?在CPU时间内没有进程处于不活跃的状态。但这在真是硬件显然无法实现。如果系统只有一个CPU,至多可以同时运行一个进程。至于实现多任务,只能通过在各个进程之间高频率来回切换。如果采用轮流运行各个进程来模拟多任务,那么当前运行的进程,显然优于那些等待调度器选择的进程,即等待的进程受到了不公平的对待。不公平的程度正比于等待时间。

  每次调用调度器时,它会挑选具有最高等待时间的进程,把CPU提供个该进程,如果这种情况经常发生,那么进程的不公平待遇不会累积,不公平会均匀分布到系统的所有进程。

可运行的进程必须排队其结构称之为就绪队列。所有的可运行的进程都按时间在一个红黑树中排序,所谓时间即其等待时间。除此之外就绪队列还装备了虚拟时钟。

2.调度器的数据结构和类

Include/linux/sched.h

Kernel/sched.c

Kernel/sched_fair.c

Kernel/sched_rt.c

 

原创粉丝点击