2.2 处理机调度

2.2 处理机调度

思维导图

处理机调度

一、调度的概念

1. 调度的基本概念

在多道程序中,进程的数量往往多于处理机的个数,因此进程争用处理机的情况在所难免。处理机调度是对处理机进行分配,即从就绪队列按照一定的算法(公平、高效)选择一个进程并将处理机分配给它运行。

2. 调度的层次

一个作业从提交直到完成往往需要经历三级调度:

  • 作业调度(高级调度):其主要任务是按照一定的原则,从外存上处于后备状态的作业中挑选一个(或多个)作业,给它们分配除处理机之外的必要资源,并建立相应的进程,以使它们获得竞争处理机资源的权力。对于每个作业只调入一次、调出一次;
  • 中级调度(内存调度):其作用是提高内存利用率和系统吞吐量。为此应将那些暂时不能运行的进程调度至外存等待,把此时的进程称为挂起态。当它们已具有运行条件且内存又稍有空闲时,由中级调度来决定把外村上的那些已具备运行条件的就绪进程再重新调入内存,并修改其状态为就绪态,挂在就绪队列上等待;
  • 进程调度(低级调度):其主要任务是按照某种方法和策略从就绪队列中选取一个进程,将处理机分配给它。进程调度是操作系统中最基本的一种调度

3. 三级调度的关系

  • 作业调度为进程活动做准备,进程调度使进程正常活动起来,中级调度将暂时不能运行的进程挂起,中级调度处于作业调度和进程调度之间;
  • 作业调度次数少,中级调度次数略多,进程调度频率最高;
  • 进程调度是最基本的,不可或缺。

二、调度的时机、切换与过程

进程调度和切换程序是操作系统内核程序。请求调度的事件发生后,才可能运行进程调度程序,调度了新的就绪进程后,才会进行进程间的切换。理论上这三种事情应当顺序发生,但在实际情况中,操作系统内核程序运行时,若某时发生了引起进程调度的因素,不一定会进行调度与切换。

不能进行进程与切换的情况有以下几种:

  • 在处理中断的过程中:中断处理过程复杂,在实现上很难做到进程切换,而且中断处理是操作系统的一部分,逻辑上不属于某一进程,不应被剥夺处理机资源;
  • 进程在操作系统内核程序临界区中:进入临界区后,需要独占式地访问共享数据,理论上必须加锁,以防止其他并行程序进入,在解锁前不应切换到其它进程运行;
  • 其它需要完全屏蔽中断的原子操作过程中:在原子过程中,如加锁、解锁、中断线程保护、恢复等操作,此时连中断都需要屏蔽,更不应该进行进程调度和切换了。

若在上述过程发生了引起调度的条件,则不能马上进行调度和切换,应置系统的请求调度标志,直到上述过程结束后才进行相应的调度与切换。

应该进行进程调度与切换的情况如下:

  • 发生引起调度条件且当前进程无法继续运行下去时,可以马上进行调度与切换。若操作系统只在这种情况下进行进程调度,则是非剥夺调度;
  • 中断处理结束或自陷处理结束后,返回被中断进程的用户态程序执行现场前,若置上请求调度标志,即可马上进行进程调度与切换。若操作系统支持这种情况下的运行调度程序,则实现了剥夺方式的调度。

进程切换往往在调度完成后立刻发生,它要求保存原进程的现场信息,恢复被调度进程的现场信息。现场切换时,操作系统内核将原进程的现场信息推入当前进程的内核堆栈来保存它们,并更新堆栈指针。内核完成从新进程的内核栈装入新进程的现场信息、更新当前运行进程空间指针、重设 PC 寄存器等相关工作后,开始运行新的进程。

三、进程调度方式

所谓进程调度方式,是指当某个进程正在处理机上执行时,若有某个更为重要或紧迫的进程需要处理,此时应该如何分配处理机。

通常有以下两种进程调度方式:

  • 非剥夺调度方式(非抢占方式):非剥夺调度方式是指当一个进程正在处理机上执行时,即使有某个更为重要或紧迫的进程进入就绪队列,仍然让正在执行的进程继续执行,直到该进程完成或进入阻塞状态时,才将处理机分配给更重要的进程。这种方式的优点是实现简单、系统开销小,适用于大部分批处理系统,但不适用于分时系统和绝大部分实时系统;
  • 剥夺调度方式(抢占方式):剥夺调度方式是指当一个进程正在处理机上执行时,若有某个优先级更高的进程需要使用处理机,则立即暂停正在执行的进程,将处理机分配给优先级更高的进程。采用剥夺式的调度,对提高系统吞吐率和相应效率都有明显的好处,但“剥夺”不是一种任意的行为,必须遵守一定的原则,主要有优先权、短进程优先和时间片原则等。

四、进程调度的基本原则

不同的调度算法具有不同的特性,在选择调度算法时必须考虑算法的特性。

算法的评价准则主要有以下几种:

  • CPU 利用率:CPU 是计算机中最重要和最昂贵的资源之一,好的调度算法应当尽可能是 CPU 在工作状态;
  • 系统吞吐量:即单位时间内 CPU 完成作业的数量;
  • 周转时间:指从作业提交到作业完成所经历的时间;
    • 作业周转时间 = 作业完成时间 - 作业提交时间;
    • 平均周转时间 =(作业 1 周转时间 + 作业 2 周转时间 + … + 作业 n 周转时间)/ n;
    • 带权周转时间 = 作业周转时间 / 作业实际运行时间;
    • 平均带权周转时间 = (作业 1 带权周转时间 + … + 作业 n 带权周转时间)/ n。
  • 等待时间:指进程处于等待处理机状态的时间之和,等待使劲按越长用户满意度越低。衡量一个调度算法的优劣通常只需要简单地考察等待时间;
  • 响应时间:指从用户提交请求到系统首次产生相应所用的时间。

五、典型的调度算法

1. 先来先服务(FCFS)算法

FCFS 调度算法是一种最简单的调度算法,它既可以用于作业调度,又可以用于进程调度。

在作业调度时,算法每次从后备作业队列中选择最先进入该队列的一个或几个任务,将它们调入内存,分配必要的资源,创建进程并放入就绪队列中。

在进程调度时,FCFS 每次从就绪队列中选择最先进入该队列的进程,将处理机分配给它,直到进程完成任务或因为某种原因阻塞后才释放处理机。

FCFS 属于不可剥夺算法。从表面上看,它对所有作业都是公平的,但若一个长作业优先到达队列,就会使后面的许多短作业等待很长时间。因此它不能用于分时系统和实时系统的主要调度策略。但它常被结合在其它调度策略中使用。

FCFS 的特点是算法简单,但是效率较低;对长作业比较有利,对短作业不利;有利于 CPU 繁忙型作业,不利于 I/O 繁忙型作业。

2. 短作业优先(SJF)算法

短作业(进程)优先调度算法是指对短作业(进程)优先调度的算法。

短作业优先(SJF)调度算法从后备队列中选择一个或多个预估运行时间最短的作业,将它们调入内存运行;从就绪队列中选择一个预估时间最短的进程,将处理机资源分配给它,直到完成或发生某事件阻塞时才释放处理机。

SJF 算法也存在不容忽视的缺点:

  • 该算法对长作业不利,长作业在队列中可能总是得不到资源;
  • 未考虑作业的紧迫程度;
  • 由于作业时间是根据用户提供信息设置的,该算法不一定能做到真正的短作业优先调度。

不过 SJF 算法的平均等待时间、平均周转时间最少。

3. 优先级调度算法

优先级调度算法又称为优先权调度算法,它既可以用于作业调度也可以用于进程调度。算法中的优先级用于描述作业运行的紧迫程序。

根据新的更高优先级进程是否能够抢占正在执行的进程,可将该算法分为:

  • 非剥夺式优先级调度算法:必须等到运行中的进程运行完毕或者阻塞时才能让更高优先级的进程使用处理机资源;
  • 剥夺式优先级调度算法:正在运行的进程立即暂停,并将处理机资源让给更高优先级的进程。

根据进程创建后优先是否可以改变可以将算法分为:

  • 静态优先级:优先级是在创建进程是确定,在运行期间不可以更改;
  • 动态优先级:优先级在创建进程是设定,可以根据情况动态的调整优先级。

进程优先级的设置一般参考以下准则:

  • 系统进程 > 用户进程;
  • 交互进程 > 非交互进程(前台进程 > 后台进程);
  • I/O 型进程 > 计算型进程。

4. 高响应比优先调度算法

高响应比优先调度算法主要用于作业调度,是对 FCFS 和 SJF 算法的一种综合平衡,同时考虑了每个作业的等待时间和估计的运行时间。在每次作业调度时,先计算后备作业队列中每个作业的响应比,从中选出响应比最高的作业投入运行。
响 应 比 R p = 等 待 时 间 + 要 求 服 务 时 间 要 求 服 务 时 间 响应比R_p = {等待时间 + 要求服务时间\over 要求服务时间} Rp=+
根据公式可知:

  • 作业等待时间相同,要求服务时间越短,响应比越高,越有利于短作业;
  • 要求服务时间相同时,作业的响应时间由其等待时间决定,等待时间越长,其响应比越高,因而它实现的时先来先服务;
  • 对于长作业,作业的响应比可以随等待时间的增加而提高,等待时间足够长时,其响应比可得到提升,从而可以获得处理机,因此兼顾了长作业。

5. 时间片轮转调度算法

时间片轮转调度算法主要适用于分时系统。

在这种算法中,系统将所有就绪进程按到达时间的先后次序排成一个队列,进程调度程序总是选择就绪队列中的第一个执行,但仅能运行一个时间片。若一个时间片内进程完成作业,则退出操作系统;若未完成,则也必须释放处理机资源,然后进入就绪队列的末尾重新排队,等待再次运行。

在时间片轮转调度算法中,时间片的大小对系统性能的影响很大。时间片过长则可能会变成 FCFS 调度算法;若时间片过短系统又可能频繁切换,使处理机的开销增大。

时间片的长短通常由以下因素确定:系统的响应时间、就绪队列中的进程数目和系统的处理能力。

6. 多级反馈队列调度算法(融合了前几种算法的优点)

多继反馈队列算法是时间片轮转调度算法和优先级调度算法的综合与发展,通过动态调整进程优先级和时间片大小,多级反馈队列调度算法可以兼顾多方面的系统目标。

多级反馈调度算法的思想如下:

  • 设置多个就绪队列,并为各个队列赋予不同的优先级,第一级队列的优先级最高,第二级次之,其余队列优先级逐步降低;
  • 赋予各个队列中进程执行时间片的大小各不相同。在优先级越高的队列中,每个进程的运行时间片越小;
  • 当一个新进程进入内存后,首先放入第一级队列末尾,按 FCFS 原则等待调度。当轮到该进程执行时,若能在该时间片完成,则可准备撤离系统;若不能完成,则将该进程转入第二级队列末尾,按照相同的规律一直进行下去。当降到第 n 级队列中便采用时间片轮转的方式进行;
  • 仅当第一级队列为空时,调度程序才调度第二级队列的进程,仅当第 1 ~ (i - 1)级队列均为空时,才调度第 i 级队列的进程。若处理机正在处理第 i 级的进程,此时有新进程进入更高优先级的队列,则此时进程将抢占正在运行进程的处理机,即由调度程序把正在运行的进程放回第 i 级队列的末尾,把处理机分配给新到的更改优先级进程使用。

多级反馈队列的优势:

  • 终端型作业用户:短作业优先;
  • 短批量处理作业用户:周转时间短;
  • 长批量处理作业用户:经过前面几个队列作业部分执行,不会长期得不到处理。

参考资料:王道考研——操作系统

猜你喜欢

转载自blog.csdn.net/qq_43580193/article/details/113080512
2.2