操作系统调度算法(详解)

调度类型:

  1. 长程调度:决定加入到待执行的进程池当中
  2. 中程调度:决定加入到哪一部分或全部在主存中进程的集合中
  3. 短程调度:决定哪一个可用进程将被处理器执行
  4. I/O调度:决定哪一个进程挂起的I/O请求将被可用的I/O设备处理

调度策略:

 

w:花费等待的时间

e:到现在为止执行所用的时间

s:进程所需要的总的服务时间

决策模式:(选择函数在执行的瞬间处理方式)

抢占:当前运行的进程可能被操作系统中断,并转移到就绪态。关于抢占的策略可能是在一个新进程到达时,或者在一个中断发生后把一个被阻塞的进程置于就绪态时,或者基于周期性的中断。

非抢占:在这种情况下,一旦进程处于运行态,他就不断执行直到终止,或者在为等待I/O或者请求某些系统服务而阻塞自己

FCFS:(先来先到服务)

     最简单的策略时先来先服务或者严格排队方案。当每一个进程就绪后,它就加入就绪队列。当当前正在运行的程序终止时,选择在就绪队列中等待时间最长的进程运行。

      FCFS执行长进程比执行段进程更好,例如

FCFS的难点:

  • 无法协调受处理器限制的程序和受I/O限制的程序
  • 导致处理器资源浪费

轮转:(时间片)(RR)

    为了减少在FCFS中段作业不利的情况下,一种简单的办法就是采用基于时钟的抢占策略,最简单的就是轮转法。以一个周期性间隔产生中断,当中断发生的时,当前正在运行的程序被置于就绪队列当中,然后在基于FCFS策略选择下一个就绪作业运行。这种技术也称为时间片

优点:在处理分时系统和事务处理系统中都特别有效

缺点:受处理限制的进程和受I/O限制的进程的相对进程,通常,受I/O限制的进程要比受处理器限制的进程在使用处理器的时间上短。

因此,受处理器受限制的进程通常倾向于不公平的使用大部分处理时间,从而导致I/O限制的进程性能降低,使I/O设备低效,相应时间的变化大。

虚轮转法:

      新进程到达并加入就绪队列,是基于FCFS管理的。当一个为I/O而被阻塞时,他加入到一个I/O队列,它的新特点是阻塞的I/O进程被转移到一个FCFS辅助队列当中。当进行一次调度决策时,辅助队列中的进程优先于就绪队列中的进程。

最短进程优先:(SPN)

      减少FCFS固有的对长进程的偏向的另一种方法是最短进程优先。这是非抢占策略,其原则就是下一次选择所需要处理时间最短的进程,因此短进程会越过长作业,跳到队列头。

      SPN的难点在与需要知道或至少要估计每一个进程所需要处理的时间。对于批处理作业,系统要求程序员估计该值,并提供给操作系统。

      缺点:SPN的风险在于只要持续不断地提供更短的进程,长进程就有可能饿死。另一方面,尽管SPN增加了对长作业的偏向,但由于缺少抢占机制,它对分时系统或事务处理系统人仍然不理想

最短时间剩余:(SRT)

相对于SPN增加了抢占机制。

最高响应比优先:(HRRN)

使用归一化周转时间,他是周转时间与实际服务时间之间的比率,可作为质量因子

R= (W+S)/S

R:相应比

W:等待处理器的时间

S:期待的服务时间

因此调度规则如下:在当前进程完成或被阻塞时,选择R值最大的就绪进程。该方法非常具有吸引力,因为它说明了进程的年龄。当偏向短作业时(因为小分母产生大比值),长进程由于得不到服务的时间不断地增加,从而增大了比值,最终在竞争中战胜了短进程。

和SRT和SRN一样,使用最高相应比策略需要估计期待服务时间

反馈:

  如果没有关于各个进程的相对长度的任何信息,则SNR SRT HNNR都不能使用。

  方法如下。调度基于抢占原则并且使用动态优先机制。当一个进程第一次进入系统时,他被放置在RQ0。当它第一次被抢占后并返回就绪状态时,他被放置在RQ1。在随后的时间里,每当他被抢占时,他被降级到下一个低优先级队列当中。

缺点:如果频繁的有新作业进入系统,也有可能出现饿死的情况。为了补偿这一点可以按照队列改变抢占次数,RQ0中调度的进程允许执行一个时间单位,RQ1运行执行2个时间单位,即使较低的优先级分配较长的时间,长进程仍然可能饿死。唯一补救的方法就是当一个进程在它当前的队列中等待服务的时间超过一定的时间量之后,把它提升到一个优先级较高的队列当中。

公平共享调度

到目前为止我们是将所有的调度算法都时把就绪的进程的集合看作单一的进程池,从该进程池当中选择一个要运行的进程。进程池也按优先级划分成几个,但它们都是同构的,可以保证不影响其他进程组。

Linux内核进程调度算法

优先级:

  普通优先级:100~139

  实时优先级:0~99

活动队列:

  • 时间片还没有结束的所有进程都按照优先级放在队列当中
  • nr_active:总共有多少运行的进程
  • queue[140]:一个元素就是一个队列,相同优先级的进程按照FIFO(先进先出)规则排队调查,所以数组下表就是优先级!
  •  
  1. 从0开始遍历queue[140]
  2. 找到第一个非空队列该队列必定为优先级最高的队列
  3. 拿到队列中的第一个进程,开始运行,调度完成
  4. 遍历queue[140]时间复杂度为常数,但还是太低效     
  • int bitmap[5]:一共140个优先级,一共140个进程队列,为了提高查找非空队列的效率,就可以用5*32个比特位表示队列是否为空,大大调高了查找效率!

过期队列:

  • 过期队列和活动队列结构一模一样
  • 国企队列上放置的进程都是时间片耗尽的进程
  • 当活动队列上的进程都被处理完毕之后,对过期队列进行时间片重新计算

active指针和expired指针

  • active指针永远指向活动队
  • expired指针永远指向过期队列 
  • 可是活动队列上的进程会越来越少,过期队列上的进程会越来越多,因为进程时间片到期时一直都存在 的
  • 没关系,在合适的时候,只要能够交换active指针和expired指针的内容,就相当于有具有了一批新的活动队列

 

 

 

 

 

 

 

 

  • 6
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值