操作系统(8)---死锁
一、死锁
死锁:由于竞争资源或者通信关系,两个或多个进程在执行中出现永远互相等待有其他进程引发的事件。例如,在上文的生产者和消费者问题中,若是s1和s2的初值同时设为0,则会出现生产者等待消费者消费,消费者等待生产者生产,出现了永远互相等待,即死锁。
二、资源分类与分配
资源可分为:
- 可重用资源
- 资源不能被删除且在任何时刻只能有一个进程使用
- 进程释放资源后可被重用
- 可能出现死锁(每个进程占用一部分资源并请求其他资源)
- 消耗资源
- 资源被创建和销毁
- 可能出现死锁(进程互相等待对方的消息,消息即消耗资源)
资源分配实例:
P1:等待R1,占用R2的一个实例,需要等待P2释放R1
P2:等待R3,占用R1和R2的另一个实例,需要等待P3释放R3
P3:等待R2,占用R3,需要等待P1或者P2释放R2的一个实例,但P1需要等待P2
不难看出,P2和P3在互相等待,出现死锁。
P1:等待R1,占用R2的一个实例,需要等待P2或P3释放R1
P2:占用R1,无需等待
P3:等待R2,占用R1的一个实例,需要等待P1或P4释放R2
P4:占用R2,无需等待
可以看出,只要P2/P4释放资源后,P1/P3就可以占用R1/R2资源进行执行,有循环等待,但没有所死。
三、死锁的出现条件与处理方法
以上资源分配的例子可以看出,死锁出现的四个必要条件:
- 互斥
- 持有并等待(占有资源且等待资源)
- 非抢占(资源只能由进程使用完后自主释放)
- 循环等待(e.g p0等待p1,p1等待p2,p2等待p0)
死锁处理方法:
- 预防:限制并发进程对资源的请求,是系统在任何时刻都不满足死锁的必要条件。(比如,把互斥的共享资源封装为可同时访问;进程不持有资源,开始执行时直接请求到所有资源等)该处理方法的问题是,会破坏很多进程管理的原有机制,如进程互斥访问共享资源的机制。
- 避免(再分配资源先判断是否会出现死锁)——>银行家算法
- 要求进程声明需要资源的最大数目(单次借款最大数)
- 限制提供与分配的资源数量,只确保满足进程的最大需求(借款限额度)
- 动态检查资源分配状态,确保不会出现循环等待
- 检测和恢复(在检测到锁死之后进行恢复,但通常操作系统选择忽略,需要使用者自己杀死进程)
四、系统资源分配的安全状态与银行家算法
系统资源分配的安全状态:
分类:
操作系统
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理