第4章++调度与死锁Word文档格式.docx

上传人:b****8 文档编号:22744057 上传时间:2023-02-05 格式:DOCX 页数:48 大小:75.39KB
下载 相关 举报
第4章++调度与死锁Word文档格式.docx_第1页
第1页 / 共48页
第4章++调度与死锁Word文档格式.docx_第2页
第2页 / 共48页
第4章++调度与死锁Word文档格式.docx_第3页
第3页 / 共48页
第4章++调度与死锁Word文档格式.docx_第4页
第4页 / 共48页
第4章++调度与死锁Word文档格式.docx_第5页
第5页 / 共48页
点击查看更多>>
下载资源
资源描述

第4章++调度与死锁Word文档格式.docx

《第4章++调度与死锁Word文档格式.docx》由会员分享,可在线阅读,更多相关《第4章++调度与死锁Word文档格式.docx(48页珍藏版)》请在冰豆网上搜索。

第4章++调度与死锁Word文档格式.docx

就绪的短作业(进程)有权抢占长作业(进程)的CPU。

(3)时间片原则。

一个时间片用完后,系统重新进行进程调度。

(2)非剥夺方式这种方式是当某一进程正在处理机上执行时,即使有某个更为重要或紧迫的进程进入就绪队列,仍然让正在执行的进程继续执行,直到该进程完成或发生某种事件而进入完成或阻塞状态时,才把处理机分配给更为重要或紧迫的进程。

对不同的调度方式,相应的调度算法也不同,进程调度的核心问题就是采用什么算法将处理机分配给进程。

4.1.2处理机调度算法

1.先来先服务调度算法

这是一种最简单的调度算法,即按照进程进入就绪队列的先后次序来分配处理机。

先来先服务算法属于非剥夺的调度方式,一旦一个进程占有处理机,就一直运行下去,直到该进程完成其工作或因等待某一事件而不能继续执行时才释放处理机。

采用这种进程调度方式,若一个运行时间长的作业先占有了处理机,则会使很多晚到的运行时间短的作业等待时间过长,引起许多短作业用户的不满。

因此这种方式很少被用作主要调度策略,但它常作为一种辅助调度算法使用。

(2)短作业(进程)优先(SJF/SPF)算法

该算法是指短作业或短进程优先调度的算法。

短进程优先调度算法是选择就绪队列中估计运行时间最短的进程技入执行,它既可采用抢占方式,也可采用非抢占方式。

抢占的SW算法通常也叫做最短剩余时间优先算法。

SPF算法能有效地缩短作业的平均周转时间,提高系统的吞吐量,但不利于长作业和紧迫作业的运行。

由于估计的运行时间不一定准确,因而它不一定能真正做到短作业优先。

(3)高晌应比优先调度(HRRN)算法

(4))最高优先权优先调度算法

这是一种最常用的进程调度算法,即把处理机分配给优先权最高的进程。

进程的优先权用于表示进程的重要性及运行的优先性,通常分为两种:

静态优先权和动态优先权。

静态优先权是在创建进程时确定的;

确定之后在整个进程运行期间不再改变。

确定静态优先权的依据有进程的类型、进程所使用的资源、进程的估计运行时间等因素。

进程所索取的资源越多,估计的运行时间越长,进程的优先权越低。

进程类型不同,优先权也不同,如联机用户进程的优先权高于脱机用户进程的优先权。

动态优先权是指在创建进程时,根据系统资源的使用情况和进程的当前特点确定一个优先权,在进程运行过程中再根据情况的变化调整优先权。

动态优先权一般根据进程占有CPU时间的长短、进程等待CPU时间的长短等因素确定。

占有处理机的时间愈长,则优先权越低;

等待时间越长,优先权越高。

基于优先权的调度算法还可按调度方式不同分为非剥夺优先权调度算法和可剥夺优先权调度算法。

(5)时间片轮转调度算法

在这种调度算法中,系统将所有就绪进程按到达时间的先后次序排成一个队列,进程调度程序总是选择队列中的第一个进程执行,且仅能执行一个时间片。

在使用完一个时间片后,即使进程并未完成其运行,也必须将处理机交给下一个进程。

时间片的长短对计算机系统的影响很大。

如果时间片大到让一个进程足以完成其全部工作,这种算法就退化为先来先服务算法。

若时间片很小,那么处理机在进程之间的转换工作过于频繁,处理机真正用于运行用户程序的时间将减少。

时间片长短的值应能使分时用户得到好的响应时间。

(6)多级反馈队列调度算法

在采用多级反馈队列调度算法的系统中,调度算法的实施过程如下:

首先应设置多个就绪队列,并为各个队列赋予不同的优先权。

第一个队列的优先权最高,第二队列次之,其余队列的优先权逐个降低。

其次,赋予各个队列中进程执行时间片的大小也各不相同,在优先权愈高的队列中,每个进程的执行时间片就规定得愈小。

例如,第i+1队列的时间片是第i队列时间片的两倍。

第三,当一个新进程进入内存后,首先将它放入第一队列的末尾,按先来先服务的原则排队等待调度。

当轮到该进程执行时,如能在该时间片内完成,便可准备撤离系统;

如果它在一个时间片结束时尚未完成,调度程序便将该进程转入第二队列的末尾,再同样地按先来先服务原则等待调度执行;

如果它在第二队列中运行一个时间片后仍未完成,再以同样方法将它转入第三队列。

如此下去,当一个长作业从第一队列降到最后一个队列后,在最后一个队列中使用时间片轮转方式运行。

第四,仅当第一队列空闲时,调度程序才调度第二队列中的进程运行:

仅当第1至(i一1〉队列均为空时,才会调度第i队列中的进程运行。

如果处理机正在第i队列中为某进程服务时,又有新进程进入优先权较高的队列,则此时新进程将抢占正在运行进程的处理机,即由调度程序把正在执行进程放回第i队列末尾,重新将处理机分配给新进程。

4.实时调度

实时系统中的任务通常都联系着一个截止时间,实时调度的关键是保证满足实时任务:

对截止时间的要求。

为了保证满足实时任务对截止时间的要求,实时系统必须具备足够强的处理能力和快速的切换机制。

通常,在提交实时任务时,系统将该任务的截止时间、所需的处理时间、资源要求和优先级等信息一起提交给调度程序。

若系统能及时处理该任务,调度程序便将它接收下来,否则,将拒绝接收该任务。

对不同的实时系统,其调度方式和算法的选择也各不相同。

在一些小型实时系统或要求不太严格的实时控制系统中,常采用简单易行的非抢占式轮转调度方式,它可获得数秒至数十秒的响应时间:

而在有一定要求的实时控制系统中,可采用非抢占式优先权调度算法,它可获得仅为数秒至数百毫秒级的响应时间。

在要求比较严格(响应时间为数十毫秒以下)的实时系统中,应采用比较复杂的抢占调度方式,其中,基于时钟中断的抢占式优先权调度算法,可获得几十毫秒至几毫秒的响应时间,适用于大多数的实时系统:

丽立即抢占的优先权调度算法,可将响应时间降到几毫秒至1?

微秒,甚至更低,适用于要求更严格的实时系统。

下面将介绍两种常用的高优先权优先的实时调度算法。

(1)最早截止时间优先CEDE币算法:

该算法根据任务的开始截止时间来确定任务的优先级,即任务的开始截止时间愈早,其优先级愈高。

在实现该算法时,要求系统中保持-个实时任务就绪队列,该队列按各任务的截止时间的早晚排序。

EDF算法即可采用非抢占调度方式,也可采用抢占调度方式。

在采用抢占调度方式时,如果新到达的任务的开始截止时间比正在执行的任务早,则它将立即抢占CPU。

:

(2)最低松弛度优先(LLF)算法。

LIF算法根据实时任务的松弛度(松弛度=任务必须完成的时间一任务本身的运行时间一当前时间)来确定任务的优先权,即任务的松弛度愈低,其优先权愈高。

在实现该算法时,要求系统中有一个按松弛度排序的实时任务就绪队列。

该算法主要用于可抢占调度方式中,当一任务的最低松弛度减为0时,它便必须立即抢占CPU,以保证按截止时间的要求完成任务。

5.多处理机系统中的调度

1.进程分配方式

在对称多处理器系统(SMPS)中,各处理器单元在功能和结构上都是相同的,因而可把所有的处理器作为一个处理器池?

并将进程分配到其中的任干处理器上运行。

在进行进程分配时,可采用静态和动态两种分配方式。

采用静态分配方式时,一个进程从开始执行直至其完成,都被固定分配到一个处理器上去执行,此时,需要为每个处理器维护一个专用的就绪队列。

静态分配方式的优点是调度的开销小,缺点是会使处理器的忙闲不均。

采用动态分配方式时,系统中设置有二个公用的就绪队列,所有的就绪进程都被放在该队列中,然后被随机地调度到任一空闲的处理器上去执行,因此,在一个进程生命周期的不同时刻,它可以在不同的处理器上执行,对松散祸合的多处理器系统,此时需要进行进程现场信息的转移,会明显增加调度开销,但动态分配方式能较好地消除处理器忙闲不均的现象。

在配置有多种类型处理器单元的非对称多处理器系统中,常采用主一从式结构,即操作系统的核心驻留在某个特定的处理器(即主处理器)上,而其他的处理器(即从处理器)只用于执行用户程序。

进程调度由主处理器执行,从处理器空闲时,便向主处理器发一索求进程的信号,并由主处理器从自己的就绪队列中摘下一个进程分配给请求的从处理器。

这种方式的优点是系统处理简单,缺点是主处理器的故障会导致整个系统瘫痪,而且主处理器容易成为系统瓶颈。

2.进程(线程)调度方式

在多处理机系统中,常用的进程(线程)调度方式主要有:

(1)自调度方式。

-它是指在系统中设置一个公用的进程(或线程)队列,所有的处理器在空

闲时,都可自己到该队列中取一进程(或线程)来执行。

(2)成组调度方式。

它是指将一组相互合作的进程或隶属于国一个进程的一组线程分配到一组处理器上去同时执行。

(3)专用处理器分配方式。

它是指在一个应用程序的执行期间,专门为该应用程序分配一组处理器,每一个线程一个处理器。

这组处理器仅供该应用程序专用,直至该应用程序完成。

4.1.3死锁

1.死锁的概念

所谓死锁是指多个进程因竞争资源而造成的一种僵局,若无外力作用,这些进程都将无法向前推进。

死锁是计算机系统和进程所处的一种状态。

2.产生死锁的原因和必要条件

(1)死锁产生的原因

死锁产生的原因有以下两点:

?

系统资源不足例如在上面的例子中,若系统中有两台打印机或者两台输入设备可供进程P1和P2使用,当其中任一个进程提出设备请求后,立即可得到满足,显然不会出现死锁状态。

这就是说,如果系统中有足够的资源可供每个进程使用,死锁就不会发生。

所以说,产生死锁的根本原因是可供多个进程共亭的系统资源不足。

当然,只有当进程提出资源请求时,才会发生死锁。

进程推讲顺序不当例如在上面的例子中,若进程P2在P1提出使用输入设备的要求之前,已经完成了对输入设备和打印机的使用,并且释放了它们;

或者是在进程P2提出使用打印机的请求之前,进程Pl已经完成了对输入设备和打印机的使用,并且释放了它们,则均不会发生死锁。

(2)死锁产生的必要条件

发生死锁的必要条件有以下四条:

互斥条件:

造程要求对所分配的资源进行排它性控制,即在一段时间内某资源仅为一个进程所占有。

不剥夺条件:

进程所获得的资源在未使用完毕之前,不能被其他进程强行夺走,即只能由获得该资源的进程自己来释放。

部分分配条件:

进程每次申请它所需要的一部分资源。

在等待新资源的同时,进程继续占有己分配到的资源。

环路条件:

存在一种进程资源的循环等待链,链中的每一个进程已获得资源的同时被链中下一个进程所请求。

3.死锁的预防

根据以上讨论,要想防止死锁的发生,只需破坏死锁产生的四个必要条件之一即可。

(1)破坏互斥条件

破坏互斥条件就是要允许多个进程同时访问资源。

但是这受到资源本身固有特性的限制,有些资源根本不能同时访问,只能互斥访问。

比如打印机,就不允许多个进程在其运行期间交替打印数据,打印机只能互斥使用。

因此,企图通过破坏互斥条件防止死锁的发生是不大可能的。

(2)破坏不剥夺条件

为了破坏不剥夺条件,可以制定这样的策略:

一个已获得某些资源的进程,若新的资源请求不能立即得到满足,则它必须释放所有己获得的资源,以后需要再重新申请。

这意味着,一个进程已获得的资源在运行过程中可被剥夺,从而破坏了不剥夺条件。

该策略实现起来比较复杂,释放已获得资源可能造成前一段工作的失效,重复申请和释放资源会增加系统开销,降低系统吞吐量。

(3)破坏部分分配条件

为了破坏部分分配条件,就要求所有进程一次性申请它所需要的全部资源。

若系统有足够的资源分配给进程,便一次把所有的资源分配给该进程。

但在分配时只要有一种资源要求不能满足,则资源全不分配,进程等待。

显然这种资源分配方法造成了严重的资源浪费,以打印机为例,一个作业可能只在最后完成时才需要打印计算结果,但在它运行前就把打印机分配给了它,那么在作业的整个执行过程中打印机完全处于闲置状态。

(4)破坏环路条件

为了破坏环路条件,可以采用有序资源分配法。

即将系统中的所有资源都按类型赋予一个编号,如打印机为1,磁带机为2,等等。

并且要求每一个进程均严格地按照编号递增的次序请求资源。

也就是说,只要进程提出请求资源Ri,则在以后的请求中,只能请求排在Ri后面的那些资源。

为资源编号〉,不能再要求编号低于Ri的那些资源。

对资源请求作了这样的限制后,系统中就不会再出现几个进程对资源的请求成为环路的情况。

这种方法存在的主要问题是各种资源编号后不宜修改,从而限制了新设备的增加:

尽管在为资源编号时己考虑到大多数作业实际使用这些资源的顺序,但也经常会发生作业使用资源的顺序与系统规定顺序不同的情况,从而造成资源的浪费。

4死锁的避免

在预防死锁的方法中所采取的几种策略,总的说来都施加了较强的限制条件,虽然实现起来较为简单,但却严重地损害了系统性能。

在避免死锁的方法中,所施加的限制条件较弱,有可能获得较好的系统性能。

在该方法中,把系统的状态分为安全状态和不安全状态,只要能使系统始终处于安全状态,便可避免死锁的发生。

(1)安全与不安全状态

在避免死锁的方法中,允许进程动态地申请资源,系统在进行资源分配之前,先计算资源分配的安全性。

若此次分配不会导致系统进入不安全状态,便将资源分配给进程,否则进程等待。

若在某一时刻,系统能按某种顺序如〈P1、P2、„、Pn〉来为每个进程分配其所需的资源,直至最大需求,使每个进程都可顺利地完成,则称此时的系统状态为安全状态,称序列〈P1、P2、„、pn>

为安全序列。

若某一时刻系统中不存在这样一个安全序列,则称此时的系统状态为不安全状态。

虽然并非所有不安全状态都是死锁状态,但当系统进入不安全状态后,便可能进入死锁状态:

反之,只要系统处于安全状态,系统便可避免进入死锁状态。

(2)利用银行家算法避免死锁

Dijkstra给出的银行家算法是具有代表性的避免死锁算法。

为实现银行家算法,系统中必须设置若干数据结构。

银行家算法的数据结构如下:

(1)可利用资源向量Available,它是一个含有m个元素的数组,其中的每一个元素代表一类可利用的资源数目,其初始值是系统中所配置的该类全部可用资源数目。

其数值随该类资源的分配和回收而动态地改变。

如果Available(j)=K,表示系统中现有Rj类资源k个。

(2)最大需求矩阵Max,这是一个n×

m的矩阵,它定义了系统中n个进程中的每一个进程对m类资源的最大需求。

如果Max(i,j〉=k,表示进程i需要Rj类资源的最大数目为k。

(3)分配矩阵Allocation,这是一个n×

m的矩阵,它定义了系统中每一类资源当前己分配给每一个进程的资源数。

如果Allocation(i,j)=k,表示进程i当前已分到Rj类资源的数目为k。

Allocationi表示进程i的分配向量,由矩阵Allocation的第i行构成。

(4)需求矩阵Need,它是一个n×

m的矩阵,用以表示每一个进程还需要的各类资源数。

如果NeedG,j〉哇,表示进程i还需要RJ类资源k个,才能完成其任务。

Needi表示进程i

的需求向量,由矩阵Need的第i行构成。

上述三个矩阵间存在关系:

Need(i,j)=Max(i,j)-Allocation(i,j)

银行家算法如下:

Requesti是进程Pi的请求向量。

Requesti(j)=k表示进程Pi请求分配Rj类资源k个。

当Pi发出资源请求后,系统按下述步骤进行检查z

(1)如果Requesti<

=Need,则转向步骤

(2);

否则,认为出错,因为它所需要的资源数已超过它所宣布的最大值。

(2)如果Requesti<

=Available,则转向步骤(3〉;

否则,表示系统中尚无足够的资源满足Pi的申请,Pi必须等待。

(3)系统试探把资源分配给进程Pi,并修改下面数据结构中的数值:

Available=Available-Requesti;

Allocationi=Allocationi+Requesti;

Needi=Needi-Requesti;

(4)系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态。

若安全,才正式将资源分配给进程Pi,以完成本次分配:

否则,将试探分配作废,恢复原来的资源分配状态,让进程Pi等待。

系统所执行的安全性算法描述如下:

(1)设置两个向量。

Work它表示系统可提供给进程继续运行的各类资源数目,它含有m个元素,开始执行安全性算法时,Work=Availabh。

Finish它表示系统是否有足够的资源分配给进程,使之运行完成,开始时,

Finish(i)=false:

当有足够资源分配给进程Pi时,令Finish(i)=true.

(2)从进程集合中找到一个能满足下述条件的进程。

Finish(i〉==false:

Needi<

=Work:

如找到则执行步骤(3〉:

否则,执行步骤(4)。

(3)当进程Pi获得资源后,可顺利执行直到完成,并释放出分配给它的资源,故应执行

Work=work+Allocationi:

Finish(i〉=true:

Gotostep2:

(4)若所有进程的Finish(i)都为true,则表示系统处于安全状态:

否则,系统处于不安全状态。

5(死锁的检测和解除

(1)死锁的检测

前面介绍的死锁预防和避免算法都是在系统为进程分配资源时施加限制条件或进行检测,若系统为进程分配资源时不采取任何措施,则应该提供检测和解除死锁的手段。

发现死锁的原理是考察某一时刻系统状态是否合理,即是否存在一组可以实现的系统状态,能使所有进程都得到它们所申请的资源而运行结束。

检测死锁算法的基本思想是:

获得某时刻t系统中各类可利用资源的数目向量w(t〉,对于系统中的一组进程{Pl、P2、„、pn},找出那些对各类资源请求数目均小于系统现在所拥有的各类资源数目的进程。

我们可以认为这样的进程可以获得它们所需要的全部资源并运行结束,当它们运行结束后释放所占有的全部资源,从而使可用资源数目增加,这样的进程加入到可运行结束的进程序列L中,然后对剩下的进程再作上述考察。

如果一组进程{P1、P2、„、Pn}中有几个进程不在序列

L中,那么它们会发生死锁。

检测死锁可以在每次分配后进行。

但是,用于检测死锁的算法比较复杂,所花的检测时间长,系统开销大,因此,也可以选取比较长的时间间隔来执行。

(2)死锁的解除

一旦系统成为死锁状态,就应将系统从死锁状态解脱出来,即解除死锁,使系统恢复到正常状态。

解除死锁的常用方法有两种:

资源剥夺法:

当发现死锁后,从其他进程剥夺足够数量的资源给死锁进程,以解除死锁状态。

撤消进程法:

此方法是采用强制手段从系统中撤消一个或一部分死锁进程,并剥夺这些进程的资源供其他死锁进程使用。

最简单的撤消进程方法是撤消全部死锁进程,使系统恢复到正常状态。

但这种做法付出的代价太大。

另一方法是按照某种顺序逐个撤消死锁进程,直到有足够的资源供其他未被撤消的进程使用,消除死锁状态为止。

4.2重点难点学习提示

本章的学习目的主要是使学生理解和掌握处理机调度和死锁的基本概念,为此应对以下几个重点、难点问题作认真而深入的学习。

1.高优先权优先调度和基于时间片的轮转调度算法

高优先权优先调度和基于时间片的轮转调度算法是目前被广泛使用的两种进程调度算法,读者应对它们有较深入的理解和掌握。

(1)什么是高优先权优先调度算法:

这是指将处理机分配给就绪队列中优先权最高的进程的调度算法。

在学习时应了解系统是根据哪些因素来确定一个进程的优先权的,在采用动态优先权的系统中又将根据哪些因素来调整运行进程的优先权。

(2)什么是高响应比优先调度算法:

这是指以响应比作为进程的优先权的进程调度算法。

在学习时应了解高响应比优先调度算法是为了解决什么问题而引入的,它有何优缺点。

(3)什么是时间片轮转算法:

这是指让就绪进程以FCFS的方式按时间片轮流使用CPU的调度方式。

在学习时应了解时间片的概念是为了解决什么问题而引入的,它是如何解决上述问题的。

(4)什么是多级反馈队列调度算法:

该算法设置了多个就绪队列,并给每个队列赋予不同的优先权和时间片。

在学习时应了解该算法是如何对各个就绪队列中的进程进行进程调度的,为什么它能较好地满足各种类型用户的需要。

2.常用的几种实时调度算法

根据确定实时任务优先权方法的不同,可形成以下两种常用的实时调度算法:

(1)最早截止时间优先(EDF)算法:

在学习时应了解EDF算法是根据什么来确定任务的优先权的,或者说它是如何保证满足各任务对截止时间的要求的。

(2)最低松弛度优先(LLF)算法:

在学习时应了解LLF算法是根据什么来确定任务的优先级的,在什么情况下,一个进程应抢占被另一进程占用的CPU。

3.多处理机环境下的进程(线程)调度方式

多处理机系统己广为流行多年,目前,己出现了多种多处理机环境下的进程(线程)调度方式,故读者应对下述几种比较有代表性的调度方式有较好的了解:

(1)自调度方式:

自调度方式是多处理机环境下最简单的一种调度方式,在学习时应了解它是如何为就绪进程(线程)分配处理机的,该方式主要有什么优点,以及它存在哪些缺点

(2)成组调度方式:

它将一组相互合作的进程或隶属于同一个进程的一组线程分配到一组处理器上去同时执行,读者应了解为什么成组调度方式的性能会优于自调度方式。

(3)专用处理器分配方式:

这种方式有可能造成部分处理机的严重浪费,读者必须了解在并行程度相当高的多处理器环境下,为什么这种浪费是值得的,它换来了什么好处。

4.死锁的基本概念

死锁是指多个进程竞争资源而形成的一种僵局,若无外力的作用,这些进程将无法再向前推进。

可见,死锁状态不同于一般的阻塞状态。

在学习时,读者应对下述两个问题有较深刻的理解和掌握:

(1)产生死锁的原因是什么:

产生死锁的根本原因是竞争资源和进程推进顺序非法,在学习时应了解这两个根本原

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > IT计算机 > 计算机软件及应用

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1