1. 死锁
操作系统中的死锁指:如果在一个进程集合中的每个进程都在等待只能由该集合中的其他一个进程才能引发的事件,则称一组进程或系统此时发生了死锁。
例如,n个进程P1、P2,…,Pn,Pi因为申请不到资源Rj而处于等待状态,而Rj又被Pi+1占有,Pn欲申请的资源被P1占有,此时这n个进程的等待状态永远不能结束,则说这n个进程处于死锁状态。
1.1. 死锁产生
1.1.1. 产生的条件
- 互斥条件
- 占有和等待条件(保持和请求)
- 不剥夺条件
- 循环等待条件
1.1.2. 产生原因
- 进程顺序不当
设系统有打印机、读卡机各一台,被进程P和Q共享。两个进程并发执行,按下列次序请求和释放资源:
进程P 进程Q
请求读卡机 请求打印机
请求打印机 请求读卡机
释放读卡机 释放读卡机
释放打印机 释放打印机
- PV操作使用不妥
进程Q1 进程Q2
P(S1); P(s2);
P(s2); P(s1);
使用r1和r2; 使用r1和r2
V(S1); V(s2);
V(S2); V(S1);
-
同类资源分配不均
- 若系统中有m个资源被n个进程共享,每个进程都要求K个资源,而m < n·K时,即资源数小于进程所要求的总数时,如果分配不得当就可能引起死锁。
-
对某些资源的使用未加限制
- 进程通信使用的信件是一种临时性资源,如果对信件的发送和接收不加限制,可能引起死锁。
- 进程P1等待进程P3的信件S3来到后再向进程P2发送信件S1;P2又要等待P1的信件S1来到后再向P3发送信件S2;而P3也要等待P2的信件S2来到后才能发出信件S3。这种情况下形成了循环等待,产生死锁。
1.2. 死锁防止
-
系统形成死锁的四个必要条件
互斥条件:
进程互斥使用资源部分分配条件:
申请新资源时不释放已占有资源不剥夺条件:
一个进程不能抢夺其他进程占有的资源环路条件:
存在一组进程循环等待资源的
-
防止方法:
破坏第一个条件:
使资源可同时访问而不是互斥使用,破坏第三个条件:
采用剥夺式调度方法,当进程在申请资源未获准许的情况下,如主动释放资源(一种剥夺式),然后才去等待。破坏第二个条件或第四个条件
- 资源被分成多个层次
- 当进程得到某一层的一个资源后,它只能再申请较高层次的资源
- 当进程要释放某层的一个资源时,必须先释放占有的较高层次的资源
- 当进程得到某一层的一个资源后,它想申请该层的另一个资源时,必须先释放该层中的已占资源
1.3. 死锁避免
-
安全状态
-
银行家算法
1.4. 死锁检测和解除
-
资源分配图化简法
-
死锁解除
- 资源剥夺法
- 剥夺陷于死锁的进程所占用的资源,但并不撤销此进程,直至死锁解除。
- 进程回退法
- 根据系统保存的检查点让所有的进程回退,直到足以解除死锁,这种措施要求系统建立保存检查点、回退及重启机制。
- 进程撤销法
- 撤销陷入死锁的所有进程,解除死锁,继续运行。
- 逐个撤销陷入死锁的进程,回收其资源并重新分配,直至死锁解除。
- 可选择符合下面条件之一的先撤销
- CPU消耗时间最少者
- 产生的输出量最小者
- 预计剩余执行时间最长者
- 分得的资源数量最少者后优先级最低者
- 系统重启法
- 结束所有进程的执行并重新启动操作系统。这种方法很简单,但先前的工作全部作废,损失很大。
- 资源剥夺法