多个进程因为竞争资源而造成一种僵局,没有外力的作用下,这些进程无法向前推进
这种僵局可以解释为:每个进程继续执行所需的资源都被另一个进程占用
这里举一个简单的例子:
假设现在有进程P1,P2,资源R1,R2
进程P1的执行情况为:
P(R1) 输入输出操作 p(R2) 临界区 v(R2) v(R1)进程P2的执行情况为:
P(R2) 输入输出操作 p(R1) 临界区 v(R1) v(R2)先执行进程P1或者先执行进程P2都不会产生问题
如果同时递交了进程P1和P2呢?---此处的"同时"是指进程P1立刻递交给P2,不是广义上的同时递交
分配资源出现问题,R1的资源分配给P1,R2的资源分配给P2,当P1提出对R2资源的申请请求时,R2资源已经被P2占据,发生死锁
1.2.1根本原因:资源不足
1.2.2其他原因:
a.竞争非剥夺性资源(一旦占有CPU直至完成或者阻塞)
b.进程间推进顺序(eg.p操作)非法
1互斥
2请求和保持
eg.P1占有R1申请R2----也就是请求申请资源的同时,占有其他资源,请求的资源被其他进程占有
3不剥夺条件
4环路等待
破坏除互斥条件外其他几个条件之一
破坏请求,保持条件---又名:静态资源分配法所有资源一次分配,一次回收
缺点:资源浪费,cpu的利用率低,降低进程的并发性,进程延迟执行
破坏不剥夺条件新资源得不到满足,就释放已经占有的资源
缺点:放弃资源需要现场保护,重新申请资源需要现场恢复,cpu的利用率低,进程被无限延迟
破坏环路等待进程按照一定的顺序申请资源
缺点:资源编号难以确定,先申请后用的资源,但是没有使用资源,cpu的利用率低
2避免 :一进程请求资源---->试分配(检查安全性)----若不安全:回退到前一时刻状态
----若安全:继续执行
2.1RAG图的有关知识点:
方框表示缓冲池,方框中点的个数表示缓冲池中的资源个数
用圆圈圈起来的表示进程
2.2RAG图的化简
请求边(Need),占有边(Allocation)
如果某进程满足请求边得到满足或者没有请求边,可以删除该进程关联的所有边
举例:
系统有5种资源,在T0时刻P0,P1,P2,P3,P4这五个进程对资源的占用情况和需求情况见下列矩阵,考虑如下资源分配状态,资源总数SUM=(2,1,2,1,1)
化简资源分配图,并判断是否产生死锁:
为了避免死锁,引入银行家算法。
思想:
一请求资源Request,试分配,检查T0时刻的安全性
若安全,试分配->真分配资源给各个进程
若不安全,从T1时刻回退到T0时刻
1什么是安全状态?
安全状态是指系统能够按照某种进程顺序来为每个进程分配其所需的资源,直至满足每个进程对资源的最大需求,使得每个进程都可以顺利的完成
2了解一些代名词
Need:表示当前进程的尚需资源
Available:表示当前可用资源
Allocation:表示当前进程已分配资源
Max:表示最大需求
其中最大需求Max=已分配资源Allocation+尚需资源Need
引入两个变量:work来记录Available的值,work现=work初+Allocation
Finish来表示进程的完成状态,Finish=true表示进程完成,Finish=false表示进程未完成
2如何判断T0时刻进程是否安全?
判断T0时刻安全序列,使得每个进程的Need<=Availible,状态为未完成即Finish=false,将work初更新为Avaliable
如果满足这三个条件,将该进程的检测完成状态更新为true,work更新为work+avaliable
举例:假定有五个进程{P0,P1,P2,P3,P4}三种类型资源{A,B,C}每种资源的数量为10,5,7(最大资源数目MAX),各进程的最大需求,T0时刻资源分配情况如下所示
解:
work=Available(3,3,2)
finishi=false(i=0,1,2,3,4)
1找p1:
finish1=false
Need1(1,2,2)<=Available(3,2,2)
Available(5,3,2)=work(3,3,2)+Allocation(2,0,0)
finish1=true
2找p3
finsh3=flase
Need3(0,1,1)<=Available(5,3,2)
Available(7,4,3)=work(5,3,2)+Allocation(2,1,1)
finish3=true
3找p4
finsh4=flase
Need4(4,3,1)<=Available(7,4,3)
Available(7,4,5)=work(7,4,3)+Allocation(0,0,2)
finish4=true
4找p0
finsh0=flase
Need0(7,4,3)<=Available(7,4,5)
Available(7,5,5)=work(7,4,5)+Allocation(0,1,0)
finish0=true
5找p2
finsh2=flase
Need2(6,0,0)<=Available(7,5,5)
Available(10,5,7)=work(7,5,5)+Allocation(3,0,2)
finish2=true
结论:因为finishi=true(i=0,1,2,3,4)
所以安全
安全序列为{p1,p3,p4,p0,p2}
1先判断Request<=Need是否成立,若成立,执行2。不成立那么数据出错,不可分配资源给该进程
2判断Request<=Available是否成立,若成立,试分配资源Request给该进程。不成立则阻塞,不可分配资源给该进程
3试分配
Allocation=Allocation+Request
Need=Need-Request
Available=Available-Request
其他进程的资源分配状况不变