死锁定义和产生的根本原因
两个p进行交换
哲学家进餐问题,每个哲学家都拿不到右边的筷子,而阻塞等待,而且永远等待下去。
- 死锁的定义
一组进程因竞争资源而造成的一种僵局,即每个进程都占有部分资源,同时又需得到已被该组进程中其他占用的资源,若无外力作用,这些进程将永远处于等待状态。
一种死锁状态的例子
假设系统中有一个R1,一个R2资源,一次只允许一个进程使用,P1申请一个R1,再申请一个R2;P2申请一个R2,再申请一个R1;
P1:
P(R1);
P(R2);
...
V(R1);
V(R2);
P2:
P(R2);
P(R1);
...
V(R2);
V(R1);
- 死锁产生的根本原因
(1) 竞争资源
(2) 进程推进顺序不当
P1:
P(R1);
P(R2);
...
V(R1);
V(R2);
P2:
P(R2);
P(R1);
...
V(R2);
V(R1);
产生死锁的四个必要条件:
(1) 互斥条件
对于独占资源,每个资源每次只能给一个进程使用,进程一旦申请到了资源后占为已有,则排斥其它进程共享该资源。
(2) 不剥夺条件
正在使用的资源不可剥夺,进程获得的资源尚未使用完毕之前,只能由占有者自己释放,不能被其它进程强行占用。
(3) 请求和保持条件
进程因未分配到新的资源而受阻,但又不放弃已占有的资源。
(4) 环路等待条件
存在进程的循环等待链,前一进程占有的资源正是后一进程所需求的资源,结果就形成了循环等待的僵持局面。
上面四个条件是在死锁发生时同时出现的,我们可以利用它们的逆否命题,即:四个条件中只要有一个不满足,则死锁不会发生。这正是我们预防死锁所需考虑的方法。
死锁不仅会发生在两个进程之间,也可能发生在多个进程之间,甚至发生在全部进程之间。此外,死锁不仅会在动态使用外部设备时发生,而且也可能在动态使用存储区、文件、缓冲区、数据库时发生,甚至在进程通信过程中发生。随着计算机资源的增加,系统出现死锁现象的可能性也大大增加,死锁一旦发生,会使整个系统瘫痪而无法工作。因此,要想办法解决死锁问题。
死锁的处理方法
- 死锁预防 破坏必要条件
- 死锁避免 银行家算法
- 死锁检测 死锁定理
- 死锁解除 剥夺资源、撤销进程
1.死锁的预防
采取某种策略,限制并发进程对资源的请求,从而保证死锁的必要条件在系统执行的任何时间都不能得到满足。
2.死锁的避免
是指系统在分配资源时,根据资源的使用情况提前做出预测,给定一个合适的安全的进程推进顺序,从而避免死锁的发生。实现起来有一定的难度,但在一些较完善的系统中,常用这种方法。
3.死锁的检测
允许系统发生死锁。系统设有专门的机构,当死锁发生时,该机构能够检测到死锁的发生,并能确定参与死锁的进程及相关资源。
4.死锁的解除
这是与死锁检测相配套的措施,用于将进程从死锁状态中解脱出来。
常用的解除死锁的方法有两种:
-
一种是强制性地撤销一些死锁进程,并剥夺它们的资源给其余进程;
-
另一种是使用一个有效的挂起机构来挂起一些进程,以便从被挂起进程中剥夺一些资源来解除死锁。