1.死锁
1.什么是死锁?
两个或两个以上的进程在执行的过程中,由于竞争资源或由于彼此通信而造成一种阻塞的现象,若无外力的作用他们将无法推进下去。死锁的原因主要就是由于多个进程对资源的争夺。
2.哪些原因可以导致死锁?
1.竞争不可抢占性资源,
p1已经打开F1,想去打开F2,p2已经打开F2,想去打开F1,但是F1和F2都是不可抢占的,这是发生死锁。
2. 竞争可消耗资源引起死锁
进程间通信,如果顺序不当,会产生死锁,比如p1发消息m1给p2,p1接收p3的消息m3,p2接收p1的m1,发m2给p3,p3,以此类推,如果进程之间是先发信息的那么可以完成通信,但是如果是先接收信息就会产生死锁。因为一个进程都有收发的两个操作,如果都先进行收的操作就会造成死锁。
3.进程推进顺序不当引起死锁。
进程在运行过程中,请求和释放资源的顺序不当,也同样会导致产生进程死锁。
3.产生死锁的条件(产生死锁必须同时具备的四个条件):
- 互斥条件:进程对资源的占有是排他性的,一个资源在一段时间内只能被一个线程占有,直到释放。
- 请求和保持条件:进程自己已经拥有一个资源,请求的新资源被其他的进程保持,自己又不释放自己的条件
- 不可抢占条件:一个进程拥有资源后未使用完成前不能被其他进程抢占
- 循环等待条件:发生死锁时必然存在一个进程-资源的循环链。
4.处理死锁的方法:
- 预防死锁:事先去破环死锁产生的四个条件之一或多个
- 避免死锁,在资源动态分配过程中,用某种方法防止系统进入不安全状态
- 检测死锁:通过检测机构检测死锁,然后采取适当的措施把进程从死锁解脱出来。
- 解除死锁,当检测到死锁的时候,就撤销进程回收资源
5.避免死锁的算法:银行家算法使系统给始终要保持安全,
可利用资源向量Available:表示的是记录当前时刻每类资源的剩余个数
最大需求矩阵Max:记录的是每个进程对每类资源的最大需求量
分配矩阵Allocation:记录每个进程当前时刻已获得的资源。
需求矩阵need:表示每一个进程尚需要资源数。
银行家算法之例:假定系统中有五个进程{P1,P2,P3,P4,P5}和三类资源A,B,C,各种资源的数量分别为10,5,7。在T0时刻资源分配情况如下:
|
Max |
Allocation |
Need |
Available |
A B C |
A B C |
A B C |
A B C |
|
P0 |
7 5 3 |
0 1 0 |
7 4 3 |
3 3 2 |
P1 |
3 2 2 |
2 0 0 |
1 2 2 |
|
P2 |
9 0 2 |
3 0 2 |
6 0 0 |
|
P3 |
2 2 2 |
2 1 1 |
0 1 1 |
|
P4 |
4 3 3 |
0 0 2 |
4 3 1 |
|
那么问题来了:此时T0时刻系统安全吗?分析:现在剩余A,B,C 3 3 2,能满足分配给进程P1,P1用完以后所释放资源,Available就变成5,3,2,此时可以满足P3,完了之后Available变成7,4,3,以此类推,最后的出一个安全序列P1,P3,P4,P2,P0.
|
Max |
Allocation |
Need |
Available+work |
Finish |
A B C |
A B C |
A B C |
A B C |
||
P0 |
7 5 3 |
0 1 0 |
7 4 3 |
10 5 7 |
true |
P1 |
3 2 2 |
2 0 0 |
1 2 2 |
5 3 2 |
true |
P2 |
9 0 2 |
3 0 2 |
6 0 0 |
10 4 7 |
true |
P3 |
2 2 2 |
2 1 1 |
0 1 1 |
7 4 3 |
true |
P4 |
4 3 3 |
0 0 2 |
4 3 1 |
7 4 5 |
true |
如果在T0时刻,P1请求资源(1,0,2),能否成功。先假定分配给了P1:
|
Max |
Allocation |
Need |
Available |
A B C |
A B C |
A B C |
A B C |
|
P0 |
7 5 3 |
0 1 0 |
7 4 3 |
2 3 0 |
P1 |
3 2 2 |
3 0 2 |
0 2 0 |
|
P2 |
9 0 2 |
3 0 2 |
6 0 0 |
|
P3 |
2 2 2 |
2 1 1 |
0 1 1 |
|
P4 |
4 3 3 |
0 0 2 |
4 3 1 |
|
这也可以找到一个安全序列P1,P3,P4,P2,P0.所以P1请求资源能成功。
在上面的P1请求资源成功的基础上,如果P0发出资源请求(0,2,0):
|
Max |
Allocation |
Need |
Available |
A B C |
A B C |
A B C |
A B C |
|
P0 |
7 5 3 |
0 3 0 |
7 2 3 |
2 1 0 |
P1 |
3 2 2 |
3 0 2 |
0 2 0 |
|
P2 |
9 0 2 |
3 0 2 |
6 0 0 |
|
P3 |
2 2 2 |
2 1 1 |
0 1 1 |
|
P4 |
4 3 3 |
0 0 2 |
4 3 1 |
|
此时剩余的资源只有(2 1 0),不满足任何分配,所以P0请求资源会失败。