0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

利用靜態(tài)分析工具構(gòu)建模型實(shí)現(xiàn)多核處理器的高質(zhì)量軟件

星星科技指導(dǎo)員 ? 來源:嵌入式計(jì)算設(shè)計(jì) ? 作者:Paul Anderson ? 2022-06-19 07:52 ? 次閱讀

對多核處理器進(jìn)行編程以利用其強(qiáng)大功能意味著編寫多線程代碼。C 和 C++ 不是為并發(fā)而設(shè)計(jì)的,因此開發(fā)人員必須為這些語言使用諸如 pthreads 之類的庫。由于全新類別的編程缺陷帶來的風(fēng)險(xiǎn),多線程代碼比單線程代碼更難正確處理。

在流氓的并發(fā)錯(cuò)誤庫中,競爭條件是臭名昭著的屢犯者。競爭條件發(fā)生在程序檢查資源屬性并假設(shè)該屬性沒有更改的情況下執(zhí)行操作,即使外部參與者已經(jīng)介入并更改了該屬性。

數(shù)據(jù)競爭是一種特殊類型的競爭條件,它涉及對多線程程序中內(nèi)存位置的并發(fā)訪問。當(dāng)有兩個(gè)或多個(gè)執(zhí)行線程訪問共享內(nèi)存位置,至少一個(gè)線程正在更改該位置的數(shù)據(jù),并且沒有明確的協(xié)調(diào)訪問機(jī)制時(shí),就會出現(xiàn)此缺陷。如果發(fā)生數(shù)據(jù)競爭,它會使程序處于不一致的狀態(tài)。

數(shù)據(jù)競爭的陰險(xiǎn)本質(zhì)

人們普遍認(rèn)為,一些數(shù)據(jù)競爭是無害的,可以安全地忽略。不幸的是,這僅在極少數(shù)情況下是正確的。最好通過舉例說明原因。

單例模式是一種常見的習(xí)慣用法,其中程序維護(hù)對單個(gè)底層對象的引用,如果已初始化,則布爾變量對其進(jìn)行編碼。這種模式也稱為延遲初始化。以下代碼是該模式的示例:

if (!initialized) {

object = create();

initialized = true;

}

。。. 目的 。。.

這段代碼完全適合單線程程序,但它不是線程安全的,因?yàn)樗诿麨閕nitialized的變量上存在數(shù)據(jù)競爭。如果由兩個(gè)不同的線程調(diào)用,則存在兩個(gè)線程幾乎同時(shí)觀察到初始化為 false 的風(fēng)險(xiǎn),并且都將調(diào)用create(),從而違反了單例屬性。

為了使這個(gè)線程安全,自然的方法是用鎖保護(hù)整個(gè)if語句。然而,獲取和釋放鎖的成本可能很高,因此程序員試圖通過使用雙重檢查鎖定習(xí)慣用法來避免這種成本——在鎖范圍之外進(jìn)行檢查,在鎖范圍內(nèi)進(jìn)行檢查。內(nèi)部檢查用于確認(rèn)在獲得鎖后第一個(gè)檢查仍然有效:

if (!initialized) {

lock();

if (!initialized) {

object = create();

initialized = true;

}

unlock();

}

。。. 目的 。。.

從表面上看,這看起來就足夠了,實(shí)際上,只要保證語句按該順序執(zhí)行就足夠了。但是,優(yōu)化編譯器可能會生成實(shí)質(zhì)上切換object = create()和initialized = true順序的代碼。畢竟,這兩個(gè)語句之間沒有明確的依賴關(guān)系。在這種情況下,如果第二個(gè)線程在分配給initialized之后的任何時(shí)間進(jìn)入此代碼,則該線程將在object被初始化之前使用它的值。

優(yōu)化編譯器是不可思議的野獸。那些優(yōu)化速度的人會考慮許多深?yuàn)W的考慮,其中很少有對程序員來說是顯而易見的。他們通常會生成明顯無序的指令,因?yàn)檫@樣做可能會導(dǎo)致更少的高速緩存未命中,或者因?yàn)樾枰俚闹噶睢?/p>

假設(shè)因?yàn)橹匦屡判蛟谇懊娴氖纠幸肓烁偁帡l件,所以認(rèn)為編譯器有問題是錯(cuò)誤的。編譯器正在做它被允許做的事情。語言規(guī)范對此非常清楚和明確:允許編譯器假設(shè)程序中沒有數(shù)據(jù)競爭。

實(shí)際上,規(guī)范更廣泛:允許編譯器在存在未定義行為的情況下做任何事情。這有時(shí)被開玩笑地稱為著火語義;如果程序具有未定義的行為,該規(guī)范允許編譯器將計(jì)算機(jī)置于火上。除了數(shù)據(jù)競爭之外,緩沖區(qū)溢出、無效地址的取消引用等許多傳統(tǒng)錯(cuò)誤也構(gòu)成了未定義的行為。因?yàn)榫幾g器可以自由地做任何事情,而不是燒毀建筑物,他們通常會做明智的事情,即假設(shè)未定義的行為永遠(yuǎn)不會發(fā)生并相應(yīng)地進(jìn)行優(yōu)化。

即使對于并發(fā)和編譯器方面的專家來說,這樣做的后果有時(shí)也會令人驚訝。很難讓程序員相信看起來完全正確的代碼可以編譯成有嚴(yán)重錯(cuò)誤的代碼。

另一個(gè)例子是值得描述的。假設(shè)有兩個(gè)線程,一個(gè)讀取共享變量,另一個(gè)寫入共享變量。讓我們假設(shè)讀者在寫入者更改之前或之后看到該值并不重要(這不是一種不常見的模式)。如果這些訪問不受鎖保護(hù),那么顯然存在數(shù)據(jù)競爭。然而,盡管著火規(guī)則,大多數(shù)程序員會得出結(jié)論,這是完全良性的。

事實(shí)證明,至少有兩種合理的方式可以編譯這段代碼,讀者會看到錯(cuò)誤的值。第一種方法很容易解釋:假設(shè)該值是一個(gè)只能讀取 32 位字的架構(gòu)上的 64 位數(shù)量。那么讀者和作者都需要兩條指令,不幸的交錯(cuò)可能意味著讀者看到舊值的前 32 位和新值的后 32 位,當(dāng)它們組合時(shí)可能不是舊值也不是新的。

生成錯(cuò)誤代碼的第二種方式更為微妙。假設(shè)讀者做了以下事情,其中??數(shù)據(jù)競爭在名為global的變量上:

int local = global; // Take a copy of

// the global

if (local == something) {

。..

}

。.. // Some non-trivial code that does

// not change global or local

if (local == something) {

。..

}

在這里,讀者正在制作 racy 變量的本地副本并引用該值兩次??梢院侠淼仄谕麅蓚€(gè)地方的值相同,但同樣,優(yōu)化編譯器可以生成未滿足期望的代碼。如果將local分配給一個(gè)寄存器,那么它將有一個(gè)值用于第一次比較,但如果兩個(gè)條件之間的代碼足夠重要,那么該寄存器可能會溢出——換句話說,為了不同的目的而重用。在這種情況下,在第二個(gè)條件下,local的值將從全局變量重新加載到寄存器中,此時(shí)編寫器可能已將其更改為不同的值。

程序員應(yīng)該非常懷疑某些數(shù)據(jù)競爭是可以接受的,并且應(yīng)該努力從他們的代碼中找到并刪除它們。

發(fā)現(xiàn)風(fēng)險(xiǎn)缺陷的技術(shù)

在發(fā)現(xiàn)并發(fā)缺陷時(shí),傳統(tǒng)的動(dòng)態(tài)測試技術(shù)可能不夠用。一個(gè)通過一百次測試的程序并不能保證下一次通過,即使是相同的輸入和相同的環(huán)境。這些錯(cuò)誤是否出現(xiàn)對時(shí)間非常敏感,線程中的操作交錯(cuò)的順序本質(zhì)上是不確定的。

用于發(fā)現(xiàn)數(shù)據(jù)競爭的新動(dòng)態(tài)測試技術(shù)正在出現(xiàn)。這些技術(shù)通過在應(yīng)用程序執(zhí)行時(shí)監(jiān)視它們并觀察每個(gè)線程持有的鎖以及這些線程正在訪問的內(nèi)存位置來工作。如果發(fā)現(xiàn)異常,則發(fā)出診斷。其他工具有助于診斷可能導(dǎo)致故障的數(shù)據(jù)競爭。一些公司現(xiàn)在提供工具來促進(jìn)數(shù)據(jù)競爭的診斷,從而允許重播導(dǎo)致異常的事件。

靜態(tài)分析工具也可用于查找數(shù)據(jù)競爭和其他并發(fā)錯(cuò)誤。動(dòng)態(tài)測試工具會發(fā)現(xiàn)針對具有固定輸入集的程序的特定執(zhí)行出現(xiàn)的缺陷,而靜態(tài)分析工具會檢查所有可能的執(zhí)行和所有可能的輸入。出于性能原因,工具可能會限制進(jìn)行多少探索,因此可能并不完全詳盡;即便如此,它們可以涵蓋的范圍遠(yuǎn)遠(yuǎn)超過動(dòng)態(tài)測試所能實(shí)現(xiàn)的范圍。靜態(tài)分析的優(yōu)點(diǎn)是不需要測試用例,因?yàn)槌绦驈奈凑嬲龍?zhí)行過。

相反,這些工具通過創(chuàng)建程序模型然后以各種方式探索模型以發(fā)現(xiàn)異常來工作。GrammaTech 的 CodeSonar 通過創(chuàng)建表示每個(gè)線程持有的鎖集的模型并通過執(zhí)行探索執(zhí)行路徑的程序的符號執(zhí)行來發(fā)現(xiàn)數(shù)據(jù)競爭。它記錄受鎖保護(hù)的變量集,并使用此信息來查找可能導(dǎo)致共享變量在沒有適當(dāng)同步的情況下使用的交錯(cuò)。類似的技術(shù)可用于發(fā)現(xiàn)其他并發(fā)缺陷,例如死鎖和鎖管理不善。

一旦發(fā)現(xiàn),數(shù)據(jù)競爭通常很容易修復(fù),盡管這樣做會導(dǎo)致性能損失。在某些情況下,可能會嘗試使用 C 中的 volatile 關(guān)鍵字來糾正數(shù)據(jù)爭用,但不建議這樣做,因?yàn)?volatile 并非旨在解決并發(fā)問題,并且在任何情況下都是一個(gè)難以理解的構(gòu)造,經(jīng)常被錯(cuò)誤編譯。最新版本的 C 和 C++ 包含并發(fā)并支持原子操作。對這些操作的編譯器支持正在慢慢出現(xiàn),在它變得可用之前,最好的方法是使用鎖。

為了實(shí)現(xiàn)多核處理器的高質(zhì)量軟件,建議對數(shù)據(jù)競爭采取零容忍政策。使用靜態(tài)和動(dòng)態(tài)技術(shù)的組合來查找它們,并注意不要過度依賴深?yuàn)W的編譯器技術(shù)來修復(fù)它們。這些缺陷是如此危險(xiǎn)和不可預(yù)測,因此系統(tǒng)地消除它們是確保它們不會造成傷害的唯一安全方法。

審核編輯:郭婷

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 處理器
    +關(guān)注

    關(guān)注

    68

    文章

    19111

    瀏覽量

    228858
  • C++
    C++
    +關(guān)注

    關(guān)注

    21

    文章

    2102

    瀏覽量

    73457
  • 編譯器
    +關(guān)注

    關(guān)注

    1

    文章

    1617

    瀏覽量

    49019
收藏 人收藏

    評論

    相關(guān)推薦

    信雅達(dá)入選2024年度中國軟件高質(zhì)量發(fā)展前百家企業(yè)

    近日,中國軟件行業(yè)協(xié)會首次發(fā)布《中國軟件產(chǎn)業(yè)高質(zhì)量發(fā)展報(bào)告(2024)》(以下簡稱“報(bào)告”),深入分析了我國軟件產(chǎn)業(yè)的發(fā)展現(xiàn)狀、特點(diǎn)與問題,
    的頭像 發(fā)表于 10-22 11:08 ?176次閱讀

    知識分享 | 輕松實(shí)現(xiàn)優(yōu)質(zhì)建模

    知識分享在知識分享欄目中,我們會定期與讀者分享來自MES模賽思的基于模型軟件開發(fā)相關(guān)Know-How干貨,關(guān)注公眾號,隨時(shí)掌握基于模型軟件設(shè)計(jì)的技術(shù)知識。輕松
    的頭像 發(fā)表于 09-12 08:08 ?308次閱讀
    知識分享 | 輕松<b class='flag-5'>實(shí)現(xiàn)</b>優(yōu)質(zhì)<b class='flag-5'>建模</b>

    DevOps中的質(zhì)量門工作原理,以及靜態(tài)代碼分析Klocwork和Perforce Helix QAC在質(zhì)量門中的實(shí)踐應(yīng)用

    如何使用靜態(tài)代碼分析工具(如Klocwork 和 Helix QAC)實(shí)現(xiàn)質(zhì)量門。 什么是質(zhì)量
    的頭像 發(fā)表于 07-29 15:12 ?298次閱讀

    科技創(chuàng)新!國產(chǎn)自主三坐標(biāo)測量機(jī)推動(dòng)產(chǎn)業(yè)高質(zhì)量發(fā)展

    科技創(chuàng)新推動(dòng)高質(zhì)量發(fā)展,精密幾何測量儀器是核心。中圖三坐標(biāo)測量機(jī)采用創(chuàng)新技術(shù),提升測量精度和穩(wěn)定性,擁有自主可控軟件,助力產(chǎn)業(yè)升級,實(shí)現(xiàn)高質(zhì)量發(fā)展。
    的頭像 發(fā)表于 07-12 11:32 ?1149次閱讀
    科技創(chuàng)新!國產(chǎn)自主三坐標(biāo)測量機(jī)推動(dòng)產(chǎn)業(yè)<b class='flag-5'>高質(zhì)量</b>發(fā)展

    上位機(jī)監(jiān)控軟件如何提高質(zhì)量

    上位機(jī)監(jiān)控軟件在工業(yè)自動(dòng)化和智能制造領(lǐng)域中扮演著舉足輕重的角色。它通過實(shí)時(shí)監(jiān)控、數(shù)據(jù)采集、分析處理,幫助企業(yè)實(shí)現(xiàn)生產(chǎn)過程的優(yōu)化和自動(dòng)化。然而,要提高上位機(jī)監(jiān)控
    的頭像 發(fā)表于 06-07 09:14 ?333次閱讀

    【直播預(yù)告】基于ISO 26262實(shí)現(xiàn)高質(zhì)量的MBD過程

    直播時(shí)間:2024年6月12號20:00直播平臺:視頻號、CSDN、B站、抖音下方一鍵預(yù)約直播大綱?基于模型軟件開發(fā)(MBD)基本原則和優(yōu)勢模型質(zhì)量是高效MBD的關(guān)鍵設(shè)計(jì)
    的頭像 發(fā)表于 06-06 08:25 ?304次閱讀
    【直播預(yù)告】基于ISO 26262<b class='flag-5'>實(shí)現(xiàn)</b><b class='flag-5'>高質(zhì)量</b>的MBD過程

    北斗芯片產(chǎn)業(yè)的高質(zhì)量發(fā)展之路

    高質(zhì)量發(fā)展是全面建設(shè)社會主義現(xiàn)代化國家的首要任務(wù)”,二十大報(bào)告中對高質(zhì)量發(fā)展有著明確的論斷和要求。在2023年的全國兩會中還指出,加快實(shí)現(xiàn)高水平科技自立自強(qiáng),是推動(dòng)高質(zhì)量發(fā)展的必由之
    的頭像 發(fā)表于 03-15 14:03 ?344次閱讀
    北斗芯片產(chǎn)業(yè)的<b class='flag-5'>高質(zhì)量</b>發(fā)展之路

    鐳雕機(jī):如何利用激光技術(shù)實(shí)現(xiàn)高質(zhì)量的產(chǎn)品標(biāo)記

    鐳雕機(jī)是一種利用激光技術(shù)實(shí)現(xiàn)高質(zhì)量產(chǎn)品標(biāo)記的設(shè)備。它通過激光束在各種不同的物質(zhì)表面進(jìn)行精確的打標(biāo),可以產(chǎn)生永久性的標(biāo)記效果,這些標(biāo)記不僅精美,而且具有高度的精度和清晰度。以下是鐳雕機(jī)如何利用
    的頭像 發(fā)表于 03-14 20:10 ?450次閱讀
    鐳雕機(jī):如何<b class='flag-5'>利用</b>激光技術(shù)<b class='flag-5'>實(shí)現(xiàn)</b><b class='flag-5'>高質(zhì)量</b>的產(chǎn)品標(biāo)記

    穩(wěn)中創(chuàng)新?產(chǎn)業(yè)升級?高質(zhì)量發(fā)展 | 聯(lián)誠發(fā)高質(zhì)量發(fā)展工作推進(jìn)會議召開

    推動(dòng)企業(yè)高質(zhì)量發(fā)展。聯(lián)誠發(fā)創(chuàng)始人兼總裁龍平芳、董秘毛強(qiáng)軍等公司領(lǐng)導(dǎo)、員工代表出席了本次大會。 會上,董秘毛強(qiáng)軍首先提到,在當(dāng)今競爭激烈的市場環(huán)境中,公司的高質(zhì)量發(fā)展是企業(yè)追求的最終目標(biāo)。為了實(shí)現(xiàn)這一目標(biāo),各板塊和各崗
    的頭像 發(fā)表于 02-22 11:33 ?435次閱讀
    穩(wěn)中創(chuàng)新?產(chǎn)業(yè)升級?<b class='flag-5'>高質(zhì)量</b>發(fā)展 | 聯(lián)誠發(fā)<b class='flag-5'>高質(zhì)量</b>發(fā)展工作推進(jìn)會議召開

    商湯科技與庫醇科技達(dá)成合作 為垂域大模型構(gòu)建高質(zhì)量大規(guī)模的領(lǐng)域微調(diào)數(shù)據(jù)

    數(shù)字化轉(zhuǎn)型,為垂域大模型構(gòu)建高質(zhì)量大規(guī)模的領(lǐng)域微調(diào)數(shù)據(jù)。 ? 本次合作將基于商湯通用大模型進(jìn)行二次開發(fā),給模型注入領(lǐng)域知識, 訓(xùn)練一個(gè)專門根
    的頭像 發(fā)表于 01-10 09:46 ?668次閱讀
    商湯科技與庫醇科技達(dá)成合作 為垂域大<b class='flag-5'>模型</b><b class='flag-5'>構(gòu)建</b><b class='flag-5'>高質(zhì)量</b>大規(guī)模的領(lǐng)域微調(diào)數(shù)據(jù)

    首批!中軟國際四款審計(jì)產(chǎn)品入選“高質(zhì)量智能審計(jì)工具目錄”

    高質(zhì)量智能審計(jì)工具目錄 ”。 12月15日,由中國信通院主辦的“2023 GOLF+ IT新治理領(lǐng)導(dǎo)力論壇”在北京召開,論壇以“筑牢治理根基,共建數(shù)字未來”為主題,旨在助力企業(yè)健康、高質(zhì)量發(fā)展,共建IT治理繁榮生態(tài)。論壇上
    的頭像 發(fā)表于 12-16 16:10 ?1020次閱讀

    雙目測寬儀高質(zhì)量生產(chǎn)利器 測寬儀價(jià)格

    :500Hz; 電源電壓:AC 220±15% V,50Hz; KX02-SY1000型雙目測寬儀是高質(zhì)量高精度的可應(yīng)用于熱軋、冷軋板材的在線檢測設(shè)備,熱軋時(shí)利用其自發(fā)光即可檢測,冷軋時(shí),則需要安裝光源進(jìn)行補(bǔ)
    發(fā)表于 12-04 17:10

    卓越領(lǐng)航!廣和通獲評“2023高質(zhì)量發(fā)展領(lǐng)軍企業(yè)”

    ,廣和通榮獲“2023高質(zhì)量發(fā)展領(lǐng)軍企業(yè)”! 該榜單由深圳市企業(yè)高質(zhì)量發(fā)展促進(jìn)會聯(lián)合哈爾濱工業(yè)大學(xué)(深圳)深圳高質(zhì)量發(fā)展與新結(jié)構(gòu)研究院評選發(fā)布,旨在以科學(xué)研究、精準(zhǔn)分析和高效服務(wù)洞悉產(chǎn)
    的頭像 發(fā)表于 11-29 18:00 ?474次閱讀
    卓越領(lǐng)航!廣和通獲評“2023<b class='flag-5'>高質(zhì)量</b>發(fā)展領(lǐng)軍企業(yè)”

    助力電子產(chǎn)業(yè)高質(zhì)量發(fā)展,華秋電子設(shè)計(jì)與制造技術(shù)研討會成功舉辦

    優(yōu)化產(chǎn)品設(shè)計(jì),規(guī)避生產(chǎn)制造問題,提升產(chǎn)品可可制造性?華秋智能制造中心資深工程師陶海峰帶來了《DFM軟件打通電子設(shè)計(jì)與制造,賦能產(chǎn)品高質(zhì)量提升》主題分享。 隨著電子產(chǎn)品趨向更薄、更輕便、更小體積、更高
    發(fā)表于 11-24 16:50

    為什么有多核處理器?從多核到眾核處理器

    其實(shí)“多核”這個(gè)詞已經(jīng)流行很多年了,世界上第一款商用的非嵌入式多核處理器是2002年IBM推出的POWER4。
    的頭像 發(fā)表于 11-16 16:25 ?1605次閱讀
    為什么有<b class='flag-5'>多核</b><b class='flag-5'>處理器</b>?從<b class='flag-5'>多核</b>到眾核<b class='flag-5'>處理器</b>