操作系统学习笔记-处理机调度与死锁

处理机调度与死锁

文章目录

处理机调度的层次和调度算法的目标

在多道程序中,调度的实质是一种资源分配,处理机调度是对处理机资源进行分配。处理机调度算法是指根据处理机分配策略所规定的处理机分配算法

处理机调度的层次

高级调度

高级调度又称长程调度或作业调度,它的调度对象是作业。其主要功能是根据某种算法,决定将外存上处于后备队列中的哪几个作业调入内存,为他们创建进程、分配必要的资源,将它们放入就绪队列。高级调度主要用于多批道处理系统中,而在分时和实时系统中不设置高级调度。

低级调度

低级调度又称长程调度或作业调度,它的调度对象是进程(或内核级线程)。其主要功能是,根据某种算法,决定就绪队列中的哪个进程应获得处理机,并由分派程序将处理机分配给被选中的进程。进程调度是最基本的一种调度,在多批道处理、分时和实时三种类型的OS中,都必须配置这级调度。

中级调度

中级调度又称为内存调度。引入中级调度的主要目的是,提高系统利用率和系统吞吐量。为此,应该把那些暂时不能运行的进程,调至外存等待,此时进程的状态称为就绪驻外存状态(或挂起状态)。当他们已具备运行条件又稍有空闲时,由中级调度来决定,把外存上的那些已具备运行条件的就绪进程再重新调入内存,并修改其状态为就绪状态,挂在就绪队列上等待。中级调度实际上就是存储器管理中的对换功能。

处理机调度算法的目标

处理机调度算法的共同目标
资源利用率

为提高资源利用率,应使系统中的处理机和其他所有资源都尽可能地保持忙碌状态,其中最重要地处理机利用率可用以下方法计算:
C P U 利 用 率 = C P U 有 效 工 作 时 间 / C P U 有 效 工 作 时 间 + C P U 空 闲 等 待 时 间 CPU利用率=CPU有效工作时间/CPU有效工作时间+CPU空闲等待时间 CPU=CPU/CPU+CPU

公平性

公平性时指应使诸进程都获得合理地CPU时间,不会发生进程饥饿现象。公平性是相对地,对相同地进程应获得相同地服务;但对于不同地进程,由于器紧急程度或重要性不同,则应提供不同服务。

平衡性

由于在系统中可能具有多种类型的进程,有的属于计算型作业,有的属于I/O型。为使系统中CPU和各种外部设备都能经常处于忙碌状态,调度算法应尽可能保存系统资源使用的平衡性。

策略强制执行

对所制定的策略其中包括安全策略,只要需要,就必须予以准确的执行,即使会导致某些工作的延迟也要执行。

批处理系统的目标
平均周转时间短

所谓周转时间,是指从作业被提交给系统开始,到作业完成为之的这段时间间隔(称为作业周转时间)。它包括四部分时间:作业在外存后备队列上等待(作业)调度的时间,进程在就绪队列上等待进程调度的时间,进程在CPU上执行的时间,以及进程等待I/O操作完成的时间

系统吞吐量高

由于吞吐量是指再单位时间内系统所完成的作业数,因而它与批处理作业的平均长度有关。事实上,如果单纯是为了获得高的系统吞吐量,就应该尽量多地选择短作业运行

处理机利用率高

对于大、中型计算机,CPU价格十分昂贵,致使处理机地利用率成为衡量系统性能地十分重要地指标;而调度方式和算法又对处理机地利用率起着十分重要地作用。如果单纯是为了使处理机利用率高,应尽量多地选择计算量大地作业运行

分时系统地目标
响应时间快

响应时间快是分时系统中进程调度算法地重要准则。所谓响应时间,是从用户通过键盘提交一个请求开始,直到屏幕上显示出处理结果为之地一段时间间隔。它包括三部分时间:一是请求信息从键盘输入开始,直到将其传送到处理机的时间;二是处理机对请求信息进行处理的时间;三是将所形成的响应信息回送到终端显示器的时间。

均衡性

用户对响应时间的要求并非完全相同。通常用户对较复杂任务的响应时间允许较长,而对较简单的任务的响应时间则要短。所谓均衡性,是指系统响应时间的快慢应与用户所请求服务的复杂性相适应

实时系统的目标
截至时间的保证。

所谓截至时间,是指某任务必须开始执行的最短时间,或必须完成的最迟时间

对于实时系统而言,调度算法的一个主要目标是保证实时任务对截至时间的要求

可预测性

在实时系统中可预测性显得非常重要。例如,在多媒体系统中,无论是电影还是电视剧都应该是连续播放的,这就提供了请求的可预测性

作业与作业调度

批处理系统中的作业

作业和作业步
作业

作业时一个比程序更为广泛的概念,它不仅包含了通常的程序和数据,而且还应配有一份作业说明书,系统根据该说明书来对程序的运行进行控制。在批处理系统中,是以作业为基本单位从外存调入内存的。

作业步

通常,在作业运行期间,每个作业都必须经过若干个相对独立,又相互关联的顺序加工步骤才能得到结果。我们把其中每一个加工步骤称为一个作业步,各作业之间存在着相互联系,往往时上一个作业步的输出作为下一个作业步的输入。

作业控制块

为了管理和调度作业,在多批道处理系统中,为每个作业设置了一个作业控制块JCB,它是作业在系统存在的标志,其中保存了系统对作业进行管理和调度所需要的全部信息。

作业运行的三个阶段和三种状态

作业从进入到系统到运行结束,通常需要经历收容、运行和完成三个阶段。相应的作业也就有后备状态、运行状态和完成状态

作业调度的主要任务

作业调度的主要任务时,根据JCB中的信息,检查系统中的资源能否满足作业对资源的需求,以及按照一定的调度算法,从外存的后备队列中选取某些作业调入内存,并为它们创建进程、分配必要的资源。然后再将新创建的进程排在就绪队列上等待调度。因此,也把作业调度称为接纳调度。在每次执行作业调度时,都需要做出以下两个决定。

接纳多少个作业

在每一次进行作业调度时,应当从后备队列中选取多少作业调入内存,取决于多道程序度,即允许多少个作业同时在内存中运行。多道程序度的确定是根据计算机的系统规模、运行速度、作业大小,以及是否能获得较好的系统性能等情况做出适当的抉择的。

接纳哪些作业

应选择后备队列中的哪些作业调入内存,取决于所采用的调度算法。

先来先服务(FCFS)和短作业优先(SJF)调度算法

先来先服务调度算法

FCFS是最简单的调度算法,该算法既可用于作业调度,也可用于进程调度,系统将按照作业到达的先后次序来进行调度

短作业优先的调度算法

在实际情况中,短作业(进程)占有很大比例,为了能使它们能比长作业优先执行,而产生了短作业优先调度算法。SJF算法是以作业的长短来计算优先级,作业越短,其优先级越高。作业的长短是以作业所需要的运行时间来衡量的。SJF算法可以分别用于作业调度和进程调度

缺点:

1.必须预知作业的运行时间,而即使是程序员也很难准确估计作业的运行时间

2.对长作业不利,长作业的周转时间会明显地增长,更严重的是,该算法完全忽略作业的等待使劲按,可能使作业等待时间过长,出现饥饿现象。

3.在采取FCFS算法时,人机无法实现交互

4.该调度算法完全未考虑作业的紧迫程度,故不能保证紧迫性作业得到及时处理

优先级调度算法和高响应比优先调度算法

优先调度算法

基于作业的紧迫程度,由外部赋予作业相应的优先级,调度算法是根据该优先级进行调度的

高响应比优先调度算法

既考虑了作业的等待时间,又考虑作业运行时间的调度算法,因此既照顾了短作业,又不致使长作业的等待时间过长,从而改善了处理机调度的性能。

实现:

为每个作业引入应该动态优先级,即优先级是可以改变的,令它随时间延长而增加,这使长作业的优先级再等待期间不断地增加。

优先级的变化规律可描述为:
优 先 权 = ( 等 待 时 间 + 要 求 服 务 时 间 ) / 要 求 服 务 时 间 优先权=(等待时间+要求服务时间)/要求服务时间 =+/
由于等待时间与服务时间之和就是系统对该作业的响应时间,故该优先级又相当于响应比。据此,优先又可表示为
优 先 权 = ( 等 待 时 间 + 要 求 服 务 时 间 ) / 要 求 服 务 时 间 = 响 应 时 间 / 要 求 服 务 时 间 优先权=(等待时间+要求服务时间)/要求服务时间=响应时间/要求服务时间 =+/=/

由上式可以看出

1.如果作业的等待时间相同,则要求服务的时间愈短,其优先权愈高,因而类似于SJF,有利于短作业。

2.当要求服务的时间相同时,作业的优先权又决定于其等待时间,因而该算法又类似于FCFS算法。

3.对于长作业的优先级,可以随等待时间的增加而提高,当其等待时间足够长时,也可获得处理机

实现了较好的折中,但每次进行调度之前,都需要先做响应比的计算,会增加系统开销

进程调度

进程调度的任务、机制和方式

进程调度的任务

1.保存处理机的现场信息

2.按某种算法选取进程

3.把处理器分配给进程

进程调度机制

为了实现进程调度,再进程调度机制中,应具有如下三个部分,

1.排队器。为了提高进程调度的效率,应实现将系统中的所有就绪进程按照一定策略排成一个或多个队列,以便调度程序能最快地找到它。

2.分派器。分派器依据进程调度程序所选定地进程,将其从就绪队列中取出,然后进行从分派器到新选出进程间地上下文切换,将处理机分配给新选出地进程。

3.上下文切换器。再对处理机进行切换时,会发生两队上下文切换操作:

(1)第一对上下文切换时,OS将保存当前进程地上下文,即把当前进程地处理机寄存器内容保存到该进程的进程控制块内的相应单元,再装入分派程序的上下文,以便分派程序运行。

(2)第二对上下文切换是移出分派程序的上下文,而把新选进程的CPU现场信息装入处理机的各个相应寄存器中,以便新选进程运行

在进行上下文切换时,需要执行大量的操作指令,以保存寄存器内容。为此,先做已有靠硬件实现的方法来减少上下文切换时间。一般采用两组(或多组)寄存器,其中的一组寄存器供处理机在系统态时使用,另一组寄存器供应用程序使用,在这条件下的上下文切换,只需要改变指针使其指向当前寄存器即可。

在这里插入图片描述

进程调度方式
非抢占方式

在采用这种调度方式时,一旦把处理机分配给某进程之后,就一直让他运行下去,直至进程完成,或发生某事件而被阻塞时,才把处理机分配给其他进程。

该方式下可能引起进程调度的因素可归结于

1.正在执行的进程运行完毕,或因发生某事件而使其无法再继续运行

2.正在执行中的进程因提出I/O请求而暂停执行

3.在进程通信或同步过程中,执行了某种原语操作。

优点:实现简单,系统开销小,适用于大多数的批处理系统。但它不能用于分时系统和大多数实时系统

抢占方式

这种调度方式,允许调度程序根据某种规则,去暂停某个正在执行的过程,将已分配给该进程的处理机重新分配给另一进程。在线代OS中广泛草原抢占方式,这是因为:对于批处理系统,可以防止一个长进程长时间地占用处理机,以确保处理机能为所有进程提供更为公平地服务,在分时系统中,只有抢占方式才有可能实现人机交互。在实时系统中,抢占方式能满足实时任务地要求。但抢占方式比较复杂,系统开销也较大。

主要原则:

1.优先级原则,指允许优先级高地新到进程抢占当前进程地处理机

2.短进程优先原则,指允许新到的短进程可以抢占当前长进程的处理机

3.时间片原则,即各进程按时间片轮转允许时,当正在执行的进程的一个时间片用完后,便停止该进程的执行而重新进行调度。

轮转调度算法

在分时系统中,最简单也是较常用的是基于时间片的轮转调度算法。该算法采取了非常公平的处理机分配方式,即让就绪队列上的每个进程每次仅运行一个时间片。如果就绪队列上有n个进程,则每个进程每次大约都可获得1/n的处理机时间。

轮转法的基本原理

在轮转(RR)法中,系统讲所有的就绪进程按FCFS策略排成一个就绪队列。系统可设置每隔一定时间便产生一次中断,去激活进程调度程序进行调度,把CPU分配给队首进程,并令其执行一个时间片。当它运行完毕后,又把处理机分配给就绪队列中新的队首进程,也让它执行一个时间片。这样,就可以保证就绪队列中的所有进程在确定的时间段内,都能获得一个时间片的处理时间。

进程切换时机

在RR调度算法中,应在何时进行切换,可分为两种情况:

1.若一个时间片尚未用完,正在运行的进程便已经完成,就立即激活调度程序,将他从就绪队列中删除,再调度就绪队列中队首的进程运行,并启动一个新的时间片。

2.在一个时间片用完时,计时器中断处理程序被激活。如果进程尚未运行完毕,调度程序将把它送外就绪队列的末尾

时间片大小的确定

时间片的大小对系统的性能有很大的影响。若选择很小的时间片,将有利于短作业,因为它能在该时间片内完成。但时间片小,意味着会频繁地执行进程调度和进程上下文地切换,这无疑会增加系统地开销。反之,若时间片选择得太长,且为使每个进程都能在一个时间片内完成,RR算法就会退化为FCFS算法,无法满足短作业和交互式用户地需求。一个较为可取地时间片大小是略大于一次典型地交互所需要的时间,使大多数交互式进程能在一个时间哦内完成,从而可以获得较小的响应时间。
在这里插入图片描述
在这里插入图片描述

优先级调度算法

在时间片轮转调度算法中,做了一个隐含的假设,即系统中所有进程的紧迫性是相同的。但实际情况并非如此。为了能满足实际情况的需要,在进程调度算法中引入优先级,而形成优先级调度算法。

优先级调度算法的类型

优先级调度算法,是把处理机分配给就绪队列中优先级最高的进程。

非抢占式优先级调度算法

该算法规定,一旦把处理机分配给就绪队列中优先级最高的进程后,该进程便一直执行下去直至完成,或者因该进程发生某事件而放弃处理机时,系统方可将处理机重新分配给另一优先级最高的进程

抢占式优先调度算法

把处理机分配给优先级最高的进程,使之执行。但在其执行期间,只有出现了另一个其优先级更高的进程,调度程序就将处理机分配给新到的优先级最高的进程。

抢占式的优先级调度算法常用于对实时性要求较高的系统中。

优先级的类型

优先级调度算法的关键在于:应如何确定进程的优先级,以及确定使用静态优先级还是动态优先级。

静态优先级

静态优先级是在创建进程时确定的,在进程的整个运行期间保持不变。优先级是利用某一范围内的一个整数来表示的。确定进程优先级大小的依据有如下三个:

1进程类型。通常系统进程(如接受进程、对换进程)的优先级高于一般用户进程的优先级

2进程对资源的需求。对资源要求少的进程应赋予较高的优先级

3用户要求。根据进程的紧迫程度以及用户所付费用的多少确定优先级

静态优先级法简单易行,系统开销小,但不够精确,可能会出现优先级低的进程长期没有被调用。

动态优先级

动态优先级是指在创建进程之初,先赋予其一个优先级,然后其值随进程的推进或等待事件的增加而改变,以便获得更好的调度性能

多级反馈队列的调度算法

前面介绍的各种用于进程调度的算法,都有一定的局限性。如果未指明进程的长度,则短进程优先和基于进程长度的抢占式调度算法都将无法使用。而下述的多级反馈队列调度算法则不必事先知道各种进程所需的执行时间,还可以较好地满足各种类型进程的需要,因而它是目前公认的一种较好的进程调度算法。

调度机制

多级反馈队列的调度机制可描述如下:

设置多个就绪队列。

在系统中设置多个就绪队列,并未每个队列赋予不同的优先级。第一个队列的优先级最高,其余队列优先级逐个降低。该算法为不同队列中的进程所赋予的执行时间片的大小也各不相同,在优先级愈高的队列中,其时间片就越小。
在这里插入图片描述

每个队列都采用FCFS算法。

当新进程进入内存后,首先将它放入第一个队列末尾,按FCFS原则等待调度。当轮到该进程执行时,如它能在该时间片内完成,便可撤离系统。否则,即他在一个时间片结束时尚未完成,调度程序将其转入第二队列的末尾等待调度……以此类推。当进程最后被降到第n队列后,在第n队列中便采取按RR方式运行。

按队列优先级调度

调度程序首先调度最高优先级队列中的诸进程运行,仅当第一队列空闲时才调度第二队列中的进程运行;换言之,仅当1-(i-1)所有队列均空时,才会调度第i队列中的进程运行。如果处理机正在第i队列中为某进程服务时又有新进程进入任一优先级较高的队列,此时须立即把正在运行的进程放回到第i队列末尾,而把处理机分配给新到的高优先级进程。

调度算法的性能

在多级反馈队列调度算法中,如果规定第一个队列的时间片略大于多数人机交互所需之处理时间时,便能较好地满足各种类型用户的需要。

终端型用户

由于终端用户提交的作业属于多交互型作业,通常较小,系统只要能使这些作业在第一队列规定的时间片内完成,便可使终端型用户感到满意。

短批处理作业用户

对于这类作业,如果可在第一队列中执行完成,便获得与终端型作业一样的响应时间。对于稍长的短作业,也只需要在第二和第三队列各执行一时间片完成,其周转时间仍然较短。

长批处理作业用户

对于长作业,它将依次在第1,2,……n个队列中运行,然后再按轮转方式运行,用户不必担心其作业长期得不到处理

死锁概述

资源问题

在系统中有许多不同类型的资源,其中可以引起死锁的主要是,需要采用互斥访问方法的、不可以被抢占的资源,即在前面介绍的临界资源。系统中这类资源有很多,如打印机、数据文件、队列、信号量等。

可重用性资源和消耗性资源
可重用性资源

可重用性资源是一种可供用户重复使用多次的资源,它具有如下性质:

1.每一个可重用性资源中的单元只能分配给一个进程使用,不允许多个进程共享

2.进程在使用可重复性资源时,按照这样的顺序:1.请求资源。如果请求资源失败,请求进程将会被阻塞或循环等待。2.使用资源。进程对资源进行操作,如打印机进行打印3.释放资源。当进程使用完后自己释放资源

3.系统中每一类可重用性资源中的单元数目都是固定的,进程运行期间既不能创建也不能删除它

对资源的请求和释放通常都是利用系统调用来实现的。进程在每次提出资源请求后,系统在执行时都需要做一系列的工作。计算机系统中大多数资源都说属于可重用性资源

可消耗性资源

可消耗资源又称为临时性资源,它是在进程运行期间,由进程动态地创建和消耗的,它具有如下性质:

1.每一类可消耗性资源的单元数目在进程运行期间时可以不断变化地。

2.进程在运行过程中,可以不断地创造可消耗性资源的单元,将它们放入该资源类的缓冲区中,已增加该资源类的单元数目

3.进程在运行过程中,可以请求若干个可消耗性资源单位,用于进程自己的消耗,不再将它们返回给该资源类中。

可消耗性资源通常是由生产者进程创建,由消费者进程消耗。最典型的可消耗性资源就是用于进程间通信的消息等。

可抢占性资源和不可抢占性资源
可抢占性资源

是指某进程在多的这类资源后,该资源可以被其他进程或系统抢占。例如优先级高的进程可以抢占优先级低的进程的处理机。又如可把一个进程从一个存储区转移到另一个存储区,在内存紧张时,还可将一个进程从内存调出到外存上,即抢占该进程在内存的空间。可见,CPU和主存均可属于可抢占性资源。对于这类资源是不会引起死锁的。

不可抢占性资源

即一旦系统把某资源分配给该进程后,就不能将它强行收回,只能在进程用完后自行释放。

计算机系统中的死锁

死锁的起因,通常是源于多个进程对资源的争夺,不仅对不可抢占资源进行争夺时会引起死锁,而且对可消耗性资源进行争夺时,也会引起死锁

竞争不可抢占性资源引起死锁

通常系统中所拥有的不可抢占性资源其数目不足以满足多个进程运行的需要,使得进程在运行过程中,会因争夺资源而陷入僵局。

竞争可消耗性资源引起死锁

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2ibJwcom-1585555747401)(D:\markdown\image\操作系统\3-5竞争可消耗资源引起死锁.png)]

进程推进顺序不当引起死锁

进程在运行过程中,对资源进行申请和释放的顺序是否合法,也是在系统中是否会产生死锁的一个重要因素。

在这里插入图片描述
在这里插入图片描述

死锁的定义、必要条件和处理方法

死锁的定义

在一组进程发生死锁的情况下,这组死锁进程中的每一个进程,都在等待另一个死锁进程所占有的资源(每个进程所等待的事件是该组中其他进程释放所占有的资源)。但由于所有这些进程已都无法运行,因此它们谁也不能释放资源,致使没有任何一个进程可被唤醒。

由此可对死锁做出如下定义:如果一组进程都在等待仅由改组进程中的其他进程才能引发的事件,那么该组进程是死锁的

产生死锁的必要条件
互斥条件

进程对所分配到的资源进行排它性使用,即在一段时间内,某资源只能被一个进程占用。如果此时还有其他进程请求该资源,则请求进程只能等待,直至占有该资源的进程用毕释放。

请求和保持条件

进程已经保持了至少应该资源,但又提出了新的资源请求,而该资源已被其他进程占有,此时请求进程被阻塞,但对自己已获得的资源保持不放。

不可抢占条件

进程以获得的资源在未使用完之前不能被抢占,只能在进程使用完成由自己释放。

循环等待条件

在发生死锁时,必然存在一个进程-资源循环链,即进程集合{p0…pn}中的p0在等待p1占有的资源,p1等待p2,pn等待p0

处理死锁的方法
预防死锁

通过设置某些限制条件,去破坏产生死锁四个必要条件中的一个或几个来预防产生死锁。预防死锁时一种比较容易实现的方法,已被广泛使用。

避免死锁

同样是属于实现预防策略,在资源的动态分配过程中,用某种方法防止系统进入不安全状态

检测死锁

这种方法无需事先采取任何限制性措施,允许进程在运行过程中发生死锁。但可通过检测机构及时地检测出死锁地发生,然后采用适当地措施,把进程从死锁中解脱出来

解除死锁

常用地方法是撤销一些进程, 回收它们的资源,将它们分配给已处于阻塞状态的进程,使其能继续运行。

上述四种方法,从1-4对死锁的防范程度逐渐减弱,但对应的是资源利用率的提高,以及进程因资源而阻塞的频度下降(即并发程度提高)

预防死锁

预防死锁的方式是通过破坏产生四个必要条中的一个或几个,以避免发生死锁。由于互斥条件是非共享设备所必须的,不仅不能改变,还应加以保证,因此主要是破坏产生死锁的后三个条件

破坏请求和保持条件

为了能破坏此条件,系统必须保证做到:当一个进程请求资源时,它不能持有不可抢占资源。该保证可通过如下两个不同地协议实现:

第一种协议

所有进程在开始运行之前,必须一次性地申请其在整个运行过程中所需地全部资源,其在运行期间,便不会提出资源要求,从而破坏了“请求”条件。而在等待期间,未占有任何资源,于是破坏了“保持”条件,从而可以预防死锁发生

优点:简单、易行、安全

缺点:

1.资源严重浪费,严重地恶化了资源地利用率

2.进程经常会发生饥饿现象

第二种协议

该协议是对的一种协议的改进,它允许一个进程只获得运行初期所需要的资源后,便开始运行。进程运行过程中,再逐步释放已分配给自己的,且已用毕的全部资源,然后再请求新的所需资源。这不仅能使进程更快地完成任务,提高设备地利用率,还可减少进程发生饥饿地几率

破坏不可抢占条件

为了破坏不可抢占条件,协议中规定,当一个已经保持了某些不可被抢占资源地进程,提出新的资源请求而不能得到满足时,它必须释放已经保持地所有资源,待以后需要时再重新申请。这意味着进程已占用地资源会被暂时地释放,或者说是被抢占了,从而破坏了不可抢占条件

该方式实现起来比较复杂,且需要付出很大的代价。这种策略还可能因为反复地申请和释放资源致使进程地执行被无限地推迟,这不仅延长了进程地周转时间,而且也增加了系统开销,降低了系统吞吐量。

破坏循环等待条件

一个能保证循环等待条件不成立地方法是,对系统所有资源类型进行线性排序,并赋予不同的序号。再对系统所有资源类型进行线性排序后,便可次啊用这样地预防协议:规定每个进程必须按序号递增的顺序请求资源。一个进程再开始时,可以请求某类资源Ri的单元。以后,当且仅当F(Rj)>F(Ri)时,进程才可以请求资源Rj的单元。如果协议多个同类资源单元,则必须一起请求。

事实上总有一个进程占据了较高序号的资源,此后它继续申请的资源必然是空闲的,因而进程可以一直向前推进

这种策略与前两种策略比较,其资源利用率和系统吞吐量都有较明显的改善。

但也存在下述问题:首先,为系统中各类资源所规定的序号必须相对稳定,这就限制了新类型设备的增加:其次,尽管在为资源的类型分配序号时,已经考虑到大多数作业再实际使用这些资源时的顺序,但也经常会发生这种情况:作业使用各类资源的顺序和系统规定的顺序不同,造成资源的浪费。第三,按这种规定次序申请资源的方法会限制用户简单自主的编程。

避免死锁

在避免死锁方法中,把系统分为安全状态和不安全状态。当系统处于安全状态时,可避免发生死锁。反之,当系统处于不安全状态时,则可进入到死锁状态

安全状态

在该方法中,允许进程动态地申请资源,但系统在进行资源分配之前,应先计算此次资源分配地安全性。若此次分配不会导致系统进入不安全状态,才可将资源分配给进程,否则,另进程等待。所谓安全状态,是指系统能按某种进程推进顺序(p1…pn)为每个进程分配其所需资源,直至满足每个进程对资源的最大需求,使每个进程都可顺利地完成。此时称此序列为安全序列。比赛所有不安全状态都必然会转为死锁状态。

银行家算法

为了实现银行家算法,每一个新进程在进入系统时,它必须申明在允许过程中,可能需要每种资源类型的最大单元数目,其数目不应该超过系统所拥有的资源总量。当进程请求一组资源时,系统必须首先确定是否有足够的资源分配给该进程。若有,再进一步计算在将这些资源分配给进程后,是否会使系统处于不安全状态。如果不会,才将资源分配给他,否则让进程等待。

银行家算法中的数据结构

1.可利用资源向量Available。这是一个含有m个元素额数组,其中的每一个元素代表一类可利用的资源数目,其初始值是系统中所配置的该类全部可用资源的数目,其数值随着该类资源的分配和回收而动态的改变。

2.最大需求举证Max。这是一个n*m的矩阵,它定义了系统中n个进程中的每一个进程对m类资源的最大需求。

3.分配矩阵Allocation。这是一个n*m的矩阵,它定义了系统中每一类资源当前已分配给每一个进程的资源数。

4.需求矩阵need。这是一个n*m的矩阵,用以表示每一个进程尚需的各类资源数。

need[i,j]=max[i,j]-Allocation[i,j]

银行家算法

设Request i 是进程Pi的请求向量,如果Request i [j]=K,表示进程Pi需要K个Rj类型的资源。当Pi发出资源请求后:

1.如果Request i[j]<=Need[i,j],便转向步骤2,否则认为出错,因为它所需要的资源数已超过它所宣布的最大值

2.如果Request i[j]<=Available[i,j],便转向步骤3,否则,表示尚无足够资源,Pi必须等待

3.系统试探着把资源分配给进程Pi:

Avaliable[j]=Avaliable[j]-Request i[j]

Allocation[i,j]=Allocation[i,j]+Request i[j]

Need[i,j]=Need[i,j]-Request i[j]

4.系统执行安全性算法,检查此次资源分配后系统是否处于安全状态。若安全,才正式将资源分配给进程Pi,以完成本次分配;否则,将本次的试探分配作废,恢复原来的资源分配状态,让Pi等待。

安全性算法

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

1.设置两个向量

1.工作向量Work,它表示系统可提供给进程继续运行所需的各类资源数目,它含有m个元素,在执行安全算法开始时,Work:=Available

2.Finish:它表示系统是否有足够的资源分配给进程,使之运行完成。开始先做Finish[i]:=false;当有足够资源分配给进程时,再令Finish[i]:=true。

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

1.Finish[i]=false;

2.Need[i,j]<=Work[j]

若找到,执行步骤3,否则执行步骤4

3当进程Pi获得资源后

可顺利执行直至完成,并释放出分配给它的资源,故应执行:

Work[j]=Work[j]+Allocation[i,j];

Finish[i]=true

go to step 2;

4.判断finsh[i]

如果所有进程的Finish[i]=true都满足,则表示系统处于安全状态,否则,系统处于不安全状态。

死锁的检测与解除

如果在系统中,既不采取死锁预防措施,也未配有死锁避免算法,系统可能会发生死锁,在这种情况下系统应当提供两个算法:

1.死锁检测算法

2死锁解除算法

死锁的检测

资源分配图
死锁定理
死锁检测中的数据结构

死锁的解除

终止进程的方法

nish:它表示系统是否有足够的资源分配给进程,使之运行完成。开始先做Finish[i]:=false;当有足够资源分配给进程时,再令Finish[i]:=true。

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

1.Finish[i]=false;

2.Need[i,j]<=Work[j]

若找到,执行步骤3,否则执行步骤4

3当进程Pi获得资源后

可顺利执行直至完成,并释放出分配给它的资源,故应执行:

Work[j]=Work[j]+Allocation[i,j];

Finish[i]=true

go to step 2;

4.判断finsh[i]

如果所有进程的Finish[i]=true都满足,则表示系统处于安全状态,否则,系统处于不安全状态。

死锁的检测与解除

如果在系统中,既不采取死锁预防措施,也未配有死锁避免算法,系统可能会发生死锁,在这种情况下系统应当提供两个算法:

1.死锁检测算法

2死锁解除算法

死锁的检测

资源分配图
死锁定理
死锁检测中的数据结构

死锁的解除

终止进程的方法
付出最小代价的死锁解除算法
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

curtain灬、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值