本课时介绍多任务协同工作时容易隐发的一个问题:死锁。简单来说,就是多个任务之间存在某种依赖关系,导致相互等待,最终这些任务都没办法执行下去。

这里我们只介绍引发死锁的原理和基本解决方法。

主要内容

课程中介绍了两种引发死锁的现像:竞争资源和环路等待。

竞争资源引发死锁

如下所求,是多个任务间共享资源时,引发死锁。这里可以看到,每个任务在持有自己的资源时,同时还要等待另一任务释放资源,除非某中某一方预先释放自己所持有的资源,否则这些任务将一直等待下去,所有任务没有办法继续往下运行。
环状同步造成的死锁问题 - 图1
如果更简化一点:有两个任务,互相持有对方所期望拥有的资源,那么这两个任务就会僵持下去,引发死锁。
这点提醒我们:在处理多个任务共享多个资源时,要注意避免引发死锁。

环路等待事件引发死锁

此种现像本质上同【竞争资源引发死锁】。可以将通知看成是一种资源,前一任务持有通知,同时又在等待另一任务发通知。形成环路,引发死锁。
环状同步造成的死锁问题 - 图2
这点提醒我们:在处理多个任务相关之间存在多个方向的同步,要注意避免引发死锁。

重点难点

死锁引发条件

可以看到,在竞争资源时,引发死锁的条件如下。

  • 互斥:资源不能被共享,同一时间只能由一个任务使用
  • 请求与保持条件:任务请求资源的同时,持有原有资源不放
  • 非剥夺条件:任务不能强制剥夺另一任务持有的资源
  • 循环等待条件:请求链构成环路,存在循环等待。

如果期望避免引发死锁,则要竞争以上几种条件同时出现的情况。

死锁问题解决

我们在这里面向是的小型嵌入式操作系统,没有复杂的功能机制,所以对于死锁问题的解决,只能在源头开始。
也就是在编写代码时,要注意避免引发死锁条件的出现。一旦不注意出现死锁,只能对代码修改。

注意事项

常见问题