目录
死锁(1)
一、死锁的定义
二、产生死锁的原因
三、产生死锁的四个必要条件
四、解决死锁的方法
死锁(2)
第三节 死锁避免
一、死锁避免的概念
二、安全状态与安全序列
三、银行家算法
第四节、死锁的检测与解除
一、死锁的检测和解除
二、死锁检测的算法
三、解除死锁的方法
死锁(3)
第五节 资源分配图
一、资源分配图
二、死锁定理
第六节 哲学家就餐问题
在多道程序系统中,同时有多个进程并发执行共享系统资源,从而提高了系统资源利用率,提高了系统的处理能力。
但是,在进行资源分配时会产生一个随机性的错误--死锁。
在许多应用中,如实时控制和监视系统中,遇到死锁会带来很大的危害。
指在多道程序系统中,一组进程中的每一个进程均无限期地等待被该组进程中另一个进程所占用且永远不会释放的资源。
处于死锁状态的进程称为死锁进程。
1.资源的概念
(1)永久性资源(可重用资源):如内存、外部设备、处理器等硬件资源;各种数据文件、表格、共享程序代码等软件资源。
(2)临时性资源(消耗性资源):指由某个进程产生、只为另一个进程使用一次或经过短暂时间后便不再使用的资源。
如I/O和时钟中断信号、同步信号、消息等。
2.产生死锁的原因
(1)竞争资源,系统在资源分配时出现失误,进程间对资源的相互争夺而造成僵局。
(2)进程推进顺序不合理(如P、V操作的信号量)
3.死锁的例子
例5.1申请不同类资源产生死锁,进程P1和P2在运行中使用输入、输出设备,假定系统中只有一台输入设备和一台输出设备,则进程P1和P2可能有如下形式:
若进程交替执行,如下:
P1:申请一台输入设备
P2:申请一台输出设备
P1:申请一台输出设备
P2:申请一台输入设备
例5.2申请同类资源产生死锁,假设有一类可重用资源R,如内存,它包含m个页面,由n个进程P1、P2、……Pn(2<=m<=n)共享。假定每个进程按下述顺序一次申请和释放页面:
①申请一个页面
②申请一个页面
③释放一个页面
④释放一个页面
例5.3 P、V操作使用不当产生的死锁,对于第四章生产者--消费者问题,如果把P(mutex)放在P(empty)和P(full)之前,就会产生死锁。
考虑当①empty=0,full=n的情况第一种情况:假设生产者进程占有处理器,此时,执行完P(mutex),再执行P(empty)时,生产者进程阻塞,让出处理器,消费者进程执行P(mutex)也会阻塞,此时产生死锁。
例5.4 对临时性资源的使用不加限制产生的死锁,在进程通信时使用的信件可以看作是一种临时性资源,如果对信件的发送和接收不加限制,则可能引起死锁。
比如,进程P1等待进程P3的信件S3,S3到来后再向进程P2发送信件S1,P2又要等待P1的信件S1到来后再向P3发送信件S2,P3进程也要等待进程P2的信件到来后才能发送信件S3。
对于永久性资源,产生死锁的四个必要条件:
①互斥条件(一个资源每次只能被一个进程使用(资源独立));
②不可剥夺条件(进程已获得的资源,在未使用之前,不能强行剥夺(抢夺资源));
③请求和保持条件(一个进程因请求资源而阻塞时,对已获得的资源保持不放(不释放锁));
④循环等待条件(若干进程之间形成一种头尾相接的循环等待的资源关闭(死循环));
①预防死锁;②避免死锁;③检测与解除死锁;④忽略死锁;
前面讨论的死锁预防策略,总体上是增加了较强的限制条件,从而使实现较为简单,但却严重地影响了系统性能。
基本思想:系统对进程发出的每一个系统能够满足的资源申请进行动态检查,并根据检查结果决定是否分配资源;如果分配后系统不会发生死锁,则予以分配,否则,不予以分配。
和死锁预防的区别:死锁预防是破坏产生死锁的四个必要条件之一,严格地防止死锁的出现。而死锁避免是在系统运行过程中注意避免死锁的发生,即使死锁的必要条件存在,也不一定发生死锁。
1.安全状态:如果操作系统能保证所有的进程在有限的时间内得到所需的全部资源,则称系统处于“安全状态”,否则说系统是不安全的。
判别:如果存在一个由系统中所有进程构成的安全序列{(P1、P2、……Pn)},则系统处于安全状态。
2.安全序列:系统能按某种进程推进顺序{P1、P2、……Pn},为每个进程Pi分配其所需资源,直至满足每个进程对资源的最大需求,使每个进程都可顺利地完成。此时称{P1、P2、……Pn}为安全序列。
3.安全状态与不安全状态的关系:系统中不存在安全序列,则称系统为不安全状态。
例5.5安全状态与不安全状态,现有12个同类资源供3个进程共享,进程P1总共需要9个资源,但第一次先申请2个;进程P2总共需要10个资源,第一次要求分配5个资源;P3总共需要4个资源,第一次请求2个资源。经过第一次分配后,系统还有3个资源未分配,系统状态如图5-5所示。
该状态是否安全?
答:该状态安全,系统剩余资源3,而P3还需要2个资源,把2个资源分配给P3后,当P3执行完毕,释放4个资源,此时系统资源为5;这5个资源可以分配给P2,P2运行结束,释放10个资源,此时可满足P1进程需求,进程P1执行完毕。存在安全序列{P1,P2,P3}
若进程P1提出再申请一个资源的要求,系统从剩余资源中分配1个给P1后剩余2个资源,如下图所示:
答:该状态不安全,找不到安全序列,因为剩余资源分配给P3进程,P3进程用完后释放,此时剩余资源为4,资源数量不能满足P1和P2进程的需求量,故状态不安全
愿意:确保银行在发放现金贷款时,不会发生不能满足所有客户需要的情况。
操作系统中:保证系统不会进入不安全状态的算法
例5.6银行家算法应用示例:
假定系统中有5个进程{P1,P2,P3,P4,P5}和三类资源{A,B,C},各种资源的数量分别是10,5,7,资源分配情况如图所示
答:存在安全序列{P2,P4,P5,P3,P1},该状态安全
在此状态下,进程P2又提出请求(1,0,2),此时状态如图5-8
答:在此状态下,系统剩余资源不能满足任何进程的请求,P2的请求不予满足,P2等待。
单项选择题
某系统中有3个并发进程,都需要同类资源3个,试问该系统不会发生死锁的最少资源数是()。
A.6 B.7
C.8 D.9
答案:B
解析:3个进程,都需要同类资源3个。假定3个进程都得到了2个,总共得到6个资源,如果再有一个资源,即7个时,系统不会发生死锁。这类问题都可以用这个方法进行计算。
1.死锁的检测和解除:
假如系统为进程分配资源时,不采取任何限制性措施来避免和预防死锁,而是在操作系统运行过程中,不断地监督程序的执行和资源占用情况,判断是否发生死锁,一旦发生死锁,采取专门的措施解除死锁,并以最小代价使系统恢复正常。
2.死锁检测时机
(1)检测的实质:检测算法检测是否存在“循环等待”条件
(2)时机:
①一次资源分配后;②每次调度后;③定时器定时运行检测程序;④当某个进程长期处于阻塞状态或阻塞程序过多时;
算法规则:当任一进程Pj申请一个已被占用的资源Ri时,(操作系统)进行死锁检测,反复查找资源分配表和等待进程表,来确定Pj对资源Ri的请求是否导致形成环路,若是,出现死锁。
1.剥夺资源,一旦死锁,挂起一些进程,剥夺它们占用的资源给死锁进程,以解除死锁。
2.撤销进程,撤销部分死锁进程,将它们占有的资源分配给另一些死锁进程,直到死锁解除为止。
可以一次撤销所有死锁进程,也可以逐个撤销。
1.作用:描述系统中资源分配和申请情况,对死锁进行分析并采取对策
2.SRAG定义:是一张有向图,可定义为一个二元组,即,SRAE=(V,E),其中V是顶点的集合,包括进程集合、资源集合,E是有向边的集合,是一个有序对
矩形表示资源,圆点表示资源的数据量,箭头从矩形内圆点出发,表示该资源被占用;箭头从其他处指向矩形,表示有进程请求资源。
圆形表示进程,矩形内的箭头指向进程,表示进程占用该资源;进程的箭头指向资源,表示申请该资源。
1.作用:判定死锁的法则
2.死锁定理:(1)如果资源分配图中没有环路,则系统无死锁
(2)如果资源分配图中出现了环路,则可能存在死锁。具体判断如下:
①如果处于环路中的每个资源类中均包含一个资源实例(表示矩形内的圆点数量),则环路存在意味死锁的存在。此时,环路是死锁的充分必要条件。如下图:
如果处于环路中的每个资源类中实例的个数不全为1,则环路存在是死锁的必要条件而非充分条件。如图5-11和图5-12所示:
存在两个环路P1->r1->P2->r2->P3->r3->P1,环路P2->r2->P3->r3->P2。P1、P2、P3都陷入了死锁。
可以使用资源分配图简化方法,来检测系统是否为死锁状态。步骤如下:(1)在资源分配中,找出一个既不阻塞又非独立的进程节点Pi。在顺利的情况下,Pi可获得所需资源而继续运行,直至运行完毕,再释放其占有的全部资源,这相当于消去Pi的请求边和分配边,使之成为孤立的节点。
(2)将Pi释放的资源分配给申请它的进程,若该进程能顺利运行完,释放资源,再次称为孤立节点。
(3)重复(1)(2)步,直到找不到符合条件的进程节点。经过简化后,若能消去所有的边,则该图可完全简化,系统不存在死锁;否则不可能完全简化,存在死锁。
1.问题描述(1)有五个哲学家围坐在一圆桌旁,每人面前有一只碗,碗里有面条,每两人之前放一只筷子;
(2)每个哲学家的行为都是思考,感到饥饿,然后吃饭;
(3)为了吃饭,每个哲学家必须拿到两只筷子,并且每个人只能直接从自己的左边或右边去取筷子;
2.算法描述,为每个筷子设置一个互斥信号量
semaphore chopstick[5]={1,1,1,1,1}
3.存在问题:死锁
4.改进:采用资源有序分配算法,给每个筷子编号,规定每个哲学家先拿编号小的筷子再拿编号大的筷子。哲学家i(1<=i<=4)不变,第五个哲学家的程序改进如下: