操作系统--CPU调度(二)

6.2 调度准则

不同的CPU调度算法具有不同属性,且可能对某些进程更为有利。为了选择算法以使用于特定情况,必须分析各个算法的属性。
为了比较CPU调度算法,分析员提出了许多准则,用来进行比较的特征对确定最佳算法有很大影响。这些准则包括如下:

  • CPU使用率:需要使CPU尽可能忙。CPU使用率从0% 到 100%。对于真实系统,它应从40% (请负荷系统)到90%(重负荷使用的系统)。
  • 吞吐量:如果CPU忙于执行进程,那么就要评价其工作量。其中一种测量工作量的方法称为吞吐量,它指一个时间单元内所完成进程的数量。对于长进程,吞吐量为每小时一个进程;对于短进程事务,吞吐量可能为每秒十个进程。
  • 周转时间:从一个特定进程的角度来看,重要准则是运行该进程需要花费多长时间。从进程提交到进程完成的时间间隔称为周转时间。周转时间是所有时间段之和,包括等待进入内存、在就绪队列中等待、在CPU上执行和I/O执行。
  • 等待时间:CPU调度算法并不影响进程运行和执行I/O 的时间量;它只影响进程在就绪队列中等待所花费的时间。等待时间是在就绪队列中等待所花时间之和。
  • 响应时间:对于交互式系统,周转时间并不是最佳准则。通常,进程能相当早就产生某些输出,并能继续计算新结果同时输出以前的结果给用户。因此,另一时间度量是从提交请求到产生第一响应的时间。这种度量称为响应时间,是开始响应所需要的时间,而不是输出该响应所需要的时间。周转时间通常受输出设备速度的限制。

人们需要使用CPU使用率和吞吐量最大化,而使周转时间、等待时间和响应时间最小化。在绝大多数情况下,要优化平均度量值。不过,在有的情况下,需要优化最小值或最大值,而不是平均值。例如,为了保证所有用户都得到好的服务,可能需要使最大响应时间最小。
对于交互式系统(如分时系统),有的分析人员建议最小化响应时间的差异要比最小化平均响应时间更为重要。具有合理的可预见的响应时间的系统,比平均来说更快但变化大的系统更为可取。不过,在CPU 调度算法如何使差异最小化方面,所做的工作并不多。
在讨论各种CPU 调度算法时,需要描述其操作。精确描述需要涉及许多进程,且每个进程有数百个CPU区间和I/O区间的序列。为了简化描述,这里只考虑每个进程有一个CPU区间(以ms计)。这里的比较量都是平均等待时间。

6.3 调度算法

CPU调度处理从就绪队列中选择哪个进程并为之分配CPU的问题。在本节,描述一些现有的CPU调度算法。

6.3.1 先到先服务调度

显然,最简单的CPU调度算法是先到先服务调度算法(first-come, first-served,FCFS)。采用这种方案,先请求CPU的进程被首先分配到CPU。FCFS 策略可以用FIFO 队列类容易地实现。当一个进程进入到就绪队列,其PCB 被链接到队列的尾部。当CPU空闲时,CPU被分配给位于队列头的进程。接着,该运行进程从队列中被删除。FCFS 调度的代码编写简单且容易理解。

不过,采用FCFS 策略的平均等待时间通常相当长。考虑如下一组进程,它们在时刻0 到达,其CPU 区间时间长度按 ms 计:

进程 区间时间
P1 24
P2 3
P3 3

如果进程按P1、P2、 P3的顺序到达,且按FCFS 的顺序被处理,那么得到如下面Gantt图所示的结果:
在这里插入图片描述
进程P1 的等待时间为0 ms ,进程P2 的等待时间为24ms,进程P3的等待时间为 27 ms。因此,平均 等待时间为(0+24+27)/3 = 17 ms。不过,如果进程按P2, P3, P1的顺序到达,那么其结果如下Gantt图所示:
在这里插入图片描述
现在平均等待时间为(6+0+3)/ 3 = 3ms 。这一减少量很大。因此,采用FCFS策略的平均等待时间通常不是最小,且如果进程CPU区间时间变化很大,平均等待时间也会变化很大。

另外,考虑FCFS 调度在动态情况下的性能。假设有一个CPU约束进程和许多I/O约束进程。随着进程在系统中运行,可能会发生如下情况: CPU约束进程会得到 CPU并控制它。在这段时间内,所有其他进程会处理完它们的 I/O并转移到就绪 队列以等待 CPU。当这些进程在就绪队列里等待时, I/O设备空闲。最终, CPU约束进程完成其CPU区间并移动到I/O设备。所有I/O 约束进程,由于只有很短的 CPU区间,故很快执行完并移回到I/O队列。这时,CPU保持空闲。之后,CPU约束进程会移回到就绪队列并被分配到CPU。再次,所有I/O进程会在就绪队列中等待知道 CPU约束进程的完成。由于所有其他进程都等待一个大进程释放 CPU,就会产生 护航效果(convoy effect)。与可能允许较短进程先行相比,这种效果会导致 CPU和设备的使用率变得更低。

FCFS调度算法是非抢占的。一旦CPU被分配给了一个进程,该进程就会保持CPU知道释放 CPU为止,即程序终止或是请求I/O。FCFS算法对于分时系统(每个用户需要定时地得到一定的CPU时间)是尤为麻烦的。允许一个进程持有CPU的时间过长,将是个严重错误。

6.3.2 最短作业优先调度

另一个CPU调度方法是最短作业优先调度算法(shortest-job-first, SJF)。这一算法将每个进程与其下一个CPU区间 段相关联。当CPU 为可用时, 它会赋给具有最短后续CPU区间的进程。如果两个进程具有同样长度的CPU区间,那么可以使用FCFS调度来处理。 注意一个更为适当的表示是最短下一个CPU区间,这是因为调度的完成时通过检查进程的下一个CPU区间的长度,而不是其总长度。可以使用此SJF,这是因为绝大多数人员和教科书成这种类型的调度策略为SJF。
作为一个例子,考虑如下一组进程,其CPU区间时间长度以ms计:
进程 区间时间
P1 6
P2 8
P3 7
P4 3

采用SJF调度,就能根据如下Gantt图来调度这些进程:

进程P1 的等待时间是3ms ,进程P2 的等待时间为16ms, 进程P3的等待时间为 9ms,进程P4的等待时间为0ms。因此 平均等待时间为(3+16+9+0)/4 = 7ms。如果使用FCFS 调度方案,那么平均等待时间为10.25ms。

SJF调度算法可证明为最佳,这是因为对于给定的一组进程,SJF算法的平均等待时间最小。通常将短进程移到长进程之前,短进程等待时间的减少大于长进程等待时间的增加。因而,平均等待时间减少了。

SJF算法的真正困难如何知道下一个CPU请求的长度。对于批处理系统的长期(或作业)调度,可以将用户提交作业时所指定的进程时间极限作为长度。因此,用户有根据地精确估计进程时间,这是因为较低的值可能意味着更快的响应。(过小的值会引起时间极限超出错误,并需要重新提交)。SJF 调度经常用于长期调度。

虽然SJF算法时最佳的,但是它不能在短期CPU调度的层次上加以实现。没有办法知道下一个CPU区间的长度。一种方法是试图近似SJF调度。虽然人们不知道下一个CPU区间的长度,但是可以预测它的值。可以认为下一个CPU区间 的长度与以前的相似。因此,通过计算下一个CPU区间长度的近似值,能选择具有最短预测CPU区间的进程来运行。
下一个CPU区间通常 可预测为以前CPU区间的 测量长度的指数平均。设tn 为第n 个CPU区间 的长度,设tn 为第n个 CPU区间的长度,设 τn+1 为 下一个CPU 区间的预测值。因此, 对于 α, 0 <= α <= 1,定义
τn+1 = α tn +(1 - α) τn

这一公式定义了 指数平均 (exponential average)。tn 值包括最近的信息;τn 存储了过去历史。参数α控制了最近 和过去历史在预测 中的相对加权。如果 α = 1, 那么 τn+1 = tn, 只有最近 CPU区间才重要(历史被认为是陈旧的、无关的)。更为常见的是, α = 1/2,这种最近历史和过去历史同样重要。初始值τ0可被定义为常量或作为系统的总体平均值。图 6.3 说明了一个指数平均值,其α = 1/2, τ0 = 10。

为了便于理解 指数平均的行为,可通过替换τn 来扩展 τn+1, 从而得到
τn+1 = α tn +(1 - α)α τn-1 + … +(1 - α)^j α τn-1 + … + (1- α)……n+1 τ0

由于 α 和(1- α) 都小于或等于1 ,所以后面项的权比 其前面项的权要小。

SJF算法可能是抢占 的或 非抢占 的。 当一个新进程到达就绪队列而从前进程正在执行时,就需要选择。新进程, 与当前运行进程所产生的CPU区间相比,可能有一个更短的下一个CPU区间。可抢占SJF算法可能会抢占当前运行进程,而非抢占SJF算法会允许当前运行进程先完成其CPU区间。可抢占 SJF调度有时称为 最短剩余时间优先 (shortest-remaining-time-first) 调度。

作为例子,考虑如下四个进程,其CPU区间时间以ms计:
进程 到达时间 区间时间
P1 0 8
P2 1 4
P3 2 9
P4 3 5
如果进程按所给定的时间到达就绪队列,且需要给定的区间时间,那么所产生的可抢占SJF调度如下面的Gantt 图所示:

在这里插入图片描述
进程P1 在时刻 0开始, 因为这时队列 中只有进程P1。进程P2在时刻 1 到达。进程P1剩余时间 (7ms)大于进程P2所需要的时间(4ms),因此进程P1被抢占,而进程P2 被调度。对于这个例子,平均等待时间为((10 - 1)+ (1 - 1)+ (17 - 2) + (5 -3))/4 = 26/4 = 6.5ms。如果 使用非抢占 SJF调度,那么平均等待时间为7.75 ms。

6.3.3 优先权调度

SJF算法作为通用优先权调度算法(priority-scheduling algorithm)的一个特例。每个进程都有一个优先权与其关联,具有最高优先权的进程会被分配到CPU。具有相同优先权的进程按 FCFS顺序调度。
SJF算法作为优先权算法,其优先权 为(p)下一个(预测的)CPU区间的倒数。CPU区间越大,则优先权越小;反之亦然。
注意这里按照 高优先权 和低优先权 来讨论调度。优先权通常为固定区间的数字,如 0 到 7,或 0 到4095。不过, 对于0是最高还是最低的优先权,并没有定论。有的系统有低数字表示低优先权;其他的系统使用第数字表示高优先权。这一差异导致混淆。这里用第数字表示高优先级。
作为例子,考虑下面一组进程,它们在时刻0 时按照 P1, P2, … , P5到达,其CPU 区间时间长度按ms计:
进程 到达时间 优先权
P1 10 3
P2 1 1
P3 2 4
P4 1 5
P5 5 2

采用优先权调度,全按照下面的Gantt 图来调度这些进程:

在这里插入图片描述
平均等待时间为8.2 ms。

优先权可通过内部或外部方式来定义。内部定义优先权使用一些课测量数据以计算进程优先权。例如,时间极限、内存要求、打开文件的数量和平均I/O 时间区间与平均 CPU区间之比都可以用来计算优先权。外部优先权是通过操作系统之外的准则来设置的,如进程重要性、用来支付使用计算机的费用类型和数量、赞助工作的单位、其他(通常为政治)因素。
优先权调度可以是可抢占的或者非抢占的。当一个进程到达就绪队列时,其优先权与当前运行进程的优先权相比。如果新到达进程的优先权高于当前运行进程的优先权,那么抢占优先权调度算法会抢占CPU。非抢占优先权 调度算法只是将新进程加到 就绪队列的头部。
优先权调度算法的一个主要问题是无穷阻塞(indefinite blocking)(或饥饿starvation)。就绪可运行但缺乏CPU的进程可任务阻塞,等待CPU。优先权调度算法会使某个低优先权进程无穷等待CPU在一个重负荷计算机系统中,平稳的高优先权进程可以阻止低优先权进程获得CPU。通常,会发生两种情况。要么进程最终能运行(在系统最后为轻负荷,如星期日凌晨2点),要么计算机系统最终崩溃并失去所有未完成的低优先权进程。(据说,在1973年关闭 MIT的IBM 7094时,发现有一个低优先权进程是于 1967年提交但是一直未运行。)

低优先权进程无穷等待问题的解决方案之一是老化。 老化(aging)是一种技术,以逐渐增加在系统中等待很长时间的进程的优先权。例如,如果优先权为从127(低)到0(高),那么可以每15分钟递减等待进程的优先权。最终即使初始化优先权值为127的进程会有系统中的最高优先权并能执行。事实上, 不超过32小时, 优先权为127 的进程会老化为优先权为0的进程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值