一、死锁基本原理
1.死锁的概念
两个以上的进程,处于一个等待另一个释放临界区或产生数据,不幸的是另一个也在等待,造成进程无法执行
活锁:进程可以改变状态,有可能避免死锁,但不一定能避免。
饥饿:进程已经具备了执行条件,但由于某种情况,永远得不到资源,处于等待状态。
2.死锁与饥饿关系:共同:等待资源,造成进程阻塞
不同:对于饥饿,可以是一个进程(低优先级的进程前面永远有高)对于死锁是两个以上的进程;饥饿包含死锁
3.可重用资源:资源在一个进程执行完后不会改变(如被打印的文件,cpu等)
1)一次只被一个进程使用
2)释放后其他进程可用
3)当每个进程拥有某个资源再请求其他资源时会发生死锁
可消费资源 概念:1)进程动态产生,数目可以无限多 2)被进程消费后不存在
特点:1)死锁很少产生,但很少的事件组合也可能产生死锁
4.资源分配图:三个元素:圆(进程),框(资源,里面的圆点是资源数目),有向边
5.死锁的四个条件:必要条件1)互斥mutual exclusion:
充要条件:循环等待:
解决死锁:允许死锁 & 不允许死锁
允许死锁:静态&动态 不允许死锁:静态&动态
二、死锁解决办法
允许死锁(静):1.鸵鸟算法:当死锁真正发生且影响系统正常运行时,手动干预—重新启动。
允许死锁(动):1.死锁检测(动) 2.死锁解除
不允许死锁
1.死锁预防(静):
1.1消除互斥1)无限增加资源 2)共享资源,不是临界资源,但会造成条件竞争
1.2消除占有和等待的条件 :1)一次性请求所有资源,但造成资源浪费 2)释放,进程前期工作浪费
1.3消除非抢占:资源状态易于保存
1.4消除环形等待:资源线性顺序(缺点是没有考虑到进程的需要)
2.死锁避免 (动)
概念:在分配资源之前,操作系统仔细地计算,如果觉得可能会造成死锁,就不允许这个资源分配
两种方式:
①进程启动时,新的进程要启动,操作系统去计算启动新的进程是否会引发死锁
进程启动拒绝:新的进程启动,操作系统计算是否会引发死锁
资源总量表:记录计算机系统实际拥有资源的情况
资源可用向量:m个资源中可用的
资源的最大需求矩阵:每一行是一个进程,列是该进程对j个资源的最大需求量
分配矩阵:行是进程,每一类资源给进程分配多少
关系:1)
2)银行家算法
②进程增加时 的(起源于银行家算法)已经执行的进程,产生新的资源请求,操作系统去计算这个资源请求是否会造成死锁。
状态:资源分配情况
安全状态: 能找到一组让所有进程都执行的顺序
不安全的状态:找不到
1)进程启动拒绝:新的进程启动,操作系统计算是否会引发死锁
资源总量表:记录计算机系统实际拥有资源的情况
资源可用向量:m个资源中可用的
资源的最大需求矩阵:每一行是一个进程,列是该进程对j个资源的最大需求量
分配矩阵:行是进程,每一类资源给进程分配多少
关系:1)
2)银行家算法:
状态:资源分配情况
安全状态: 能找到一组让所有进程都执行的顺序
不安全的状态:找不到