2.3 进程管理:死锁
死锁的基本概念思维导图:
死锁的基本概念
死锁是多个进程由于资源的竞争导致的一种阻塞现象
死锁、饥饿、死循环:
共同点:进程都不能继续向前推进
不同点:
- 死锁:2个以上进程循环等待对方手里的资源;
- 饥饿:表现为进程长期得不到处理机资源,可能处于就绪态或阻塞态,可以只有1个
- 死循环:进程可以正常运行,由程序员错误导致
死锁的原因
- 竞争有限的系统资源:m个进程,每个进程需k个资源, 不产生死锁最小资源数 (k-1)m+1;
- 进程推进顺序不当:如互斥信号量的P操作必须在同步信号量的P操作之后
死锁产生的必要条件
- 互斥条件
- 请求和保持条件
- 不可剥夺条件
- 循环等待条件
产生死锁一定满足四个必要条件,满足四个必要条件不一定发生死锁
死锁预防思维导图:
死锁预防
死锁预防是一种静态的死锁解决办法,破环产生死锁的四个必要条件中的一个
破环互斥条件
- SPOOLing技术:把打印机改为逻辑上的共享设备
- 一般情况下互斥条件不能被破坏
破环请求和保持条件
- 一次性分配策略:要求所有进程一次性申请所有资源
- 要求持有资源的进程在请求新资源前释放
破环不可剥夺条件
- 若进程请求新资源被阻塞,则释放该进程所占有的所有资源
- 当进程申请一个资源被等待时,寻找已拥有该种资源并阻塞的进程抢占资源
破环循环等待条件
- 有序资源分配法:对所有资源编号,进程只能按顺序申请资源
死锁避免思维导图:
死锁避免
死锁避免是一种动态的死锁解决方法
核心在于“试探” 对于每一次资源申请,先尝试分配,判断是否有死锁风险,若没有,再真正分配
安全状态
- 是指系统能够满足所有进程的资源请求,而不陷入死锁状态
- 安全状态是无死锁的,不安全状态不一定死锁
- 死锁一定处于不安全状态
银行家算法
数据结构
- 恒等式3数组 Need[i][j] = Max[i][j] - Allocation[i][j]
- 系统可用资源 Available[j]
思想
- 检测请求是否大于进程所申报的最大数量 Request[j]<=Need[i][j];
- 检测请求是否超过了系统资源数量 Request[j]<=Available[j]
- 尝试分配,更新3数组 Available][j]-=Request[j]; Allocation[i][j]+=Request[j]; Need[i][j]-=Request[j];
- 真正分配,更新数组的值
注意点:寻找安全序列时Available的值要先减去Request再加上Max
4)判断系统安全状态 / 安全性算法
- Work[j]=Available[j]; Finish[i]=false;
- 找到一组安全序列使得所有进程能够顺利完成
- Finish[i]=TRUE; 则系统安全,不会产生死锁
死锁的监测和解除思维导图:
死锁检测和解除
死锁检测
方法:化简资源分配图
- 当出现了环路,不一定产生死锁
- 没有环路一定不会产生死锁
- 死锁定理:当且仅当资源分配图是不可完全简化的,用于死锁检测
- 可完全简化的,不会产生死锁
- 不可完全简化的,不一定发生死锁
死锁解除
- 系统重启
- 撤销所有进程
- 逐一撤销进程,直到死锁不再发生
- 退回检查点