在学习操作系统中进程的时候,会接触到进程死锁这个名称。那么什么是进程死锁?
进程死锁指的是:如果多个进程同时占有对方需要的资源而同时请求对方的资源,而它们在得到请求之前不会释放所占有的资源,那么就会导致死锁的发生,也就是进程不能实现同步。
那么死锁是怎样产生的?
死锁的产生有四个必要条件:
互斥条件:即一个资源每次只能被一个进程使用(在操作系统中这是真实存在的情况)
保持和等待条件:有一个进程已获得了一些资源,但因请求其他资源被阻塞时,对已获得的资源保持不放
不剥夺条件:有些系统资源是不可剥夺的,当某个进程已获得这种资源后,系统不能强行收回,只能由进程使用完成时自己释放
环路等待条件:若干个进程形成环形链,每个都占用对方要申请的下一个资源
而避免死锁最具有代表性的就是——银行家算法
至于什么是银行家算法,这里就不再赘述了,说实话,单凭概念很难理解它的含义,还是通过讲解例子,来理解到底什么是银行家算法。
例题:假设系统中有三类互斥资源R1、R2、R3,可用资源数分别是9、8、5.在T0时刻,系统中有P1、P2、P3、P4和P5五个进程,这些进程对资源的最大需求量和已分配的资源数如下所示,如果进程按照______序列执行,那么系统状态是安全的。
解答过程:
从题目给出的进程资源表可以看出,对于资源R1、R2、R3,它们已经提前各自分配了一部分,现在我们看一下,是否还有剩余。
R1=9-(1+2+2++1)=2
R2=8-(2+1+1+2+1)=1
R3=5-(1+1+3)=0
同时,对于五个进程,系统分配给了他们各自一部分资源,这一部分资源是否能够满足他们,根据还需资源=最大需求量—已分配资源数来求,结果如下
资源 进程 | 最大需求量 R1 R2 R3 | 已分配资源数 R1 R2 R3 | 剩余资源 R1 R2 R3 | 还需资源数 R1 R2 R3 |
P1 | 6 5 2 | 1 2 1 |
2 1 0
| 5 3 1 |
P2 | 2 2 1 | 2 1 1 | 0 1 0 | |
P3 | 8 1 1 | 2 1 0 | 6 0 1 | |
P4 | 1 2 1 | 1 2 0 | 0 0 1 | |
P5 | 3 4 4 | 1 1 3 | 2 3 1 |
很明显,“剩余资源”只能满足进程P2的要求
资源 进程 | 最大需求量 R1 R2 R3 | 已分配资源数 R1 R2 R3 | 剩余资源 R1 R2 R3 | 还需资源数 R1 R2 R3 |
P2 | 2 2 1 | 2 1 1 | 2 1 0 | 0 1 0 |
那么就先开始运行进程P2。当P2运行之后,已“分配的资源”要释放出来,此时剩余资源=上一个进程的剩余资源+“已分配资源”(下图中P2已经执行完毕了)
资源 进程 | 最大需求量 R1 R2 R3 | 已分配资源数 R1 R2 R3 | 剩余资源 R1 R2 R3 | 还需资源数 R1 R2 R3 |
P2 | 2 2 1 | 2 1 1 | 4 2 1 | 0 1 0 |
根据比较可以看出“剩余资源”完全满足进程P4,以此类推,可以得到最后的结果表
资源 进程 | 最大需求量 R1 R2 R3 | 已分配资源数 R1 R2 R3 | 剩余资源 R1 R2 R3 | 还需资源数 R1 R2 R3 |
|
|
| 2 1 0 |
|
P2 | 2 2 1 | 2 1 1 | 4 2 1 | 0 1 0 |
P4 | 1 2 1 | 1 2 0 | 5 4 1 | 0 0 1 |
P1 | 6 5 2 | 1 2 1 | 6 6 2 | 5 3 1 |
P5 | 3 4 4 | 1 1 3 | 8 7 2 | 2 3 1 |
P3 | 8 1 1 | 2 1 0 | 10 8 2 | 6 0 1 |
银行家是计算并不难,主要就是有些繁琐,在计算的时候需要耐心。