本课时介绍多任务协同工作时容易隐发的一个问题:死锁。简单来说,就是多个任务之间存在某种依赖关系,导致相互等待,最终这些任务都没办法执行下去。
这里我们只介绍引发死锁的原理和基本解决方法。
主要内容
竞争资源引发死锁
如下所求,是多个任务间共享资源时,引发死锁。这里可以看到,每个任务在持有自己的资源时,同时还要等待另一任务释放资源,除非某中某一方预先释放自己所持有的资源,否则这些任务将一直等待下去,所有任务没有办法继续往下运行。
如果更简化一点:有两个任务,互相持有对方所期望拥有的资源,那么这两个任务就会僵持下去,引发死锁。
这点提醒我们:在处理多个任务共享多个资源时,要注意避免引发死锁。
环路等待事件引发死锁
此种现像本质上同【竞争资源引发死锁】。可以将通知看成是一种资源,前一任务持有通知,同时又在等待另一任务发通知。形成环路,引发死锁。
这点提醒我们:在处理多个任务相关之间存在多个方向的同步,要注意避免引发死锁。
重点难点
死锁引发条件
可以看到,在竞争资源时,引发死锁的条件如下。
- 互斥:资源不能被共享,同一时间只能由一个任务使用
- 请求与保持条件:任务请求资源的同时,持有原有资源不放
- 非剥夺条件:任务不能强制剥夺另一任务持有的资源
- 循环等待条件:请求链构成环路,存在循环等待。
死锁问题解决
我们在这里面向是的小型嵌入式操作系统,没有复杂的功能机制,所以对于死锁问题的解决,只能在源头开始。
也就是在编写代码时,要注意避免引发死锁条件的出现。一旦不注意出现死锁,只能对代码修改。