关于系统死锁问题的分析
一.定义
死锁是指任务无限期等待不可能满足的条件的一种状态。
死锁相当于一种没有推出转换的状态,或者是推出转换本身建立在不可能出现的事件之上。
二.产生条件
死锁的产生须具备四个必要条件:
1)任务要求对共享资源进行互斥控制。
2)任务在等待其他资源被释放的同时,保持着某些资源的所有权。
3)任务不会强制释放资源。
4)存在循环等待条件。
当任务A的前置不变式是任务B的结束,同属任务B的前置不变式是任务A 结束的时候,就存在循环等待条件。
三.解决方法
以上四个条件是出现死锁的必要条件,所以只要他们之中任何一个条件失效就可以完全避免死锁。
在所列出来的条件中,条件2和4是最容易破坏的。
要破坏条件2,必须强行施加一种系统策略,即在请求其他共享资源的同时不能锁住任何资源。
这通常可以通过仔细设计来实现。
使用带监护条件的临界区可以防止这种条件的发生,如在FreeRTOS中可以调用portENTER_CRITICAL()函数关掉中断以防止中断对临界区操作的影响。
同时,临界区必须只具有很短的时间,否则会反过来影响中断响应时间。
在每次调用portENTER_CRITICAL()之后,必须尽快地配套调用portEXIT_CRITICAL()函数以推出临界区。
如果出现临界区太长而不适合简单地关中断来实现,可以采用挂起调度器的方式,但是唤醒调度器确实一个相对较长的操作,所以须根据实际情况对这两种方法恰当的应用。
要破坏条件4,则必须在每当某个任务申请某个共享资源的时候阻塞所有其他任务的继续执行。
这些被阻塞的任务一直被阻塞,直到持有资源的任务释放所有的共享资源为止。
在FreeRTOS中通过互斥信号量实现上述功能。
互斥信号量用于控制两个或多个任务间访问共享资源。
在用于互斥的场合,互斥量从概念上可看作是与共享资源关联的令牌。
一个任务想要合法地访问资源,其必须先成功地得到该资源对应的令牌。
当令牌持有者完成资源使用,其必须马上归还令牌。
只有归还了令牌,其他任务才可能成功持有,也才可能安全地访问该共享资源。
一个任务除非持有了令牌,否则不允许访问共享资源。