1.什么是死锁
一组进程中每个进程均等待此组进程其他进程其他进程所占有的,因而永远无法得到的资源。
关于死锁的四个结论:
1.参与死锁的进程至少为2个
2.占有资源至少有两个
3.参与死锁的进程均无限等待
4.是当前运行进程的子集
coffman条件:
若发生死锁,则必定满足下面四个条件
1.资源独占(无法破坏)
2.不可剥夺
3.保持申请
4.循环等待
2.资源分配图
进程为圆圈,资源为方框。
死锁定理:发生死锁的充要条件是资源分配图不可完全约简。
3.死锁预防(静态策略)
1.预分配(一次全部分配,降低系统并发性)破坏保持申请
2.有序条件分配(对资源进行编号,能申请这个资源的条件rj是f(ri)<f(rj),其中ri为已经申请资源。破坏循环等待。
4.死锁避免(动态策略)
安全与不安全
注意:安全一定无死锁,不安全可能有死锁,死锁一定是不安全。(保守性)
银行家算法概述:
claim:每个进程需要的全部的资源类的资源实例总数(静态)
allocation:每个进程已经占有的资源类的资源实例个数(动态改变)
need:每个进程还需要的资源类的资源实例个数。关系:claim=allocation+need
available:当前系统剩余的每个资源类的资源实例个数。
步骤:系统收到request后与need进行比较看是否合法,然后与available比较看是否可以分配,若均可以,则分配,need-=request,allocation+=request,进行系统安全检测,若安全则分配,若不安全,则撤销分配,need+=request,allocation-=request.
安全状态检测:找到一个安全序列,可以完全执行完。available meet need。
END
思考:为什么说银行家算法是保守性算法?
答:银行家的保守性体现在available meet need,我们并不知道进程具体是按照哪种顺序执行的,所以只能考虑最坏情况。
5.死锁发现与检测(与资源分配图一致)
三个内容:如何检测,什么时候检测,如何恢复(死锁恢复)
1.如何检测:
变量:
allocation:进程已经占有的资源类的资源实例个数
request:进程正在发出的申请请求
available:系统当前空闲的资源类的资源实例个数
具体步骤:资源分配图
2.何时检测
1.进程等待时检测
2.定时检测
3.资源利用率下降时检测
4.交互式进程得不到响应
3.如何恢复
1.重启
2.撤销进程
3.剥夺资源
4.回溯,进程回退。
6.鸵鸟算法
视而不见
7.死锁与饥饿,饿死
等待时间给进程的推进和响应带来显著影响时:饥饿
饥饿一定程度,并且此时执行已经不再具有实际意义时:饿死
由于忙式等待而造成的饥饿:活锁
死锁与饿死的区别:
1.进程状态,死锁的进程一定处于等待态,而由于忙式等待而饿死的进程处于就绪或者运行态。
2.死锁的进程等待永远也得不到释放的资源,而饿死的进程是等待会释放但永远不会分配给自己的资源。
3.死锁一定是循环等待,而饿死则不一定
4.死锁一定发生在多个进程之间,而饿死可能只有一个进程
8.可复用资源的死锁静态分析(不知道具体执行过程)
(P:e:c)表示申请e资源,占有c资源。
将每个进程的占有资源申请资源状态画出来,然后我申请你占有的分配有向弧(同个进程之间不连),找出环路,(看是否可达)有相同进程不可达,有相同的被占有资源不可达。若可达,建议找出一个可达序列(不然不好判断)
小技巧:两个进程构成的环路若不满足上述条件,则一定可达。
9.同种组合资源死锁的必要条件
资源总量M,N个进程,参与死锁的进程为n
则:
参与死锁需要的资源总数>=M+n
未参与死锁需要的资源总数>=N-n
则有总资源数>=M+N
故若总资源数<M+N,则一定不会发生死锁
总资源数>=M+N,则至少有一种交叉会发生死锁。
10.过河问题
思路:
1.最多5个人同时过河
2.1,2同时申请;5,6同时申请