《进程调度》2.调度算法

在上一篇博文中介绍了linux进程调度的基础内容以及调度的策略,在此篇博文中将继续分析linux相关的调度算法。

 

1、常见的调度算法:

1).先来先去服务(FCFS):

①早就绪的进程排在就绪队列的前面,迟就绪的进程排在就绪队列的后面,只考虑进程进入就绪队列的先后,而不考虑它的下一个CPU周期的长短及其他因素,总是把当前处于就绪队列之首的那个进程调度到运行状态,;

②先来先服务调度算法是一种非抢占式的算法,先进入就绪队列的进程,先分配处理机运行。一旦一个进程占有了处理机,它就一直运行下去,直到该进程完成工作或者因为等待某事件发生而不能继续运行时才释放处理机。

③有利于长作业以及CPU繁忙的作业,不利于短作业以及I/O繁忙的作业。

2).短作业(进程)优先调度算法SJ(P)F

①对预计执行时间短的作业(进程)优先分派处理机,通常后来的短作业不抢先正在执行的作业;

②比FCFS改善平均周转时间和平均带权周转时间,缩短作业的等待时间,提高系统的吞吐量;但是对长作业非常不利,可能长时间得不到执行,不能依据作业的紧迫程度来划分执行的优先级,难以准确估计作业(进程)的执行时间,从而影响调度性能。

3).轮转法:(条件:各种作业近似看作是同时间到达。

①让每个进程在就绪队列中的等待时间与享受服务的时间成正比例(等的越长,分配的时间片越多);

②系统将所有就绪态的进程按照先进先出的原则排成队列,每当执行进程调度时,进程调度程序总是选出就绪队列的首进程,让它在CPU上运行一个时间片的时间。当进程用完分给它的时间片后,调度程序便停止该进程的运行,并把它放入就绪队列的末尾,依次轮转执行。

4).多级反馈队列算法:

①设置多个就绪队列。在系统中设置多个就绪队列,并为每个队列赋予不同的优先级。第一个队列的优先级最高,其余队列的优先级逐个降低。

②每个队列都采用先来先去(FCFS)算法。当新进程进入内存后,首先将它放入第一队列的末尾,按先入先执行FCFS原则等待调度。当轮到该进程执行时,如它能在该时间片内完成,便可撤离系统。否则依次将它放入下一个队列。依次下去,在最低等级的队列中便采取轮询方式运行剩余的所有进程。

③仅当高优先级的队列为空时,才会调度执行下一个优先级队列中的进程执行。当有新的进程进入较高的队列时则抢占执行新进程,将原来的进程放在原队列的末尾,

④提高了系统吞吐量,缩短了平均周转时间而照顾了短进程,获得了较好的I/O设备利用率,缩短了响应时间而照顾了I/O型进程,不必再估计进程的执行时间,动态调节。

而在linux系统中,在2.5版本的内核将内核进程调度的算法进行了大换血,解决了很多的不足,如今采用的是类似于多级反馈对垒算法的CFS调度算法。这是一个典型的抢占式调度系统(linux本身就是一个任务抢占式系统),当一个进程进入可运行状态就会被准许投入运行,在使用CFS调度器之后,这个抢占的时机安全取决于新的可运行的进程消耗的处理器使用比,如果使用比比小于当前进程则立即抢占执行,否则推迟执行。下面将具体的介绍CFS调度器相关的内容。

2、调度器类:

调度器类:在linux中linux调度器以模块形式存在,为不同类型的进程有针对性的选择合适的调度算法进行调度。这种模块化的结构被称为调度器类。

调度器类允许不同的可动态添加的调度算法并存,调度属于自己范畴内的进程,每一个调度器有一个属于自己的优先级。在需要调度的时候,在最底层的基础调度器的实现代码(kernel/sched.c)中会按照优先级遍历调度器,得到这个拥有可执行进程最高优先级的调度器类,决定下一步如何调度进程的运行情况。

 

3、CFS公平调度:

完全公平调度CFS是针对普通进程的调度器类。

调度的实现:进程的调度效果如同系统具备一个理想的完美多任务处理器。

举例来说就是:cpu同时运行两个进程,而两个进程各自使用CPU一半的处理能力。但是实际上这种情况是不存在的,n个需要处理的进程,处理器将平均的分配1/n份处理时间给每一个进程,但同时在进程数足够大的时候,每一个进程平均分配的时间就会接近于很小的值,这就会导致CPU的使用率很低(进程间的切换,抢占会需要很多的资源),这时CFS的做法是:允许每一个进程先运行一段时间,循环轮转,并选择运行时间最少的进程作为下一个进程进程进行处理。注意这里不再采用给每个进程分配时间片的做法,而是根据所有进程需要的时间总和来分配每一个进程运行的时间,nice在这里只是影响进程占有处理器的时间比重,nice越大,优先级越低,获得更低的处理器使用权重。

目标延迟:为了更好的计算每一个进程每次运行的时间,CFS设计了目标延迟用来表示一个完美多任务无限小调度周期。越小的目标延迟将带来更快的响应速度,更好的交互性,但同时也代表着更高的代价与更差的系统吞吐量。

对于nice值的使用理解举例如下:

在linux系统中现在有进程1,nice值为0,进程2nice'值为5,目标延迟为20ms,则进程2的权重是默认nice进程的1/3,则两个进程分别获得15ms、5ms的处理时间。    同样的,现在的nice值分别为10、15时,分析结果相同。可见时间片的分配不受绝对nice值的影响,而是nice的相对值。

总结:CFS完全摒弃时间片而分配给进程以处理器的使用权重,这样保证了进程间调度中恒定的公平性,将进程间切换频率置于不断变动中。任何进程获得处理器的时间由他和其他可运行进程nice之间的差值决定,nice对时间片的作用不再是算术加权而是几何加权。这样就确保了每个进程公平的处理器使用比,降低了调度延迟带来的不公平性。

 

写在最后:此篇博文比较抽象,需要一定的技术底蕴,笔者也是分析很久才完成,若发现错误的地方欢迎指正。同时博文参考了《linux内核设计与实现》这本书中的很多内容,在此鸣谢!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值