Computer Operation System
安徽师范大学——计算机与信息学院———— 作者(授课教师): 周文
处理机调度算法的共同目标
(1) 资源利用率
。为提高系统的资源利用率,应使系统中的处理机和其它所有资源都尽可能地保持忙碌状态,其中最重要的处理机利用率可用以下方法计算:
(2) 公平性
。公平性是指应使诸进程都获得合理的CPU 时间,不会发生进程饥饿现象
。
(3) 平衡性
。由于在系统中可能具有多种类型的进程,有的属于计算型作业,有的属于I/O型。为使系统中的CPU和各种外部设备都能经常处于忙碌状态,调度算法应尽可能保持系统资源使用的平衡性。
(4) 策略强制执行
。对所制订的策略其中包括安全策略,只要需要,就必须予以准确地执行,即使会造成某些工作的延迟也要执行。
批处理系统的目标
(1) 平均周转时间短
对每个用户而言,都希望自己作业的周转时间最短。但作为计算机系统的管理者,则总是希望能使平均周转时间最短,这不仅会有效地提高系统资源的利用率,而且还可使大多数用户都感到满意。
应使作业周转时间和作业的平均周转时间尽可能短。否则,会使许多用户的等待时间过长,这将会引起用户特别是短作业用户的不满。可把平均周转时间描述为:
为了进一步反映调度的性能,更清晰地描述各进程在其周转时间中,等待和执行时间的具体分配状况,往往使用带权周转时间,即作业的周转时间T与系统为它提供服务的时间Ts之比,即
平均带权周转时间则可表示为:
(2) 系统吞吐量高
。由于吞吐量是指在单位时间内系统所完成的作业数,因而它与批处理作业的平均长度有关。事实上,如果单纯是为了获得高的系统吞吐量,就应尽量多地选择短作业运行。
(3) 处理机利用率高
。对于大、中型计算机,CPU价格十分昂贵,致使处理机的利用率成为衡量系统性能的十分重要的指标;而调度方式和算法又对处理机的利用率起着十分重要的作用。如果单纯是为使处理机利用率高,应尽量多地选择计算量大的作业运行。由上所述可以看出,这些要求之间是存在着一定矛盾的。
分时系统的目标 (1) 响应时间快。 (2) 均衡性。
实时系统的目标 (1) 截止时间的保证。 (2) 可预测性。
作业和作业步
(1) 作业(Job)。
(2) 作业步(Job Step)。
作业控制块
(Job Control Block,JCB)
作业运行的三个阶段和三种状态
作业从进入系统到运行结束,通常需要经历收容、运行和完成三个阶段。相应的作业也就有“后备状态”、“运行状态”和“完成状态”。
(1) 收容阶段。
(2) 运行阶段。
(3) 完成阶段。
作业调度的主要任务是,根据JCB中的信息,检查系统中的资源能否满足作业对资源的需求,以及按照一定的调度算法,从外存的后备队列中选取某些作业调入内存,并为它们创建进程、分配必要的资源。
然后再将新创建的进程排在就绪队列上等待调度。因此,也把作业调度称为接纳调度(Admission Scheduling)。在每次执行作业调度时,都需做出以下两个决定。
先来先服务(first-come first-served,FCFS)调度算法
短作业优先(short job first,SJF)的调度算法
由于在实际情况中,短作业(进程)占有很大比例,为了能使它们能比长作业优先执行,而产生了短作业优先调度算法。
1) 短作业优先算法
SJF算法
是以作业的长短来计算优先级,作业越短,其优先级越高。作业的长短是以作业所要求的运行时间来衡量的。SJF算法可以分别用于作业调度和进程调度。在把短作业优先调度算法用于作业调度时,它将从外存的作业后备队列中选择若干个估计运行时间最短的作业,优先将它们调入内存运行。
2) 短作业优先算法的缺点
SJF调度算法较之FCFS算法有了明显的改进,但仍然存在不容忽视的缺点
:
(1) 必须预知作业的运行时间。在采用这种算法时,要先知道每个作业的运行时间。即使是程序员也很难准确估计作业的运行时间,如果估计过低,系统就可能按估计的时间终止作业的运行,但此时作业并未完成,故一般都会偏长估计。
(2) 对长作业非常不利,长作业的周转时间会明显地增长。更严重的是,该算法完全忽视作业的等待时间,可能使作业等待时间过长,出现饥饿现象
。
(3) 在采用FCFS算法时,人—机无法实现交互。
(4) 该调度算法完全未考虑作业的紧迫程度,故不能保证紧迫性作业能得到及时处理。
优先级调度算法
(priority-scheduling algorithm,PSA)
高响应比优先调度算法
(Highest Response Ratio Next,HRRN)
在批处理系统中,FCFS算法所考虑的只是作业的等待时间,而忽视了作业的运行时间。而SJF算法正好与之相反,只考虑作业的运行时间,而忽视了作业的等待时间。
高响应比优先调度算法则是既考虑了作业的等待时间,又考虑作业运行时间的调度算法,因此既照顾了短作业,又不致使长作业的等待时间过长,从而改善了处理机调度的性能。
高响应比优先算法是如何实现的呢?
如果我们能为每个作业引入一个动态优先级,即优先级是可以改变的,令它随等待时间延长而增加,这将使长作业的优先级在等待期间不断地增加,等到足够的时间后,必然有机会获得处理机。该优先级的变化规律可描述为:
由于等待时间与服务时间之和就是系统对该作业的响应时间,故该优先级又相当于响应比RP。据此,优先又可表示为:
进程调度的任务
进程调度的任务主要有三: (1) 保存处理机的现场信息。 (2) 按某种算法选取进程。 (3) 把处理器分配给进程。
进程调度机制
为了实现进程调度,在进程调度机制中,应具有如下三个基本部分,如图3-1所示。 (1) 排队器。 (2) 分派器。 (3) 上下文切换器。
进程调度方式
1) 非抢占方式
(Nonpreemptive Mode)
2) 抢占方式
(Preemptive Mode)
这种调度方式允许调度程序根据某种原则,去暂停某个正在执行的进程,将已分配给该进程的处理机重新分配给另一进程。
在现代OS中广泛采用抢占方式
在分时系统中,只有采用抢占方式才有可能实现人—机交互。在实时系统中,抢占方式能满足实时任务的需求。但抢占方式比较复杂,所需付出的系统开销也较大。
轮转法的基本原理
轮转(RR)法
中,系统将所有的就绪进程按FCFS策略排成一个就绪队列。系统可设置每隔一定时间(如30 ms)便产生一次中断,去激活进程调度程序进行调度,把CPU分配给队首进程,并令其执行一个时间片。进程切换时机
在RR调度算法
中,应在何时进行进程的切换,可分为两种情况:
① 若一个时间片尚未用完,正在运行的进程便已经完成,就立即激活调度程序,将它从就绪队列中删除,再调度就绪队列中队首的进程运行,并启动一个新的时间片。
② 在一个时间片用完时,计时器中断处理程序被激活。如果进程尚未运行完毕,调度程序将把它送往就绪队列的末尾。
时间片大小的确定
图3-3 q = 1和q = 4时进程的周转时间
优先级调度算法的类型
优先级的类型
1) 静态优先级
2) 动态优先级
调度机制
多级反馈队列调度算法的调度机制可描述如下: (1) 设置多个就绪队列。
(2) 每个队列都采用FCFS算法。
RR方式
运行。(3) 按队列优先级调度。
调度算法的性能
保证调度算法
保证调度算法是另外一种类型的调度算法,它向用户所做出的保证并不是优先运行,而是明确的性能保证,该算法可以做到调度的公平性。
一种比较容易实现的性能保证是处理机分配的公平性。如果在系统中有n个相同类型的进程同时运行,为公平起见,须保证每个进程都获得相同的处理机时间。
在实施公平调度算法时系统中必须具有这样一些功能:
(1) 跟踪计算每个进程自创建以来已经执行的处理时间。
(2) 计算每个进程应获得的处理机时间,即自创建以来的时间除以n。
(3) 计算进程获得处理机时间的比率,即进程实际执行的处理时间和应获得的处理机时间之比。
(4) 比较各进程获得处理机时间的比率。如进程A的比率最低,为0.5,而进程B的比率为0.8,进程C的比率为1.2等。
(5) 调度程序应选择比率最小的进程将处理机分配给它,并让该进程一直运行,直到超过最接近它的进程比率为止。
公平分享调度算法
提供必要的信息
为了实现实时调度,系统应向调度程序提供有关任务的信息:
(1) 就绪时间,是指某任务成为就绪状态的起始时间,在周期任务的情况下,它是事先预知的一串时间序列。
(2) 开始截止时间和完成截止时间,对于典型的实时应用,只须知道开始截止时间,或者完成截止时间。
(3) 处理时间,一个任务从开始执行,直至完成时所需的时间。
(4) 资源要求,任务执行时所需的一组资源。
(5) 优先级,如果某任务的开始截止时间错过,势必引起故障,则应为该任务赋予“绝对”优先级;如果其开始截止时间的错过,对任务的继续运行无重大影响,则可为其赋予“相对”优先级,供调度程序参考。
系统处理能力强
在实时系统中,若处理机的处理能力不够强,则有可能因处理机忙不过,而致使某些实时任务不能得到及时处理,从而导致发生难以预料的后果。
假定系统中有m个周期性的硬实时任务HRT,它们的处理时间可表示为Ci,周期时间表示为Pi,则在单处理机情况下,必须满足下面的限制条件系统才是可调度的:
提高系统处理能力的途径有二:
一是,采用单处理机系统,但须增强其处理能力,以显著地减少对每一个任务的处理时间;
二是,采用多处理机系统。假定系统中的处理机数为N,则应将上述的限制条件改为:
采用抢占式调度机制
具有快速切换机制
为保证硬实时任务能及时运行,在系统中还应具有快速切换机制,使之能进行任务的快速切换。该机制应具有如下两方面的能力:
(1) 对中断的快速响应能力。对紧迫的外部事件请求中断能及时响应,要求系统具有快速硬件中断机构,还应使禁止中断的时间间隔尽量短,以免耽误时机(其它紧迫任务)
(2) 快速的任务分派能力。为了提高分派程序进行任务切换时的速度,应使系统中的每个运行功能单位适当的小,以减少任务切换的时间开销。
可以按不同方式对实时调度算法加以分类:
① 根据实时任务性质,可将实时调度的算法分为硬实时调度算法和软实时调度算法;
② 按调度方式,则可分为非抢占调度算法和抢占调度算法。
非抢占式调度算法
(1) 非抢占式轮转调度算法。
(2) 非抢占式优先调度算法。
抢占式调度算法
可根据抢占发生时间的不同而进一步分成以下两种调度算法:
(1) 基于时钟中断的抢占式优先级调度算法。
(2) 立即抢占(Immediate Preemption)的优先级调度算法。
图3-5中的(a)、(b)、(c)、(d)分别示出了四种情况的调度时间。
非抢占式调度方式用于非周期实时任务
抢占式调度方式用于周期实时任务
图3-7示出了将该算法用于抢占调度方式之例。在该例中有两个周期任务,任务A和任务B的周期时间分别为20 ms和50 ms,每个周期的处理时间分别为10 ms 和25 ms。
该算法在确定任务的优先级时,根据的是任务的紧急(或松弛)程度。任务紧急程度愈高,赋予该任务的优先级就愈高,以使之优先执行。
该算法主要用于可抢占调度方式中。假如在一个实时系统中有两个周期性实时任务A和B,任务A要求每20 ms执行一次,执行时间为10 ms,任务B要求每50 ms执行一次,执行时间为25 ms。由此可知,任务A和B每次必须完成的时间分别为:A1、A2、A3、…和B1、B2、B3、…,
见图3-8。
图3-9示出了具有两个周期性实时任务的调度情况。
优先级倒置的形成
当前OS广泛采用优先级调度算法和抢占方式,然而在系统中存在着影响进程运行的资源而可能产生“优先级倒置”的现象。
即,高优先级进程(或线程)被低优先级进程(或线程)延迟或阻塞。我们通过一个例子来说明该问题。
假如最先执行,在执行了P(mutex)
操作后,进入到临界区。在时刻a,就绪,因为它比的优先级高,抢占了的处理机而运行,如图3-10所示。
优先级倒置的解决方法
一种简单的解决方法是规定:假如进程在进入临界区后所占用的处理机就不允许被抢占。
图3-11示出了采用动态优先级继承方法后,三个进程的运行情况。
在系统中有许多不同类型的资源,其中可以引起死锁的主要是,需要采用互斥访问方法的、不可以被抢占的资源,即在前面介绍的临界资源。
可重用性资源和消耗性资源
1) 可重用性资源
可重用性资源是一种可供用户重复使用多次的资源,它具有如下性质:
(1) 每一个可重用性资源中的单元只能分配给一个进程使用,不允许多个进程共享。
(2) 进程在使用可重用性资源时,须按照这样的顺序:
① 请求资源
。如果请求资源失败,请求进程将会被阻塞或循环等待。
② 使用资源
。进程对资源进行操作,如用打印机进行打印;
③ 释放资源
。当进程使用完后自己释放资源。
(3) 系统中每一类可重用性资源中的单元数目是相对固定的,进程在运行期间既不能创建也不能删除它。
2) 可消耗性资源
可消耗性资源又称为临时性资源,它是在进程运行期间,由进程动态地创建和消耗的,它具有如下性质:
① 每一类可消耗性资源的单元数目在进程运行期间是可以不断变化的,有时它可以有许多,有时可能为0;
② 进程在运行过程中,可以不断地创造可消耗性资源的单元,将它们放入该资源类的缓冲区中,以增加该资源类的单元数目。
③ 进程在运行过程中,可以请求若干个可消耗性资源单元,用于进程自己的消耗,不再将它们返回给该资源类中。
可抢占性资源和不可抢占性资源
1) 可抢占性资源
可把系统中的资源分成两类,一类是可抢占性资源,是指某进程在获得这类资源后,该资源可以再被其它进程或系统抢占。
2) 不可抢占性资源
另一类资源是不可抢占性资源,即一旦系统把某资源分配给该进程后,就不能将它强行收回,只能在进程用完后自行释放。
竞争不可抢占性资源引起死锁
通常系统中所拥有的不可抢占性资源其数量不足以满足多个进程运行的需要,使得进程在运行过程中,会因争夺资源而陷入僵局。
我们可将上面的问题利用资源分配图进行描述,用方块代表可重用的资源(文件),用圆圈代表进程,见图3-12所示。
竞争可消耗资源引起死锁
图3-13示出了在三个进程之间,在利用消息通信机制进行通信时所形成的死锁情况。
进程推进顺序不当引起死锁
除了系统中多个进程对资源的竞争会引发死锁外,进程在运行过程中,对资源进行申请和释放的顺序
是否合法,也是在系统中是否会产生死锁的一个重要因素。
进程推进顺序合法
在进程P1和P2并发执行时,如果按图3-14中的曲线①所示的顺序推进:
两个进程可顺利完成。类似地,若按图中曲线②和③所示的顺序推进,两进程也可以顺利完成。我们称这种不会引起进程死锁的推进顺序是合法的。
进程推进顺序非法
死锁的定义
产生死锁的必要条件
虽然进程在运行过程中可能会发生死锁,但产生进程死锁是必须具备一定条件的。综上所述不难看出,产生死锁必须同时具备下面四个必要条件,只要其中任一个条件不成立,死锁就不会发生:
(1) 互斥条件。
(2) 请求和保持条件。
(3) 不可抢占条件。
(4) 循环等待条件。
处理死锁的方法
目前处理死锁的方法可归结为四种:
(1) 预防死锁。
(2) 避免死锁。
(3) 检测死锁。
(4) 解除死锁。
预防死锁的方法是通过破坏产生死锁的四个必要条件中的一个或几个,以避免发生死锁。
第一种协议
第二种协议
在死锁避免方法中,把系统的状态分为安全状态和不安全状态。当系统处于安全状态时,可避免发生死锁。反之,当系统处于不安全状态时,则可能进入到死锁状态。
安全状态
在该方法中,允许进程动态地申请资源,但系统在进行资源分配之前,应先计算此次资源分配的安全性。
安全状态之例
假定系统中有三个进程P1、P2和P3,共有12台磁带机。进程P1总共要求10台磁带机,P2和P3分别要求4台和9台。假设在T0时刻,进程P1、P2和P3已分别获得5台、2台和2台磁带机,尚有3台空闲未分配,如下表所示:
进程 | 最大需求 | 已分配 | 可用 |
---|---|---|---|
10 | 5 | 3 | |
4 | 2 | ||
9 | 2 |
由安全状态向不安全状态的转换
如果不按照安全序列分配资源,则系统可能会由安全状态进入不安全状态。
最有代表性的避免死锁的算法是Dijkstra
的银行家算法。起这样的名字是由于该算法原本是为银行系统设计的,以确保银行在发放现金贷款时,不会发生不能满足所有客户需要的情况。在OS中也可用它来实现避免死锁。
银行家算法中的数据结构
为了实现银行家算法,在系统中必须设置这样四个数据结构,分别用来描述系统中可利用的资源、所有进程对资源的最大需求、系统中的资源分配,以及所有进程还需要多少资源的情况。
(1) 可利用资源向量Available
。
(2) 最大需求矩阵Max
。
(3) 分配矩阵Allocation
。
(4) 需求矩阵Need
。
银行家算法
设是进程的请求向量,如果,表示进程需要个类型的资源。当发出资源请求后,系统按下述步骤进行检查:
(1) 如果,便转向步骤(2); 否则认为出错,因为它所需要的资源数已超过它所宣布的最大值。
(2) 如果,便转向步骤(3); 否则,表示尚无足够资源,须等待。
(3) 系统试探着把资源分配给进程Pi,并修改下面数据结构中的数值: Available[j] = Available[j] - Requesti[j]; Allocation[i, j] = Allocation[i, j] + Requesti[j]; Need[i, j] = Need[i, j] - Requesti[j];
(4) 系统执行安全性算法,检查此次资源分配后系统是否处于安全状态。若安全,才正式将资源分配给进程,以完成本次分配;否则,将本次的试探分配作废,恢复原来的资源分配状态,让进程等待。
安全性算法
系统所执行的安全性算法可描述如下: (1) 设置两个向量:
① 工作向量Work
,它表示系统可提供给进程继续运行所需的各类资源数目,它含有个元素,在执行安全算法开始时,;
② Finish
:它表示系统是否有足够的资源分配给进程,使之运行完成。开始时先做;当有足够资源分配给进程时,再令。
(2) 从进程集合中找到一个能满足下述条件的进程: ① Finish[i]=false; ② Need[i, j]≤Work[j]; 若找到,执行步骤(3),否则,执行步骤(4)。
(3) 当进程Pi获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行:
;
;
go to step 2
;
(4) 如果所有进程的都满足,则表示系统处于安全状态;否则,系统处于不安全状态。
银行家算法之例
假定系统中有五个进程{}和三类资源{A, B, C},各种资源的数量分别为,时刻的资源分配情况如图3-15所示。
(1) 时刻的安全性:利用安全性算法对时刻的资源分配情况进行分析(如图3-16所示)可知,在时刻存在着一个安全序列{},故系统是安全的。
(2) 请求资源:P1发出请求向量,系统按银行家算法进行检查:
① ;
② ;
③ 系统先假定可为P1分配资源,并修改Available,Allocation1和Need1向量
,由此形成的资源变化情况如图3-15中的圆括号所示;
④ 再利用安全性算法检查此时系统是否安全,如图3-17所示。
(3) 请求资源:发出请求向量,系统按银行家算法进行检查: ① ; ② ,让等待
(4) 请求资源:发出请求向量,系统按银行家算法进行检查: ① ; ② ; ③ 系统暂时先假定可为分配资源,并修改有关数据,如图3-18所示。
(5) 进行安全性检查:可用资源已不能满足任何进程的需要,故系统进入不安全状态,此时系统不分配资源。
如果在系统中,既不采取死锁预防措施,也未配有死锁避免算法,系统很可能会发生死锁。在这种情况下,系统应当提供两个算法:
① 死锁检测算法。该方法用于检测系统状态,以确定系统中是否发生了死锁。
② 死锁解除算法。当认定系统中已发生了死锁,利用该算法可将系统从死锁状态中解脱出来。
为了能对系统中是否已发生了死锁进行检测,在系统中必须:
① 保存有关资源的请求和分配信息;
② 提供一种算法,它利用这些信息来检测系统是否已进入死锁状态。
资源分配图(Resource Allocation Graph)
系统死锁,可利用资源分配图来描述。
该图是由一组结点和一组边所组成的一个对偶,它具有下述形式的定义和限制:
(1) 把分为两个互斥的子集,即一组进程结点和一组资源结点。在图3-19所示的例子中,。 该图是由一组结点N和一组边E所组成的一个对偶,它具有下述形式的定义和限制:
(2) 凡属于E中的一个边,都连接着P中的一个结点和R中的一个结点,是资源请求边,由进程指向资源,它表示进程Pi请求一个单位的Rj资源。是资源分配边,由资源指向进程,它表示把一个单位的资源分配给进程。
图3-19中示出了两个请求边和两个分配边,即。
2.死锁定理
我们可以利用把资源分配图加以简化的方法(图3-19),来检测当系统处于S
状态时,是否为死锁状态。简化方法如下:
(1) 在资源分配图中,找出一个既不阻塞又非独立的进程结点。在顺利的情况下,Pi可获得所需资源而继续运行,直至运行完毕,再释放其所占有的全部资源,这相当于消去Pi的请求边和分配边,使之成为孤立的结点。
在图3-20(a)中,将的两个分配边和一个请求边消去,便形成图(b)所示的情况。
(2) 释放资源后,便可使获得资源而继续运行,直至完成后又释放出它所占有的全部资源,形成图(c)所示的情况,即将的两条请求边和一条分配边消去
(3) 在进行一系列的简化后,若能消去图中所有的边,使所有的进程结点都成为孤立结点,则称该图是可完全简化的;若不能通过任何过程使该图完全简化,则称该图是不可完全简化的。
3.死锁检测中的数据结构
死锁检测中的数据结构类似于银行家算法中的数据结构
(1) 可利用资源向量,它表示了类资源中每一类资源的可用数目。
(2) 把不占用资源的进程()记入表中,即。
(3) 从进程集合中找到一个的进程,做如下处理:
① 将其资源分配图简化,释放出资源,增加工作向量
② 将它记入表中。
(4) 若不能把所有进程都记入L表中,便表明系统状态S的资源分配图是不可完全简化的。因此,该系统状态将发生死锁。
终止进程的方法
1) 终止所有死锁进程
2) 逐个终止进程
2.付出代价最小的死锁解除算法
一种付出代价最小的死锁解除算法如图3-21所示。
银行家算法,出现以下资源分配,试问:
Process | Allocation | Need | Available |
---|---|---|---|
0012 | 1622 | ||
1750 | |||
1354 | 2356 | ||
0332 | 0652 | ||
0014 | 0656 |
答案
该状态是安全的,因为存在一个安全序列。 时刻的安全序列表如下所示:
若发出请求后, 系统不能够将资源分配给它。若分配给它,系统还剩下资源情况为,此时系统中的资源将无法满足任何一个进程的资源请求,从而导致系统进入不安全状态
,容易引起死锁的发生。
银行家算法,出现以下资源分配,试问:
Process | Max | Allocation | Need | Available |
---|---|---|---|---|
332 | 100 | 222 | 112 | |
613 | 511 | 102 | ||
314 | 211 | 103 | ||
422 | 002 | 420 |
若进程提出后,系统是否将资源分配给它?
答案
该状态是安全的,因为存在一个安全序列。时刻的安全序列表如下所示:
发出请求向量,系统按照银行家算法进行检查:
系统先假定可以为分配资源,并修改 :
再利用安全性算法检查此时系统是否安全。
假定一个处理机上执行5个作业,作业的到达时间和运行时间如下表所示。
作业号 | 到达时间 | 运行时间 |
---|---|---|
A | 0 | 3 |
B | 1 | 5 |
C | 3 | 2 |
D | 9 | 5 |
E | 12 | 5 |
答案
采用调度顺序分别为:
分析如下:
:
:
:
平均带权周转时间:
本节结束 2019年10月5日