习题
5.1为什么对调度程序而言,区分CPU约束程序和I/O约束程序很重要?
答:
CPU的成功调度依赖于进程的如下属性:进程执行由CPU执行和I/O等待周期组成,进程在这两个状态之间切换。进程执行从CPU区间开始,在这之后是I/O区间,接着是另一个CPU区间,如此进行下去;最终,最后的CPU区间通过系统请求终止执行。这些CPU区间的长度呈现出指数或超指数形式的频率曲线,具有大量短CPU区间和少量长CPU区间。I/O约束程序通常具有很多短CPU区间。CPU约束程序可能有少量的长CPU区间。所以区分出CPU约束程序和I/O约束程序能够使调度程序更好的执行和选择合适的CPU调度算法。
5.3考虑用于预测下一个CPU区间的长度的指数平均公式。将下面的值赋给算法中的参数的含义是什么?
a.a=0且t=100ms
b.a=0.99且t=10ms
答:
虽然不知道下一个CPU区间的长度,但是可以预测它。认为下一个CPU区间的长度与以前的相似。下一个CPU区间的通常可预测为以前CPU区间的测量长度的指数平均。设t n为第n个CPU区间的长度,设τn+1为下一个CPU区间的预测值。
因此,对于α,0<=α <=1,
定义τ n+1=αt n+(1-α) τ n
公式定义了一个指数平均。t n包括最近信息,τn存储了过去历史。参数α控制了最近和过去历史在预测中的相对加权。如果α=0,那么τ n+1=τ n,近来历史没有影响(当前情形为暂时的);如果α=1,那么τ n+1=t n,只有最近的CPU区间才重要(历史的被认为是无关的)。
所以:
a. α=0且τ=100ms,则τ n+1=τ n=100ms,说明下一个CPU的区间长度和t n(最近信息)并没有关系,而是和τn存储的过去历史有关,并由它决定。
b. α=0.99且τ=10ms,则τ n+1=0.99*tn+0.01*τn,说明t n给了很高的权重,下一个CPU的区间长度是和t n(最近信息)高度相关的,而和τn存储的过去历史关系不大。
a和b两个问题分别反映了两种极端情况,分别是下一个CPU区间长度取决于最近历史还是过去历史。但是更为常见的是,α=0.5,这样最近历史和过去历史同样重要。初始值τ0可作为常量或作为系统的总体平均值。
5.4考虑下列进程集,进程占用的CPU区间长度以毫秒来计算:
假设在时刻0以进程P1,P2,P3,P4,P5的顺序到达。
a.画出4个Gantt图分别演示用FCFS、SJF、非抢占优先级(数字小代表优先级高)和RR(时间片=1)算法调度时进程的执行过程。
b.在a里每个进程在每种调度算法下的周转时间是多少?
c.在a里每个进程在每种调度算法下的等待时间是多少?
d.在a里哪一种调度算法的平均等待时间对所有进程而言最小?
答:
a.
b. 周转时间:
|
|
FCFS |
SJF |
非抢占优先级 |
RR |
| P1 |
10 |
19 |
18 |
19 |
| P2 |
11 |
1 |
1 |
2 |
| P3 |
13 |
4 |
8 |
7 |
| P4 |
14 |
2 |
19 |
4 |
| P5 |
19 |
9 |
6 |
14 |
c. 等待时间:
|
|
FCFS |
SJF |
非抢占优先级 |
RR |
| P1 |
0 |
9 |
8 |
9 |
| P2 |
10 |
0 |
0 |
1 |
| P3 |
11 |
2 |
6 |
5 |
| P4 |
13 |
1 |
18 |
3 |
| P5 |
14 |
4 |
1 |
9 |
d. 平均等待时间
|
|
FCFS |
SJF |
非抢占优先级 |
RR |
| T |
19.6 |
3.2 |
6.6 |
5.4 |
由表格可知,SJF算法的平均的等待时间最小。
5.5下面哪种调度算法能导致饥饿?
a.先到先服务
b.最短作业优先
c.轮换法
d.优先级
答:
饥饿现象是指某一种作业长时间等待而得不到运行的现象。
a. 先到先服务(FCFS):
FCFS调度算法是一种最简单的调度算法,该调度算法既可以用于作业调度也可以用于进程调度。在作业调度中,算法每次从后备作业队列中选择最先进入该队列的一个或几个作业,将它们调入内存,分配必要的资源,创建进程并放入就绪队列。
在进程调度中,FCFS调度算法每次从就绪队列中选择最先进入该队列的进程,将处理机分配给它,使之投入运行,直到完成或因某种原因而阻塞时才释放处理机。
FCFS调度算法属于不可剥夺算法。从表面上看,它对所有作业都是公平的,但若一个长作业先到达系统,就会使后面许多短作业等待很长时间,因此它不能作为分时系统和实时系统的主要调度策略。但它常被结合在其他调度策略中使用。例如,在使用优先级作为调度策略的系统中,往往对多个具有相同优先级的进程按FCFS原则处理。
FCFS调度算法的特点是算法简单,但效率低;对长作业比较有利,但对短作业不利(相对SJF和高响应比);有利于CPU繁忙型作业,而不利于I/O繁忙型作业。
所以先来先服务算法不会引起饥饿现象。
b. 最短作业优先(SJF):
短作业(进程)优先调度算法是指对短作业(进程)优先调度的算法。短作业优先(SJF)调度算法是从后备队列中选择一个或若干个估计运行时间最短的作业,将它们调入内存运行。而短进程优先(SPF)调度算法,则是从就绪队列中选择一个估计运行时间最短的进程,将处理机分配给它,使之立即执行,直到完成或发生某事件而阻塞时,才释放处理机。
SJF调度算法也存在不容忽视的缺点:
该算法对长作业不利,由表2-3和表2-4可知,SJF调度算法中长作业的周转时间会增加。更严重的是,如果有一长作业进入系统的后备队列,由于调度程序总是优先调度那些 (即使是后进来的)短作业,将导致长作业长期不被调度(“饥饿”现象,注意区分“死锁”。后者是系统环形等待,前者是调度策略问题)。
该算法完全未考虑作业的紧迫程度,因而不能保证紧迫性作业会被及时处理。
由于作业的长短只是根据用户所提供的估计执行时间而定的,而用户又可能会有意或无意地缩短其作业的估计运行时间,致使该算法不一定能真正做到短作业优先调度。
注意,SJF调度算法的平均等待时间、平均周转时间最少

本文详细探讨了操作系统调度程序区分CPU约束程序和I/O约束程序的重要性,并深入解析了指数平均公式在预测CPU区间长度中的作用。接着,分析了FCFS、SJF、非抢占优先级和轮转法(时间片=1)四种调度算法的执行过程、周转时间、等待时间和饥饿现象。重点指出,SJF算法可能导致长作业饥饿,而优先级调度算法也可能造成相同问题。此外,解释了Dekker算法和Eisenberg-McGuire算法如何解决多进程临界区问题,确保互斥、有空让进和有限等待。最后,讨论了非原子化wait()和signal()操作对互斥稳定性的影响,并提出了公平解决读者-写者问题的策略,避免写者饥饿。
最低0.47元/天 解锁文章
4321





