调度器的实现

   内存中保存了对每个进程的唯一描述,并通过若干结构与其他进程连接起来。调度器面对的情形就是这样,其任务是在程序之间共享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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值