操作系统关键知识点之死锁相关问题(两阶段加锁、通信死锁与饥饿)
本次重新学习操作系统,希望通过对所学内容进行总结,与大家一同学习进步。以下将围绕死锁相关的扩展问题展开,包括两阶段加锁、通信死锁、活锁和饥饿,解析其原理、场景及应对策略,最后通过表格总结。
一、知识点总结
(一)两阶段加锁(数据库场景)
-
核心逻辑
- 阶段1(加锁阶段):进程尝试获取所有所需资源的锁,若某资源已被占用,则释放已获取的所有锁并重新开始。
- 阶段2(释放阶段):成功获取所有锁后,执行更新操作并释放锁。
- 目标:通过“全或无”的加锁策略避免死锁,确保进程在执行操作前拥有全部资源。
-
局限性
- 仅适用于支持回滚和重复执行的场景(如数据库事务),若进程执行不可重复的操作(如网络通信),重新开始可能导致错误。
(二)通信死锁(网络场景)
-
定义
- 进程间通过消息通信时,因等待对方事件(如请求/回复)而阻塞,且无资源竞争的死锁。例如,A等待B的回复,B等待A的请求,双方均阻塞。
-
与资源死锁的区别
- 资源依赖:无明显资源占用,仅依赖对方的通信行为。
- 解决方法:引入超时机制,发送方未收到回复时重新发送消息(需避免重复执行导致的副作用,如重复付款)。
-
网络中的资源死锁
- 例如,路由器间缓冲器耗尽导致数据包无法转发,形成资源竞争死锁(如A→B→C→D→A的循环等待缓冲器)。
(三)活锁(忙等待场景)
-
定义
- 进程未阻塞,但因抢占资源策略不合理,导致持续尝试但无法推进(如轮询互斥锁时的“伪死锁”状态)。
- 示例:进程A和B分别持有资源1和2,均尝试获取对方资源,不断轮询但无法获取,消耗CPU资源却无进展。
-
成因
- 非阻塞式资源请求(如忙等待)+ 不合理的重试策略(如随机等待后立即重试)。
(四)饥饿(资源分配不公)
-
定义
- 进程因资源分配策略偏向其他进程,长期无法获取所需资源而无法推进(如大文件打印进程被优先分配给小文件进程)。
-
解决策略
- 先来先服务(FCFS):按请求顺序分配资源,确保等待时间最长的进程优先获得资源,避免“插队”导致的饿死。
二、通俗讲解
(一)两阶段加锁:数据库的“原子操作”保障
- 类比场景:去餐厅点餐,需先点完所有菜(阶段1加锁),确认有食材后再开始做菜(阶段2操作)。若某道菜售罄,则取消已点的菜并重新点单。
- 重点:适合“要么全做,要么不做”的场景(如转账事务),但不适合中途无法回退的操作(如发送火箭指令)。
(二)通信死锁:网络中的“互等消息”僵局
- 类比场景:A给B发消息“下午开会吗?”,B收到后想回复“先确认会议室”,但需要A先提供会议室信息,于是B等待A的新消息,A等待B的回复,两人都卡住。
- 解决办法:A等10分钟没收到回复,重新发消息“是否需要我订会议室?”(超时重传),打破僵局。
(三)活锁:看似活跃实则停滞的“忙碌陷阱”
- 类比场景:两人过独木桥,A和B同时走到中间,A退一步,B也退一步,反复谦让却都过不去(忙等待+无阻塞)。
- 重点:活锁与死锁的区别在于进程是否阻塞,但结果都是无法前进,且活锁更难排查(进程状态为“运行中”)。
(四)饥饿:资源分配中的“慢性死亡”
- 类比场景:图书馆自习室按“学习时间短的人优先使用”规则分配座位,导致需要长期学习的人永远抢不到座位,只能“饥饿”等待。
- 解决办法:采用“排队制”(FCFS),先来的人先坐,避免“歧视长时用户”的策略。
三、知识点表格总结
问题类型 | 核心定义 | 典型场景 | 解决策略 | 重点对比 |
---|---|---|---|---|
两阶段加锁 | 进程分阶段获取/释放锁,确保原子性操作 | 数据库事务更新 | 阶段1失败则回滚,阶段2完成后释放所有锁 | 依赖操作可回滚,适用于事务型场景 |
通信死锁 | 进程因等待对方通信事件(如消息回复)而阻塞,无资源竞争 | 网络请求-响应模型 | 超时重传、消息去重机制 | 无资源占用,依赖时间触发的重试 |
活锁 | 进程未阻塞但因忙等待或不合理重试策略导致无法推进 | 轮询互斥锁、随机重试fork操作 | 引入随机等待间隔、优先级调度 | 进程状态为“运行”,但无实质进展 |
饥饿 | 资源分配策略导致部分进程长期无法获取资源 | 打印机优先分配给小文件进程 | 先来先服务(FCFS)、资源配额机制 | 与死锁的区别:进程未阻塞,但被无限期推迟 |
写作不易,希望这篇总结能帮助大家理解死锁相关的扩展问题!如果觉得有用,欢迎关注我的博客,点赞评论分享,一起探讨更多操作系统知识~