3.5 死锁概述
L18
学习目标
死锁是多个进程因竞争资源而造成的僵局,需理解其产生条件与处理方法。
- 资源分类:可重用性资源(固定数量、可重复使用)和消耗性资源(动态创建和消耗);可抢占资源和不可抢占资源。
- 死锁的定义:多个进程因竞争资源而造成僵局,若无外力干预都无法推进。
- 产生死锁的四个必要条件:互斥条件、请求和保持条件、不剥夺条件、环路等待条件。
- 处理死锁的方法:预防死锁、避免死锁、检测和解除死锁。
原理 · 深入理解
3.5 死锁概述
本节概览:先建立「死锁概述」的框架,再依次展开下列小节。
- 资源问题
- 计算机系统中的死锁
- 死锁的定义、必要条件和处理方法
3.5.1 资源问题
可重用性资源可供进程重复使用多次,具有如下性质。
- 每个单元只能分配给一个进程,不允许多进程共享
- 使用顺序:请求→使用→释放,请求失败则阻塞
- 每类资源单元数目相对固定,运行期间不能创建或删除
可消耗性资源又称临时性资源,在进程运行期间动态创建和消耗。
- 单元数目在运行期间不断变化,有时为 0
- 进程可不断创造单元放入缓冲区
- 进程可请求若干单元用于消耗,不再返回
资源按是否可抢占分为两类。
可抢占性资源
进程获得后可被其他进程或系统抢占。
不可抢占性资源
分配后不能强行收回,只能由进程用完后自行释放。
3.5.2 计算机系统中的死锁
不可抢占性资源数量不足时,进程会因争夺资源而陷入僵局。
例:P1 先打开 F1 再打开 F2,P2 先打开 F2 再打开 F1,两者互相等待——死锁。
用资源分配图描述死锁:方块代表可重用资源(文件),圆圈代表进程,请求边和分配边表示资源占用关系。
三个进程利用消息通信机制通信时也可能形成死锁:各进程都在等待对方发送消息,谁也不先发送。
进程推进顺序不当也会引起死锁。
进程推进顺序合法
不会引起死锁的推进顺序,如曲线 1、2、3。
进程推进顺序非法
引起死锁的推进顺序,如曲线 4。
3.5.3 死锁的定义、必要条件和处理方法
产生死锁必须同时具备四个必要条件,任一个不成立死锁就不会发生。
- 互斥条件
- 请求和保持条件
- 不剥夺条件
- 环路等待条件
做 · 实验
- 根据「学习目标」列出 3 个关键词,对照原理段落解释给自己听。
- 完成 06-heap 或等价练习:分配-释放-再分配观察。
死锁概述
load-link
用控件单步操作;日志区记下每一步发生了什么。
代码导读
本课在工作台编译烧录。先读 user 实验入口,再对照 kernel / HDF 中被调用的函数,不要一上来改链接脚本。
总结与提升
- 能区分内碎片与外碎片。
- 能用自己的话复述学习目标,并指出概念与板上实验的对应。
- 能结合动画解释一次分配失败原因。
- 能说出 Flash 与 DRAM 在链接中的角色。
- 能画出嵌入式常见两级(SRAM/Flash)。
- 能默写死锁四条件,并举一个固件中的例子。
延伸思考
- 固定分区适合固件里的什么对象?
- 如果把本节机制拿到 Linux 或完整 OpenHarmony 上,会多出哪些硬件假设?
- 静态池为何在固件更受欢迎?
- 为何 app 起始常是 0x42000020?