上节回顾
- 进程的基本概念
- 进程控制
- 进程同步
- 经典进程的同步问题
- 进程通信
- 线程
重点:
1)进程状态转换
2)信号量机制
3)同步问题
目录
3.1 处理机调度的层次和调度算法的目标
3.2 作业和作业调度
3.3 进程调度
3.4 实时调度
3.5 死锁概述
3.6 预防死锁
3.7 避免死锁
3.8 死锁的检测与解除
3.1 处理机调度的层次和调度算法的目标
分配处理机的任务是由处理机调度程序完成的。
由于处理机是最重要的计算机资源,提高处理机的利用率及改善系统性能(吞吐量、响应时间),在很大程度上取决于处理机调度性能的好坏。
三种调度层次:
1)高级调度(作业调度,长程调度)
2)低级调度(进程调度,短程调度)
3)中级调度(中程调度)
1. 高级调度
称为作业调度、长程调度(Long-term scheduling) ,用于决定把外存上处于后备队列中的哪些作业调人内存,并为它们创建进程、分配必要的资源,然后,再将新创建的进程排在就绪队列上,准备执行 。
高级调度需要考虑两个问题
1.选择多少个作业进入内存,为之创建进程?
- 取决于多道程序的度,即允许同时在内存中运行的进程数。
2.选择哪些作业?
- 取决于高级调度算法
3.1.1 处理机调度的层次
2. 低级调度
又称进程调度或短程调度(Short-term scheduling) 。低级调度用来决定就绪队列中的哪个进程应获得处理机,然后再由分派程序把处理机分配给该进程的具体操作。
功能:
保存处理机的现场信息。
(2) 按某种算法选取进程。
(3) 把处理器分配给进程。
进程调度可采用非抢占和抢占两种调度方式。
1)非抢占方式
在采用这种调度方式时,一旦把处理机分配给某进程后,便让该进程一直执行,直至该进程完成或发生某事件而被阻塞时,才再把处理机分配给其他进程,决不允许某进程抢占已经分配出去的处理机。
引起进程调度的因素可归结为这样几个:
①正在执行的进程执行完毕,或因发生某事件而不能再继续执行;
②执行中的进程因提出I/O请求而暂停执行;
③在进程通信或同步过程中执行了某种原语操作,如P操作(wait操作)、Block原语、 Wakeup原语等。
优点:实现简单,系统开销小,适合批处理任务。
缺点:难以满足实时任务
2)抢占方式
这种调度方式,允许调度程序根据某种原则,去暂停某个正在执行的进程,将已分配给该进程的处理机重新分配给另一进程。
抢占的原则有:
(1)优先权原则。
(2)短作业(进程)优先原则。
(3)时间片原则。
3. 中级调度
中级调度 (Medium-term scheduling) 、中程调度,引入中级调度的主要目的是为了提高内存利用率和系统吞吐量。
决定把外存上的哪些又具备运行条件的就绪进程,重新调入内存,并修改其状态为就绪状态,挂在就绪队列上等待调度。
引入中级调度的主要目的,是为了提高内存利用率和系统吞吐量。实际上是存储器管理的对换功能。
只有支持进程挂起的操作系统才具有中程调度功能。
3.1.2 处理机调度算法的目标及准则
1.面向用户的准则 :这是为了满足用户的需求所应遵循的一些准则。其中,比较重要的有以下几点。
(1)周转时间短。
所谓周转时间,是指从作业被提交给系统开始,到作业完成为止的这段时间间隔(称为作业周转时间)。
所谓周转时间包括四部分时间:
①作业在外存后备队列上等待调度的时间
②进程在就绪队列上等待进程调度的时间
③进程在CPU上执行的时间
④进程等待I/O操作完成的时间
① 平均周转时间描述为:
② 带权周转时间:作业的周转时间 / 系统为其提供服务的时间
平均带权周转时间则可表示为:
(2)响应时间快
所谓响应时间,是从用户通过键盘提交一个请求开始,直至系统首次产生响应为止的时间。
响应时间包括三部分时间:
①从键盘输入的请求信息传送到处理机的时间
②处理机对请求信息进行处理的时间
③将所形成的响应信息回送到终端显示器的时间
(3)截止时间的保证
所谓截止时间,是指某任务必须开始执行的最迟时间,或必须完成的最迟时间。
(4)优先权准则
基于优先权让某些紧急的作业能得到及时处理。
在要求较严格的场合,往往还须选择抢占式调度方式,才能保证紧急作业得到及时处理。
2.面向系统的准则
(1)系统吞吐量高。吞吐量是指在单位时间内,系统所完成的作业数。
(2)处理机利用率好。
(3)各类资源的平衡利用。
3.2 作业和作业调度
多道批处理系统:
1、用户提交作业
2、操作员输入作业,存放在外存,作业存放在后备队列
3、由作业调度(长程调度)程序调入内存
3.2.1 批处理系统中的作业
1、 作业(job)和作业步(job step)
2、作业控制块(JCB)
包含:作业标识、用户名称、用户账号、作业类型、作业状态、调度信息、资源需求、资源使用情况等
3、作业运行的三个阶段和三种状态
1)收容阶段—后备状态
2)运行阶段 – 运行状态
3)完成阶段 – 完成状态
3.2.2 作业调度的主要任务
作业调度的主要任务:根据JCB信息,检查系统中的资源能否满足作业对资源的需求,按照一定的调度算法,从外存的后备队列中选取某些作业调入内存,并为他们创建进程、分配必要资源,安排在就绪队列。
作业调度需要作出以下决定:
1、接纳多少个作业
2、接纳哪些作业
3.2.3 FCFS和SJF调度算法
1、先来先服务调度算法(First Come First Service,FCFS)
FCFS算法比较有利于长作业(进程),而不利于短作业(进程)。
FCFS算法举例:下表列出了A、B、C、D四个作业分别到达系统的时间、要求服务的时间、开始执行的时间及各自的完成时间,并计算出各自的周转时间和带权周转时间。
2.短作业优先调度算法(short job first)
短作业(进程)优先调度算法SJ(P)F,是指对短作业或短进程优先调度的算法。
短作业优先(SJF)的调度算法是从后备队列中选择一个或若干个估计运行时间最短的作业,将它们调入内存运行。
SJF:外存 内存
而短进程优先(SPF)调度算法是从就绪队列中选出一个估计运行时间最短的进程,将处理机分配给它,使它立即执行并一直执行到完成,或发生某事件而被阻塞放弃处理机时再重新调度。
SPF:就绪队列 处理机执行
短作业优先调度算法的缺点:
(1)该算法对长作业不利。
(2)该算法完全未考虑作业的紧迫程度,因而不能保证紧迫性作业(进程)会被及时处理。
(3)由于作业(进程)的长短只是根据用户所提供的估计执行时间而定的,而用户又可能会估计不准运行时间,致使该算法不一定能真正做到短作业优先调度。
3.2.4 优先级调度算法和高响应比调度算法
1.优先级调度算法(priority-scheduling algorithm)
实际应用中,作业的性质可能是不同,运行的迫切性也有所不同。因此,可以为每个作业定义一个优先级,优先级越高的作业将优先获得调度从后备队列进入内存就绪队列之中。
当应用于作业调度时,优先级调度算法是把具有最高优先级的作业调入内存之中。
当应用于进程调度时,优先级调度算法是调度就绪队列中具有最高优先级的进程获得处理机。
2.高响应比优先调度算法
引入动态优先级,随等待的时间延长而增加
优点:该算法既照顾了短作业,又考虑了作业到达的先后次序,不会使长作业长期得不到服务。
缺点:利用该算法时,每次调度之前,都须先做响应比的计算,会增加系统开销。
3.3 进程调度
3.3.1 进程调度的任务、机制和方式
1.进程调度的任务
1)保存处理机现场
2)按照某种算法选取进程
3)把处理机分配给进程
2. 进程调度机制
1)排队器
2)分派器
3)上下文切换器
3. 进程调度的方式
1)非抢占方式(Nonpreemptive Mode)
在这种方式下,系统一旦把处理机分配给就绪队列中优先权最高的进程后,该进程便一直执行下去,直至完成;或因发生某事件使该进程放弃处理机时,系统方可再将处理机重新分配给另一优先权最高的进程。
2)抢占方式(Preemptive Mode)
在这种方式下,系统同样是把处理机分配给优先权最高的进程,使之执行。但在其执行期间,只要又出现了另一个其优先权更高的进程,进程调度程序就立即停止当前进程的执行,重新将处理机分配给新到的优先权最高的进程。
“抢占”的原则:
优先权原则
短进程优先原则
3.3.2 轮转调度算法
时间片原则
时间片轮转法(Round Robin,RR)
在时间片轮转法中,系统将所有的就绪进程按先来先服务的原则,排成一个队列,每次调度时,把CPU分配给队首进程。并令其执行一个时间片。
当执行的时间片用完时,由一个计时器发出时钟中断请求,调度程序便据此信号来停止该进程的执行,并将它送往就绪队列的末尾;然后,再把处理机分配给就绪队列中新的队首进程,同时也让它执行一个时间片。
这样就可以保证就绪队列中的所有进程,在一给定的时间内,均能获得一时间片的处理机执行时间,换言之,系统能在给定的时间内,响应所有用户的请求。
时间片的设置问题
进程切换将会增加系统的额外开销。
时间片设定得太短,进程切换会非常频繁,从而降低处理机的效率;时间片设定得太长,将无法满足交互式用户对响应时间的要求。
因此,时间片大小的确定应综合考虑系统的最大用户数、响应时间、系统效率等多种因素。
实例:
采用基于时间片轮转调度算法调度上例的5个进程(A,B,C,D和E),运行时间分别为4、3、4、2、4,并分别按照两种时间片大小轮转调度(1个单位时间和4和单位时间),分析该算法的性能。
首先按照进程到达的先后顺序组织就绪队列,即ABCDE。
从队首开始调度,首先调度A,执行一个时间片,强行中断A,A回到就绪队列队尾排队;
切换到B,执行一个时间片,强行中断B,B回到就绪队列队尾排队(排在A之后)
…
为了简单,图中忽略了进程切换时的系统开销,而实际操作系统中,这类额外开销是客观存在的。
采用基于时间片轮转调度法,进程的周转时间和平均周转时间并不比采用FCFS和短进程优先调度算法小。
加上进程切换所需的系统开销时间,该算法的平均周转时间还会增长。
常用于分时系统及事务处理系统,合理的时间片大小将带来满意的响应时间。
通常,合理的时间片指,能让80%左右的进程在一个时间片内完成。
对于短的、计算型的进程较有利。
不适合于批处理系统的进程调度。
不利于I/O型的进程。
改进的方法之一,可以将I/O阻塞事件完成的进程单独组织一个就绪队列,该队列进程的时间片可以设置的小一些,且优先调度。
3.3.3 优先级调度算法
1、优先级调度算法的类型
(1)非抢占式优先级调度算法
(2)抢占式优先级调度算法
如何设定进程的优先级呢?
进程完成功能的重要性
进程完成功能的急迫性
为均衡系统资源的使用,指定进程(作业)优先级
进程对资源的占用程度。例如,可以为短进程(或作业)赋予较高的优先级。
2、优先级的类型
(1)静态优先级
(2)动态优先级
(1)静态优先级
静态优先级是在创建进程时确定的,且在进程的整个运行期间保持不变。
确定进程优先级的依据有三个方面:
进程类型。系统进程的优先权高于一般用户进程的优先权。
进程对资源的需求。对要求少的进程应赋予较高的优先权。
用户要求。
(2)动态优先级
动态优先级是指,在创建进程时所赋予的优先权,是可以随进程的推进或随其等待时间的增加而改变的,以便获得更好的调度性能。
3.3.4 多队列调度算法
将进程的就绪队列拆分为多个
不同类型或性质的进程固定分配在对应的就绪队列
不同的就绪队列采用不同的调度算法
进程可以有不同的优先级、队列也可以有不同的优先级
3.3.5 多级反馈队列调度算法
多级反馈队列调度算法实施过程如下:
(1)应设置多个就绪队列,并为各个队列赋予不同的优先级。 第一个最高,以后依次降低。
(2)当一个新进程进入内存后,首先将它放入第一队列的末尾,按FCFS原则排队等待调度。
①当轮到该进程执行时,如它能在该时间片内完成,便可准备撤离系统;
②如果它在一个时间片结束时尚未完成,调度程序便将该进程转入第二队列的末尾,再同样地按FCFS原则等待调度执行;
③如果它在第二队列中运行一个时间片后仍未完成,再依次将它放入第三队列,……。
(3)仅当第一队列空闲时,调度程序才调度第二队列中的进程运行。
多级反馈队列调度算法的性能:
多级反馈队列调度算法具有较好的性能,能较好地满足各种类型用户的需要。
(1)终端型作业用户
能在第一队列所规定的时间片内完成,可使终端型作业用户都感到满意。
(2)短批处理作业用户有利
(3)长批处理作业用户
对于长作业,它将依次在第1,2,…,n个队列中运行,然后再按轮转方式运行,用户不必担心其作业长期得不到处理。
进程调度算法小结
如何选择进程调度算法与系统设计的目标有关。
交互式多任务系统,主要考虑联机用户对响应时间的要求,一般采用基于时间片轮转调度算法,同时,根据进程的性质设置不同的优先级。
批处理系统往往以进程(或作业)的平均周转时间来衡量调度性能,常选用基于优先级的短进程(或作业)优先调度算法。
3.4 实时调度
由于在实时系统中都存在着若干个实时进程或任务,它们用来反应或控制某个外部事件,往往带有某种程度的紧迫性,因而对实时系统中的调度提出了某些特殊要求,前面所介绍的多种调度算法,并不能很好地满足实时系统对调度的要求,为此,需要引入一种新的调度,即实时调度。
3.4.1 实现实时调度的基本条件
1.提供必要的信息
(1)就绪时间。这是该任务成为就绪状态的起始时间。
(2)开始截止时间和完成截止时间。
(3)处理时间。这是指一个任务从开始执行直至完成所需的时间。
(4)资源要求。
(5)优先级。
2.系统处理能力强
在实时系统中,通常都有着多个实时任务。若处理机的处理能力不够强,则有可能因处理机忙不过来而使某些实时任务不能得到及时处理。
解决的方法是提高系统的处理能力,其途径有二:
其一仍是采用单处理机系统,但须增强其处理能力,以显著地减少对每一个任务的处理时间;
其二是采用多处理机系统。
3.采用抢占式调度机制
在含有硬实时任务的实时系统中,广泛采用抢占机制。当一个优先权更高的任务到达时,允许将当前任务暂时挂起,而令高优先权任务立即投入运行,这样便可满足该硬实时任务对截止时间的要求。
4.具有快速切换机制
(1)对外部中断的快速响应能力。
(2)快速的任务分派能力。
3.4.2 实时调度算法的分类
1.非抢占式调度算法
(1)非抢占式轮转调度算法: 调度程序每次选择队列中的第一个任务投入运行。当该任务完成后,便把它挂在轮转队列的末尾,等待下次调度运行。
(2)非抢占式优先调度算法: 如果在系统中存在着实时要求较为严格的任务,则可采用非抢占式优先调度算法,为这些任务赋予较高的优先级。当这些实时任务到达时,把它们安排在就绪队列的队首,等待当前任务自我终止或运行完成后,才能被调度执行。
2.抢占式调度算法
(1)基于时钟中断的抢占式优先权调度算法: 某实时任务到达后,如果该任务的优先级高于当前任务的优先级,这时并不立即抢占当前任务的处理机,而是等到时钟中断到来时,调度程序才剥夺当前任务的执行,将处理机分配给新到的高优先权任务。
(2)立即抢占的优先权调度算法: 一旦出现外部中断,只要当前任务未处于临界区,便能立即剥夺当前任务的执行,把处理机分配给请求中断的紧迫任务。
3.4.3 常用的几种实时调度算法
1. 最早截止时间优先EDF(Earliest Deadline First) 算法
该算法要求在系统中保持一个实时任务就绪队列,该队列按各任务截止时间的早晚排序;具有最早截止时间的任务排在队列的最前面。调度程序总是选择就绪队列中的第一个任务,为之分配处理机,使之投入运行。
1) EDF算法用于非抢占调度的调度方式
2) 抢占式调度方式用于周期实时任务
松弛度=必须完成时间-本身的运行时间-当前时间
*2.最低松弛度优先LLF(Least Laxity First)算法
该算法按松弛度排序实时任务的就绪队列,松弛度值最小的任务排在队列最前面,调度程序总是选择就绪队列中的队首任务执行。
假如在一个实时系统中,有两个周期性实时任务A和B任务,A要求每20ms执行一次,执行时间为10ms;任务B只要求每50ms执行一次,执行时间为25ms。
A和B任务每次必须完成的时间
利用LLF算法进行调度的情况
抢占方式和时机
当等待任务的松弛度值为0时才进行抢占(如20ms时虽然A2的松弛度比B1的松弛度小,但A2并没有抢占B1)。
当有任务执行时,只有等待任务的松弛度值为0才会发生任务的调度,其他情况不发生调度。
任务执行结束后或无任务执行时,再比较等待任务的松弛度值,较小的先执行。
3.5 死锁概述
3.5产生死锁的原因和必要条件
所谓死锁(Deadlock),是指多个进程在运行过程中因争夺资源而造成的一种僵局(Deadly- Embrace),当进程处于这种僵持状态时,若无外力作用,它们都将无法再向前推进。
3.5.1 资源问题
可重用性资源和消耗性资源。
可抢占性资源和不可抢占性资源
1 可重用性资源和消耗性资源
可重用性资源
(1)每一个可重用资源中的单元只能分配给一个进程使用,不允许多个进程共享;
(2)进程在使用该类资源过程中,须按照下列顺序:请求,使用,释放。
(3)系统中每一类可重用资源中的单元数目是相对固定的,进程在运行期间既不能创建也不能删除它。
可消耗性资源--临时性资源,其在进程运行期间,由进程动态地创建和消耗的
(1)每一类可消耗性资源的单元数目在运行期间是不断变化的;
(2)进程在运行过程中,可以不断地创造可消耗性资源的单元。
(3)进程在运行过程中,可以请求若干个可消耗性资源单元
典型的是消息
2 可抢占性资源和不可抢占性资源
可抢占性资源
某进程在获得这类资源后,该资源可以再被其他进程或系统剥夺。
优先权高的进程可以剥夺优先权低的进程的处理机。
内存区可由存储器管理程序把一个进程从一个存储区移到另一个存储区,此即剥夺了该进程原来占有的存储区。甚至可将一个进程从内存调出到外存上。
CPU和主存均属于可剥夺性资源。
不可抢占性资源
当系统把这类资源分配给某进程后,再不能强行收回,只能在进程用完后自行释放。
如磁带机、打印机等。
3.5.2 计算机系统中的死锁
产生死锁的原因可归结为如下两点。
(1)竞争资源。
(2)进程间推进顺序非法。
1.竞争资源引起进程死锁
(1)竞争不可抢占性(非剥夺性)资源
在系统中所配置的非剥夺性资源,由于它们的数量不能满足诸进程运行的需要,会使进程在运行过程中,因争夺这些资源而陷入僵局。
例如,系统中只有一台打印机R1和一台磁带机R2,可供进程P1和P2共享。处理不好,在P1与P2之间会形成僵局,引起死锁。
(2)竞争可消耗性(临时性)资源
永久性资源:可顺序重复使用型资源称为永久性资源。
临时性资源,是指由一个进程产生,被另一进程使用一暂短时间后便无用的资源,故也称之为消耗性资源,它也可能引起死锁。
例如:S1、S2和S3是临时性资源,由进程P1、P2和P3产生的消息。如果消息通信处理顺序不当也会发生死锁。
正确的顺序
P1: …
Release(S1);Request(S3);
…
P2: …
Release(S2); Request(S1);
…
P3: …
Release(S3); Request(S2);
…
错误顺序
P1: …Request(S3); Release(S1); …
P2: …Request(S1); Release(S2); …
P3: …Request(S2); Release(S3); …
2.进程推进顺序不当引起死锁
1)进程推进顺序合法
进程推进顺序是合法不会引起进程死锁的。
2)进程推进顺序非法
若并发进程P1和P2推进顺序不合法,进入不安全状态,于是发生了进程死锁
3.5.3 死锁的必要条件和处理方法
产生死锁的必要条件
★死锁的发生必须具备下列四个必要条件:
(1)互斥条件
(2)请求和保持条件
(3)不剥夺条件
(4)环路等待条件
处理死锁的方法
(1)预防死锁:破坏产生死锁的四个必要条件中的一个或几个条件。
(2)避免死锁:用某种方法去防止系统进入不安全状态。
(3)检测死锁:及时地检测出死锁的发生,确定有关的进程和资源。
(4)解除死锁:撤消或挂起一些进程。
3.6 预防死锁
预防死锁的方法是使四个必要条件中的第2、3、4条件之一不能成立,来避免发生死锁。
至于必要条件1,因为它是由设备的固有属性所决定的,不仅不能改变,还应加以保证。
3.6.1 摒弃“请求和保持”条件
系统规定所有进程在开始运行之前,都必须一次性地申请其在整个运行过程所需的全部资源。这样,该进程在整个运行期间:便不会再提出资源要求,从而摒弃了”请求和保持”条件,从而可以避免发生死锁。
这种预防死锁的方法的优点:简单、易于实现且很安全。
缺点:资源被严重浪费,使进程延迟运行。
3.6.2 摒弃“不剥夺”条件
进程是逐个地提出对资源的要求的。当一个已经保持了某些资源的进程,再提出新的资源请求而不能立即得到满足时,必须释放它已经保持了的所有资源。待以后需要时再重新申请。从而摒弃了“不剥夺”条件。
这种预防死锁的方法,实现起来比较复杂且要付出很大代价。因为一个资源在使用一段时间后,它的被迫释放可能会造成前段工作的失效。还会使进程前后两次运行的信息不连续
3.6.3 摒弃“环路等待”条件
这种方法中规定,系统将所有资源按类型进行线性排队,并赋予不同的序号。 所有进程对资源的请求必须严格按照资源序号递增的次序提出,这样,在所形成的资源分配图中,不可能再出现环路,因而摒弃了“环路等待”条件。
存在的问题:
首先是为系统中各类资源所分配(确定)的序号,必须相对稳定,这就限制了新类型设备的增加;
作业(进程)使用各类资源的顺序,与系统规定的顺序不同,造成对资源的浪费 ;
限制用户简单、自主地编程 。
3.7 避免死锁
3.7.1 系统安全状态
1.安全状态
所谓安全状态,是指系统能按某种进程顺序(P1,P2,…,Pn),来为每个进程Pi分配其所需资源,直至满足每个进程对资源的最大需求,使每个进程都可顺利地完成,称系统处于安全状态,称〈P1,P2,…,Pn〉序列为安全序列 。否则,如果系统无法找到这样一个安全序列,则称系统处于不安全状态。
2.安全状态之例
假定系统中有三个进程P1、P2和P3,共有12台磁带机。进程P1总共要求10台磁带机,P2和P3分别要求4台和9台。假设在T0 时刻进程P1、P2和P3已分别获得5台、2台和2台磁带机,尚有3台空闲未分配,在T0时刻系统是否安全?
<P2,P1,P3>
3.由安全状态向不安全状态的转换
不按照安全序列分配资源
3.7.2 利用银行家算法避免死锁
1. 银行家算法中的数据结构
(1)可利用资源向量Available:这是一个含有m个元素的数组,其中的每一个元素代表一类可利用的资源数目。其数值随该类资源的分配和回收而动态地改变。
(2)最大需求矩阵Max:这是一个n×m的矩阵,它定义了系统中n个进程中的每一个进程对m类资源的最大需求。如果Max[i,j]=K,则表示进程i需要Rj类资源的最大数目为K。
(3)分配矩阵Allocation:这是一个n×m的矩阵,它定义了系统中每一类资源当前已分配给每一进程的资源数。如果Allocation[ i,j ]=K,则表示进程Pi当前已分得Rj类资源的数目为K。
(4)需求矩阵Need:这也是一个n×m的矩阵,用以表示每一个进程尚需的各类资源数。如果Need[ i,j ]=K,则表示进程Pi还需要Rj类资源K个,方能完成其任务。
Need[ i,j ] = Max[ i,j ] - Allocation[ i,j ]
2.银行家算法
设Requesti,是进程Pi的请求向量,当Pi发出资源请求后,系统按下述步骤进行检查:
(1)如果Requesti[ j ] ≤ Need[ i,j ], 便转向步骤2;否则认为出错,因为它所需要的资源数已超过它所宣布的最大值。
(2)如果Requesti[ j ] ≤ Available[ j ],便转向步骤(3);否则,表示尚无足够资源,Pi须等待。
(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)系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态。若安全,才正式将资源分配给进程Pi,以完成本次分配;否则,将本次的试探分配作废,恢复原来的资源分配状态,让进程Pi等待。
3.安全性算法
系统所执行的安全性算法可描述如下:
(1)设置两个向量:
①工作向量Work: 它表示系统可提供给进程继续运行所需的各类资源数目,Work = Available
②Finish:开始时先做Finish[i] = false;当有足够资源分配给进程时,再令Finish[i] = true。
(2)从进程集合中找到一个能满足下述条件的进程:
①Finish[i] = false;
②Need[i,j] ≤ work[j];
若找到,执行步骤(3);否则,执行步骤(4)。
(3)当进程只获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行:
Work[ j ] = Work[ i ] + Allocation[ i,j ];
Finish[ i ] = true;
go to step 2;
(4)如果所有进程的Finish[i] = true都满足,则表示系统处于安全状态;否则,系统处于不安全状态。
4.银行家算法之例
假定系统中有五个进程{P0,P1,P2,P3,P4} 和三类资源{ A, B, C },各种资源的数量分别为10、5、7,在T0 时刻的资源分配情况
(1)T0时刻的安全性
利用安全性算法对T0时刻的资源分配情况进行分析
(2)P1请求资源:
P1发出请求向量Request1(1,0,2),系统按银行家算法进行检查:
①Request1(1,0,2)≤ Need1(1,2,2)
②Request1(1,0,2)≤ Available1(3,3,2)
③系统先假定可为P1分配资源,并修改Available,Allocation1和Need1向量,由此形成的资源变化情况如下图所示。
④再利用安全性算法检查此时系统是否安全。如图所示:
图3-17 P1 申请资源时的安全性检查
(3)P4请求资源:P4发出请求向量Request4(3,3,0),系统按银行家算法进行检查:
①Request4(3,3,0)≤ Need4(4,3,1);
②Request4(3,3, 0) ≮ Available(2,3,0),让P4等待。
(4)P0请求资源:P0发出请求向量Requst0(0,2,0),系统按银行家算法进行检查:
①Request0(0, 2,0)≤ Need0(7,4,3);
②Request0(0,2,0)≤ Available(2,3,0);
③系统暂时先假定可为P0分配资源,并修改有关数据,如图3-18所示。
图3-18为P0分配资源后的有关资源数据
④进行安全性检查:可用资源Available(2,1,0)已不能满足任何进程的需要,故系统进入不安全状态,此时系统不分配资源。
思考:P0发出的请求向量改为Request0(0,1,0),系统能否将资源分配给它?为什么?
3.8 死锁的检测与解除
3.8.1死锁的检测
当系统为进程分配资源时,若未采取任何限制性措施,则系统必须提供检测和解除死锁的手段。
1.资源分配图
该图是由一组结点N和一组边E所组成的一个对偶G=(N,E)。其中:
1.资源分配图
(1)把N分为两个互斥的子集,即一组进程结点P={P1,P2,…,Pn)和一组资源结点R={r1, r2, …, rn},N=PUR
(2)凡属于E中的一个边e∈ E都连接着P中的一个结点和R中的一个结点
e={Pi,rj}
它表示进程pj请求一个单位的rj资源。
e={rj,Pi}
它表示把一个单位的资源rj分配给进程Pi。
2.死锁定理
资源分配图加以简化的方法
S为死锁状态的充分条件是:当且仅当S状态的资源分配图是不可完全简化的。该充分条件被称为死锁定理。
3.死锁检测中的数据结构
(1)可利用资源向量Available,它表示了m类资源中每一类资源的可用数目。
(2)把不占用资源的进程(Allocation:=0)记入L表中,即Li U L
(3)从进程集合中找到一个Requesti≤work的进程,做如下处理:
① Work := Work + Allocationi,
②将它记入L表中。
(4)若不能把所有进程都记入L表中,便表明系统状态S的资源分配图是不可完全简化的。因此,该系统状态将发生死锁。
3.8.2 死锁的解除
当发现有进程死锁时,常采用的两种方法是解除死锁:
(1)剥夺资源。从其它进程剥夺足够数量的资源给死锁进程,以解除死锁状态。
(2)撤消进程。最简单的撤消进程的方法,是使全部死锁进程都夭折掉;或者按照某种顺序逐个地撤消进程,直至有足够的资源可用,使死锁状态消除为止。
第三章要求
了解:处理机调度的层次、实时调度算法(LLF算法)。
理解:满足实时系统要求时,应选择适合实时系统中的调度算法、死锁的检查和解除方法。
掌握:进程调度的概念、调度队列模型、各种进程调度算法。死锁的概念、产生死锁的原因和必要条件、处理死锁的基本方法、银行家算法。