新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 嵌入式软件设计中查找缺陷的几个技巧

嵌入式软件设计中查找缺陷的几个技巧

作者: 时间:2008-04-06 来源:网络 收藏

本文引用地址:https://www.eepw.com.cn/article/258085.htm  在复杂的代码中辨认潜在的竞争条件可能是一项乏味而又耗时的工作。相应的辅助工具从用来识别全局数据访问的简单脚本到先进的动态分析程序如Polyspace Verifier。虽然比较困难,但详尽的代码分析是识别这类错误的唯一途径。测试不大可能能够建立重复触发竞争条件所需的精确时序序列。

  三、死锁

  在共享资源的系统中,防止访问冲突极为重要,但这有可能导致另一个问题:死锁。当通过锁定一个资源来防止任何其它线程访问这个资源,以避免竞争条件时,必须对设计进行评估,确保绝对不会发生死锁。死锁测试通常没有什么效果,因为只有某种特定顺序的资源锁定才可能产生死锁,而一般的测试不大可能导致这种顺序。

  死锁只不过是多线程环境中一个锁定资源的问题。以下四个条件必须同时具备,才会发生死锁。防止其中任何一个条件出现都可以排除死锁的可能性:

  * 相互排除---每次只有一个线程可以使用某个锁定的资源;
  * 非先占---其它线程不能强迫另一个线程释放资源;
  * 保持并等待---线程在等待需要的其它任何资源时,保持它们已经锁定的资源;
  * 循环等待---存在一个线程循环链,其中每个线程保持链中下一个线程所需要的资源。


图1:循环等待
  图1中的资源分配图是死锁问题的一个例子。线程1首先锁定Buf资源,在保持Buf时,指向Bus,然后是Mux。如果线程1一直运行到结束,它最终将释放所有这些资源。线程2运行时,必须指向Bus、Sem,最后是Mux。线程3运行时,需要Sem和Buf。

  在这个设计实例中,无法保证任何一个线程能够在另一个线程开始执行之前结束。如果一个线程不能得到需要的某个资源,它将挂起执行(阻塞),直到该资源有效为止。在系统运行过程中,各线程都将对资源进行锁定或解锁。由于各线程运行和指向其资源的相对时序各不相同,有可能出现由于各个线程正在等待被其它线程保持的资源,导致所有线程都无法运行的情况。例如,如果线程1保持Buf,线程2保持Bus,而线程3已经取得了Sem,则系统将发生死锁。因为按照从Buf到Bus到Sem,再回到Buf的线程分配箭头,循环等待条件得到了满足。


图2:没有死锁
  潜在死锁问题识别出来之后,通常很容易进行修复。在图2中,对线程3进行了修改,使其在得到Sem之前首先设法指向Buf。这样,循环等待的条件就被打破了,系统将不会再受到死锁的影响。


评论


相关推荐

技术专区

关闭