新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 嵌入式軟件設計中查找缺陷的幾個技巧

        嵌入式軟件設計中查找缺陷的幾個技巧

        作者: 時間:2008-04-06 來源:網絡 收藏

        本文引用地址:http://www.104case.com/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。這樣,循環等待的條件就被打破了,系統將不會再受到死鎖的影響。


        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 海伦市| 德清县| 明溪县| 安国市| 乐昌市| 梓潼县| 汝州市| 新乡市| 山东| 大方县| 龙海市| 乌拉特前旗| 塔城市| 乐至县| 临朐县| 汉沽区| 新田县| 泾源县| 邹平县| 临漳县| 新干县| 石门县| 灵寿县| 大余县| 镇远县| 丰宁| 土默特左旗| 石门县| 荔浦县| 合川市| 澄江县| 铜梁县| 吴川市| 婺源县| 乡宁县| 三都| 陆丰市| 崇义县| 育儿| 秦安县| 衢州市|