死锁的必要条件和处理
死锁的必要条件:
- 互斥:同一时间内只有一个进程使用一个资源
- 持有并等待:一个进程持有至少一个资源并等待其他进程所持有的资源
- 非抢占:一个资源只能由持有它的进程主动释放,而不能被其它进程抢占
- 循环等待:存在P0等待P1,P1等待P2……Pn等待P0的情况
出现死锁,必出现四个条件;出现四个条件,不一定死锁。
死锁的处理方式:
- 预防:保证任一条件不出现,限制资源的请求方式
- 消除互斥,对于共享资源可行,对于非共享资源不可行(它必须是互斥的)
- 消除持有并等待,执行前一次性请求所有资源(缺点:申请的资源可能很久之后才使用,很难一次性分配太多资源);请求资源前先释放所有资源
- 消除非抢占,请求资源不可得时,允许抢占资源(只能用于状态可以保存和恢复的资源)
- 消除循环等待,资源的线性排序和按序分配(可以考虑在应用程序中使用这一方案)
- 避免:允许出现前三个条件,资源分配之前考察是否会出现死锁,来决定是否给资源申请分配资源,改善了资源利用率,但需要额外的信息
- 单资源实例-->资源分配图算法
- 多资源实例-->银行家算法
- 检测
- 单资源实例-->等待图中存在环
- 恢复
- 进程的角度:一次性终止所有进程或者一个一个终止线程
- 资源的角度:抢占资源
- 视而不见(Unix的策略),考虑到处理代价>死锁危害