Loading

单处理器调度

原书《操作系统精髓与设计原理——富兰克林》第九章。

处理器调度的类型

  1. 长程调度:指操作系统把一个程序转换成可执行的进程的过程,转换后该进程可能直接以就绪态进入内存,也可能以挂起态在磁盘中,等待进一步的调用
  2. 中程调度:指操作系统把磁盘中的进程装载到内存中的过程
  3. 短程调度:指操作系统使用某些策略调度在内存中的进程

长程调度的频率最低,中程调度稍高一些,最高的就是短程调度,所以本书这一章着眼于单处理器下操作系统的短程调度手段。

开始前,脑袋里需要有的画面是,进程以一个个的周期请求操作系统为它们服务,周期到达时间指进程向操作系统请求该服务周期的时间,周期服务时间指进程的这个执行周期需要运行的时间。不过基于不同的调度算法,一个执行周期有可能顺利执行完成,也有可能因为被其它进程的执行周期抢占而暂时中断。

短程调度准则

调度准则可以分为面向用户和面向系统两类,面向对象的调度准则致力于提供最短的延时,也就是一个进程应该尽量快的得到响应,这样用户才不会有可以感知的“卡顿”感;面向系统的准则则更加偏向于让系统获得更高的吞吐量,也就是尽量让进程周期的完成速度更快。

另一个调度准则的划分是是否直接与性能相关。

下表是一些调度算法可以参考的准则,不可能同时使它们达到最优

选择函数

选择函数就是短程调度中用于选择下一个服务进程的函数。该函数可以基于优先级、资源需求或进程执行特性。对于进程的执行特性,下面三个量非常重要:

  1. \(w\): 到现在为止,在系统中的停留时间
  2. \(e\): 到现在为止,花费的执行时间
  3. \(s\): 进程所需要的总服务时间,包括e,该数通常由程序员提供或系统估计

选择函数按照决策模式可以分为:

  1. 抢占式:在服务周期中的进程可以被其它进程打断,原先的进程转为就绪状态
  2. 非抢占式:一旦进程在服务周期中,就必须执行完成,或遇到I/O或其它阻塞

下图是一些调度策略:

先来先服务(FCFS)

该算法维护一个队列,它每次选择在系统中停留时间最长的那个进程服务。

它不关注吞吐量,它没有可以的选择某些进程而获得更高的吞吐量,它只是每次拿先来的那个进程执行。由于它是非抢占的,所以它的响应时间可能有些高,后面的进程必须等待前面的进程执行完毕或阻塞。由于算法简单,开销很小。

我们通过一个示例来分析它对进程的影响,下面有四个进程的服务周期。其中到达时间、服务时间、开始时间和结束时间都不用解释了,周转时间是结束时间减去到达时间,它代表一个进程从它请求服务到服务顺利结束所耗费的时间;\(T_r/T_s\)归一化周转时间,它是周转时间与进程所需的服务时间的比值,反映了进程的相对延时情况,马上就会看到更长的进程服务周期可以容忍长一些的延时。

通过分析\(X\)\(Y\)的运行情况,我们就可以发现FCFS算法确实是对短进程不利,进程\(Y\)只需要\(1\)的服务时间,但它要等待长进程\(X\)执行完毕,所以它的周转时间和归一化周转时间长达100。而对于\(Z\),虽然它的周转时间也很大,为199,但因为进程Z的服务周期本就很长,所以等待的99个周转时间显得微不足道,它的归一化周转时间也很小。

对I/O密集型进程不利是因为它的非抢占式策略,可能I/O密集型进程已经等待完I/O事件,转换成就绪状态,但它还必须等待当前正在执行的CPU密集型任务执行完毕。此时所有I/O设备都处于空闲状态,而正在就绪态的I/O密集型进程可能还有I/O相关的请求要做。

FCFS策略通常与优先级策略共同工作。

轮转


轮转算法是抢占式的,它的核心思想是不管一个进程需要多少时间的服务周期,我都只执行固定的时间,称为时间片(段),这个时间结束后就发起一个时钟中断,使当前进程转为就绪态,然后基于FCFS算法选择下一个进程。

轮转算法可以看作抢占式的FCFS,想像如果轮转算法的时间片长度长到足以容纳所有进程服务周期的执行,那么它就是FCFS。

轮转算法的核心问题就是选择多长的时间片,如果该值太短,那么可能对每一个进程的服务周期都需要几次时间片才能执行完成,而时钟中断,调度下一个进程是一个耗时操作,这会降低系统的性能,而选择过长的时间片则会让轮转法退化成FCFS。

通常选择略大于一次典型交互的时间片长度。

轮转算法的缺点是,对于I/O密集型任务稍微有些不公平,因为I/O密集任务可能会在一个时间片内阻塞,提前加入就绪队列,而CPU密集型任务总能执行完一次时间片。

虚拟轮转法解决了这个缺点,它除了就绪队列还提供了一个辅助队列,由于等待I/O事件而阻塞的进程一旦就绪会被添加到辅助队列中,轮转算法会先从辅助队列中取进程。

最短进程优先(SPN)

前面的算法都或多或少的偏向于长进程,SPN算法会让短进程越过排在它前面的长进程执行。

该算法需要进程提供它所需要的服务周期运行时间,这个值由程序员提供或系统估计。系统可以通过统计如下信息来确定该进程的第\(n+1\)次服务需要的时间

\[S_{n+1} = \frac{1}{n} \Sigma_{i=1}^n T_i \]

该公式中:

  1. \(T_i\): 该进程第i次执行时间
  2. \(S_i\): 第i次执行时间的预测值
  3. \(S_1\): 第一次执行时间的预测值,上面的公式并没给出\(S_1\)的定义,\(S_n\)的预测需要之前该进程的一些信息,所以\(S_1\)没法计算

可以通过\(S_n\)导出\(S_{n+1}\),避免每次都计算求和

\[S_{n+1} = \frac{1}{n} T_n + \frac{n-1}{n} S_n \]

通常最近的执行情况比早先的更加有参考价值,上面的公式对于所有项目的权值是相同的,都是\(1/n\),下面的公式更加在意最近的执行情况。

\[S_{n+1} = \alpha T_n + (1-\alpha)S_n \]

\(\alpha=0.8\),则:

SPN算法的缺点是如果有持续不断的短进程,长进程就可能饥饿。

最短剩余时间(SRT)

是SPN的抢占版本,它解决了新来的短进程比目前正在执行的进程更短时,新来的进程无法得到立即执行的问题。

最高响应比优先(HRRN)

该算法致力于提供更高的平均归一化周转时间。也就是保证进程的平均相对延迟更小。

\[R = \frac{w+s}{s} \]

我们可以把\(R\)当作如果进程现在立刻执行,那么它将获得的归一化周转时间。该算法选择具有\(max(R)\)的进程,可以看作是对系统中相对延迟最大的进程的补救,它始终挑选相对延迟更大的执行。

该算法也使用了\(s\),所以也需要估计进程的服务时间。

反馈

上面的算法中,不需要估计进程服务时间的FCFS和轮转对短进程都不太友好,而SPN、SRT、HRRN等又必须了解进程的服务时间。

反馈算法提供\(n+1\)个队列,如下图

第i个队列RQiRQi+1具有更高的优先级,反馈算法会优先调度优先级更高的队列。每个队列中都是用轮转法工作,新来的进程在RQ0中,当一个进程由于没在时间片中执行完被中断,它就会降级到下一个队列。也就是说,长进程会慢慢被降低优先级。一旦一个进程被降低到优先级最低的队列,就不会再发生降级。

这样长进程可能会出现饥饿,一个解决办法是优先级更低的队列具有更长的时间片。或者当一个进程在当前队列中等待的服务时间太长时,提升优先级。

习题

  1. 长程调度:指操作系统将用户程序转换为进程
  2. 中程调度:指操作系统将在磁盘中的进程装载到内存中
  3. 短程调度:指操作系统将在内存中的就绪态进程转换为运行态

响应时间。是一个进程响应的延时。

响应时间指进程从到达到开始运行这一段的等待时间,周转时间指进程从到达到运行完成全部的时间,即响应时间+运行时间。

这在不同的系统中有不同的实现方式,在Unix系统中,较小的优先级值代表较高的优先级,在Windows系统中则相反。

非抢占式调度中,进程在执行周期期间不可被其它进程打断,它必须完整运行或遇到I/O等需要阻塞的请求。

抢占式调度中,进程在执行周期期间可以被其它进程打断。

它是一种先来的进程先被调度的调度方式,并且它是非抢占式的。对短进程和IO密集型任务不友好。

它是抢占式的FCFS调度,它为每个进程分配时间片,当一个进程的时间片使用完成,不管它是否执行完毕,时钟中断都会让它停止执行,其它进程得到调度的机会。

对IO密集型任务不友好。

它优先调度执行时间最短的进程,并且它是非抢占式的。必须知道或估算进程的执行时间。

它调度剩余执行时间最短的进程,它是抢占式的,若新来的进程更短,它会暂停当前执行进程。必须知道或估算进程的执行时间。

它致力于给系统提供最低的平均延时。必须知道或估算进程的执行时间。

posted @ 2022-03-06 14:28  yudoge  阅读(91)  评论(0编辑  收藏  举报