新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 嵌入式軟件設(shè)計(jì)中查找缺陷的幾個(gè)技巧

嵌入式軟件設(shè)計(jì)中查找缺陷的幾個(gè)技巧

作者: 時(shí)間:2008-04-06 來(lái)源:網(wǎng)絡(luò) 收藏

本文引用地址:http://butianyuan.cn/article/258085.htm  在復(fù)雜的代碼中辨認(rèn)潛在的競(jìng)爭(zhēng)條件可能是一項(xiàng)乏味而又耗時(shí)的工作。相應(yīng)的輔助工具從用來(lái)識(shí)別全局?jǐn)?shù)據(jù)訪問(wèn)的簡(jiǎn)單腳本到先進(jìn)的動(dòng)態(tài)分析程序如Polyspace Verifier。雖然比較困難,但詳盡的代碼分析是識(shí)別這類(lèi)錯(cuò)誤的唯一途徑。測(cè)試不大可能能夠建立重復(fù)觸發(fā)競(jìng)爭(zhēng)條件所需的精確時(shí)序序列。

  三、死鎖

  在共享資源的系統(tǒng)中,防止訪問(wèn)沖突極為重要,但這有可能導(dǎo)致另一個(gè)問(wèn)題:死鎖。當(dāng)通過(guò)鎖定一個(gè)資源來(lái)防止任何其它線程訪問(wèn)這個(gè)資源,以避免競(jìng)爭(zhēng)條件時(shí),必須對(duì)設(shè)計(jì)進(jìn)行評(píng)估,確保絕對(duì)不會(huì)發(fā)生死鎖。死鎖測(cè)試通常沒(méi)有什么效果,因?yàn)橹挥心撤N特定順序的資源鎖定才可能產(chǎn)生死鎖,而一般的測(cè)試不大可能導(dǎo)致這種順序。

  死鎖只不過(guò)是多線程環(huán)境中一個(gè)鎖定資源的問(wèn)題。以下四個(gè)條件必須同時(shí)具備,才會(huì)發(fā)生死鎖。防止其中任何一個(gè)條件出現(xiàn)都可以排除死鎖的可能性:

  * 相互排除---每次只有一個(gè)線程可以使用某個(gè)鎖定的資源;
  * 非先占---其它線程不能強(qiáng)迫另一個(gè)線程釋放資源;
  * 保持并等待---線程在等待需要的其它任何資源時(shí),保持它們已經(jīng)鎖定的資源;
  * 循環(huán)等待---存在一個(gè)線程循環(huán)鏈,其中每個(gè)線程保持鏈中下一個(gè)線程所需要的資源。


圖1:循環(huán)等待
  圖1中的資源分配圖是死鎖問(wèn)題的一個(gè)例子。線程1首先鎖定Buf資源,在保持Buf時(shí),指向Bus,然后是Mux。如果線程1一直運(yùn)行到結(jié)束,它最終將釋放所有這些資源。線程2運(yùn)行時(shí),必須指向Bus、Sem,最后是Mux。線程3運(yùn)行時(shí),需要Sem和Buf。

  在這個(gè)設(shè)計(jì)實(shí)例中,無(wú)法保證任何一個(gè)線程能夠在另一個(gè)線程開(kāi)始執(zhí)行之前結(jié)束。如果一個(gè)線程不能得到需要的某個(gè)資源,它將掛起執(zhí)行(阻塞),直到該資源有效為止。在系統(tǒng)運(yùn)行過(guò)程中,各線程都將對(duì)資源進(jìn)行鎖定或解鎖。由于各線程運(yùn)行和指向其資源的相對(duì)時(shí)序各不相同,有可能出現(xiàn)由于各個(gè)線程正在等待被其它線程保持的資源,導(dǎo)致所有線程都無(wú)法運(yùn)行的情況。例如,如果線程1保持Buf,線程2保持Bus,而線程3已經(jīng)取得了Sem,則系統(tǒng)將發(fā)生死鎖。因?yàn)榘凑諒腂uf到Bus到Sem,再回到Buf的線程分配箭頭,循環(huán)等待條件得到了滿足。


圖2:沒(méi)有死鎖
  潛在死鎖問(wèn)題識(shí)別出來(lái)之后,通常很容易進(jìn)行修復(fù)。在圖2中,對(duì)線程3進(jìn)行了修改,使其在得到Sem之前首先設(shè)法指向Buf。這樣,循環(huán)等待的條件就被打破了,系統(tǒng)將不會(huì)再受到死鎖的影響。


評(píng)論


相關(guān)推薦

技術(shù)專(zhuān)區(qū)

關(guān)閉