进程管理笔记二、进程调度概念及基本策略

进程调度概念及基本策略

引言:多进程并发是逻辑并发,在单个CPU上,实际上任意时刻只能有一个进程处于执行状态,而其它进程处于非执行状态。那么进程是如何调度的呢?本篇笔记将依次介绍进程调度概念、调度目标、调度算法、算法评估。下一篇笔记将重点介绍CFS调度算法。

    • 进程调度概念及基本策略
      • 一、进程调度概念
        • 1.1、调度概念由来
        • 1.2、基本概念
        • 1.3、适用情形
      • 二、调度准则
        • 2.1、CPU执行模式
        • 2.2、调度考量
        • 2.3、调度目标
      • 三、调度算法
        • 3.1、先来先服务FCFS(First Come First Serve)
        • 3.2、最短任务优先STCF(Shorted Time Complention First)
        • 3.3、优先级调度算法PB(Priority based)
        • 3.4、轮转法调度RR (Round - Robin)
        • 3.5、多级队列调度
        • 3.6、多级反馈队列调度
        • 3.7、实时调度算法
      • 四、算法评估方式
      • 小结


一、进程调度概念

1.1、调度概念由来

  在多进程并发的环境中,虽然概念上多个进程在同时执行,但是在单个CPU下,实际上任意时刻只能有一个进程处于执行状态。而其他进程则处于非执行状态。那么这就有一个问题需要解决:我们是如何确定在任意时刻到底由哪个进程执行,哪些不执行呢?

1.2、基本概念

  进程的调度是操作系统进程管理的一个重要组成部分。其任务是选择下一个将要运行的进程。即在CPU变为空闲时(如占用CPU的进程执行IO操作),操作系统拿走其CPU控制权,从其他就绪队列中,选择一个进程来执行。

1.3、适用情形

  • 1)、当一个进程从运行状态切换到等待状态
  • 2)、当一个进程从运行状态切换到就绪状态
  • 3)、当一个进程从等待状态切换到就绪状态
  • 4)、当一个进程终止时

  当调度只能发生1和4两种情况,是进程主动让出CPU控制权,此时称调度方案为非抢占式调度。第2、3种情况,称为抢占式调度。

第二种情况中,进程由执行态 直接转换为就绪态,说明其被强行剥夺了CPU使用权,第三种情况中,进程刚进入就绪态,就要执行,是要抢占CPU。


二、调度准则

2.1、CPU执行模式

  一般来说,程序使用CPU的模式有三种:

  • 1)、CPU密集型程序(CPU - bound),这种模式是在CPU上面运行很长时间,接着进行短暂的输入,这样循环往复。这种程序通常用于科学计算,如矩阵乘法等。
  • 2)、IO密集型程序(IO - bound)与第一种相反,这种程序大部分时间都用来I/O,每次I/O后进行短暂的CPU执行,这种程序多用于人机交互类。
  • 3)、平衡型程序介于两者之间,既有长时间的CPU执行部分,又有长时间的I/O部分。或者说程序使用CPU和I/O的时间相差不大。

2.2、调度考量

  • 1)、CPU使用率:使CPU尽可能忙,使用率介于40% - 90%,过低会增加企业成本,过高可能存在隐患,降低服务质量。
  • 2)、吞吐量:一个单位时间内所完成的进程数量。
  • 3)、周转时间:从进程提交至进程完成的时间间隔,包含等待进入内存时间、在就绪队列中等待时间、CPU上面执行的时间、I/O执行的时间。
  • 4)、响应时间:从提交请求到产生第一响应(并非输出结果)的时间。

2.3、调度目标

  自然,对于不同性质的程序,调度所要达到的目的也就有所不同。例如,对于I/O密集型的程序来说,响应时间就比较重要。对于CPU密集型程序来说,周转时间就比较重要。但是通常调度追求的目标可以概括如下最大化CPU利用率、最大化吞吐量、最小化周转时间 、最小化响应时间。


三、调度算法

  计算机科学在发展进步,调度算法会不断发展变化,以期在众多矛盾的目标中,寻求最佳平衡点。本篇介绍的调度算法,基本上已经被淘汰不用了,但是学习这些可以帮助我们理解算法的演进过程,所谓知其然,知其所以然。

3.1、先来先服务FCFS(First Come First Serve)

  先来先服务是人的本性中的一个公平观念,而且在生活中这种规则也随处可见。其优点是易于理解,易于实现(通过先进先出队列实现)。缺点是不能抢占(破坏先来先到原则),不利于分时系统;等待和响应时间变化较大;

  假定有三个进程P1、P2、P3,区间时间分别为24、3、3。其到达顺序不同会造成不同的等待和响应时间,如下图所示:

进程管理笔记二、进程调度概念及基本策略_第1张图片
图1、FCFS等待和响应变化时间不定

3.2、最短任务优先STCF(Shorted Time Complention First)

  要改善短任务排在长任务后面而造成响应时间和交互体验下降的办法就是短任务优先STCF(Shorted Time Complention First)算法。这种算法的核心就是所有的程序并不都一样,而是有优先级的区分。具体来说,就是短任务的优先级比长任务的高,而我们总是安排优先级高的任务先执行。短任务优先的优点是缩短响应时间,缺点是可能造成长程序无法得到CPU时间而导致“饥饿”。

  短任务优先算法有两种策略,一种是抢占式,如果新到达的进程具有比当前进程更短的CPU时间,则进行抢占。

进程管理笔记二、进程调度概念及基本策略_第2张图片
图2、抢占式示意图

在0 - 2之间,仅有进程P1,当进程P2在2.0时刻到达,其占用CPU时间为4,小于P1进程剩余的5,则抢占CPU。至4.0时刻,P3进程到达,其占用CPU时间,小于P2,同样抢占CPU,依次类推。

另外一种是非抢占式,一旦进程获得了CPU,在其CPU区间完成之前,不会被抢占。

进程管理笔记二、进程调度概念及基本策略_第3张图片
图3、抢占式示意图

在0 - 2之间,仅有进程P1,当进程P2在2.0时刻到达,虽然其占用CPU时间为4,小于P1进程剩余的5,但是非抢占的策略禁止其抢占CPU。至P1执行完,此时就绪的进程有P2、P3。P3占用的时间短,优先选择进程P3。依此类推。

3.3、优先级调度算法PB(Priority based)

  前面介绍的STCF算法有一个缺点就是可能造成长进程“饥饿”,赋予每个进程一个优先级,即可解决这个问题。优先级调度算法的原理是给每个进程赋予一个优先级,每次需要进程切换时,找一个优先级最高的进程进行调度。这样,如果赋予长进程一个高优先级,则该进程就不会再“挨饿”。在后面笔记中,会涉及使用nice、renice动态调整进程优先级。
  优先级调度的优点是可以赋予重要的进程以高优先级以确保重要任务能够得到CPU时间,其缺点则与STCF算法一样,低优先级的进程可能会“饥饿”。这个缺点可以通过老化(aging)解决,即逐渐增加在系统中等待很长时间的进程的优先级。

3.4、轮转法调度RR (Round - Robin)

  轮转法(时间片轮转)算法是对FCFS算法的改进,其主要目的是改善短程序的响应时间。方法就是周期性的进行进程切换,每个进程获得一小段CPU时间(通常是10 - 100ms),时间片用完以后,CPU被抢占,进程就排在就绪队列末尾。轮转法的优点是公平、响应时间非常好,每个进程周期性的获得CPU。其缺点是进程频繁切换会消耗系统资源。
  如果就绪队列中有n个进程时间片为q, 那么每个进程会得到1 / n的CPU时间(1/n * 总量),每个长度不超过q时间单元(到时强制换出),每个进程必须等待CPU的时间不会超过(n-1)* q个时间单元(这里未考虑时间片切换消耗)。

进程管理笔记二、进程调度概念及基本策略_第4张图片
图4、轮转法调度事例

可以看出,进程P1、P2、P3、P4按次序执行,并且P2在一个时间片内执行完,主动让出CPU。其时间片越小,上下文切换越频繁。如果时间片过大,则轮转法越来越像FCFS。

3.5、多级队列调度

  之前介绍的调度算法都存在缺点,我们自然想设计一个合理的算法合并它们的优点,摒弃它们的缺点。这就是多级调度队列。该算法的原理是就绪队列被分成多个独立的队列,每个队列都有自己的调度算法。例如,前台(交互式)采用轮转调度,以获得更短的响应时间。后台(批处理)采用FCFS。

进程管理笔记二、进程调度概念及基本策略_第5张图片
图5、多级队列调度模型

  进程置于优先级不同的队列,队列之间也需要调度,采用固定优先级可能引起队列饥饿,采用轮转法(时间片)可以给每个队列都有一定时间,可用于调度队列内不同的进程。

3.6、多级反馈队列调度

  多级反馈队列调度,是多级队列调度的改进,其核心思想是允许进程在不同的队列之间移动,以此实现老化。多级反馈队列中定义以下参数:队列数量、每个队列调度算法、用以确定进程跨越不同优先权队列方法(高->低 、 低->高、 跳转)。

进程管理笔记二、进程调度概念及基本策略_第6张图片
图6、多级反馈队列调度举例

如图3.6所示,有三个队列,其中Q0、Q1分别为8ms和16ms的时间片, Q2使用FCFS调度算法。其调度策略为:新进程进入就绪队列时被放在队列0内,队列0的每个进程都有8ms的时间片。如果一个进程不能在这一个时间片内完成,那么就被移动到队列1的末尾。队列1按照RR调度,每个进程将获得16ms的时间片,如果没有完成,将被抢占并移动至队列2.,按照FCFS调度策略,完成执行。这样综合考虑了响应时间与进程饥饿

3.7、实时调度算法

  实时系统是一种必须提供实时可预测性的系统,前面的算法主要考虑平均响应时间和系统吞吐率的问题,而实时系统必须考虑每个具体任务的响应时间符合要求,即每个任务必须在规定时间内完成,而无需考虑降低整个系统的响应时间或者吞吐量。如计算来袭导弹的轨迹等。
  常用的实时调度算法包括EDF(Earliest Deadline First)调度算法,其核心思想是动态计算每个任务的截止时间,截止时间靠前的进程,优先级高。其是理论上实时最优调度算法,其缺点是动态计算截止时间和动态抢占CPU均会消耗系统的资源,因此EDF算法的实际效果与理论存在一定差距。
  与EDF算法相对的是,是RMS调度算法,该算法的核心思想是在进行调度前先计算所有任务的优先级,然后按照计算出来的优先级进行调度,任务执行中间既不接收新的进程,也不进行优先级的调整或进行CPU抢占。因此该算法的优点是系统消耗小,缺点是不够灵活。一旦任务确定了,就不能接受新的任务。


四、算法评估方式

  算法的好坏,有很多评估因素,包括CPU利用率、响应时间、系统吞吐量等等。当然可以模拟计算机运行,但是最直接的方式还是将真实的算法放在实际系统,然后在真实系统条件下对它进行评估


小结

  本篇文章介绍了进程调度的概念、调度目标、调度常用算法、即其评估方式。后面的文章会介绍通过nice、renice命令调整进程的优先级,并重点介绍现今广泛使用的CFS调度策略。

参考资料:
《操作系统之哲学原理》 邹恒明著
CPU调度.PPT

纠错与建议
邮箱:[email protected]


你可能感兴趣的:(进程/线程)