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

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

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

克服多核系統(tǒng)中的并發(fā)錯(cuò)誤

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

由于多核架構(gòu)的復(fù)雜性、并行性,并發(fā)性挑戰(zhàn)更加復(fù)雜。新的驗(yàn)證技術(shù)可以幫助捕捉騙局。。.

多核處理器改變了游戲規(guī)則。我們只需要看看我們的智能手機(jī)就能看到它們卓越的處理能力的影響。在多核之前,處理器性能每年翻一番。隨著半導(dǎo)體技術(shù)的進(jìn)步,芯片上的晶體管數(shù)量從 1990 年的 100 萬個(gè)增加到今天的 10 億個(gè)以上。隨著小型化的極限越來越近,業(yè)界轉(zhuǎn)向多核設(shè)計(jì)以保持性能改進(jìn)的步伐,因此現(xiàn)在四核處理器已司空見慣。通過并行處理器內(nèi)核倍增處理能力的能力可實(shí)現(xiàn)非凡的性能。

并發(fā)不是一個(gè)新話題,但它在多核平臺(tái)中呈現(xiàn)出一個(gè)新的維度。軟件開發(fā)人員已經(jīng)習(xí)慣于從單個(gè)處理器內(nèi)的任務(wù)調(diào)度和上下文切換的角度來考慮并發(fā)性。然而,對(duì)于多個(gè)處理器內(nèi)核,真正的并行性開始發(fā)揮作用:每個(gè)線程中的指令流在每個(gè)內(nèi)核上并行執(zhí)行。線程之間的通信通常使用共享內(nèi)存來實(shí)現(xiàn),并且對(duì)共享資源的訪問同步通常是復(fù)雜性的最大來源,如果操作不正確,則是導(dǎo)致錯(cuò)誤的主要原因。

編寫一個(gè)正確的并發(fā)程序是出了名的困難,而多核架構(gòu)使它變得更加困難。由于增加了復(fù)雜性,多核平臺(tái)加劇了并發(fā)錯(cuò)誤的影響,使它們特別有害。這些錯(cuò)誤,包括競(jìng)爭(zhēng)條件、死鎖、活鎖和資源匱乏,當(dāng)它們出現(xiàn)時(shí)很難發(fā)現(xiàn),甚至更難以診斷。在單處理器上無錯(cuò)誤運(yùn)行的程序可能會(huì)出現(xiàn)潛在錯(cuò)誤,例如多核系統(tǒng)上的死鎖。并發(fā)錯(cuò)誤可能會(huì)出現(xiàn)異常癥狀,這些癥狀在觸發(fā)它們的初始事件很久之后就會(huì)出現(xiàn),并且通常難以重現(xiàn)。因?yàn)樵跍y(cè)試過程中很難找到這樣的錯(cuò)誤,多核系統(tǒng)需要一種新的驗(yàn)證方法,專門解決并發(fā)錯(cuò)誤。到目前為止,降低這些錯(cuò)誤風(fēng)險(xiǎn)的最有效方法是采用多方面的方法,包括同行代碼審查、測(cè)試,最重要的是,高級(jí)靜態(tài)分析結(jié)合了復(fù)雜的并發(fā)模型。

編程語言支持

釋放多核系統(tǒng)的全部性能潛力需要先進(jìn)的編程技術(shù)。由于大多數(shù)嵌入式開發(fā)人員對(duì)多核編程比較陌生,因此引入并發(fā)錯(cuò)誤的風(fēng)險(xiǎn)非常大。今天,C 和 C++ 仍然是嵌入式系統(tǒng)最流行的編程語言。然而,這些語言的根本弱點(diǎn)之一是它們不是為并發(fā)而設(shè)計(jì)的。最新版本 C11 和 C++11 引入了對(duì)多線程的標(biāo)準(zhǔn)化支持。添加了三個(gè)特性來解決并發(fā)問題:定義多線程程序行為的內(nèi)存模型;可以被并發(fā)線程安全訪問的原子數(shù)據(jù)類型;以及幾個(gè)同步原語,例如鎖和條件變量。盡管有這些改進(jìn),

與此同時(shí),Java 越來越受到嵌入式開發(fā)人員的歡迎,如今有 28% 的人使用它,它現(xiàn)在是嵌入式系統(tǒng)第三流行的語言。與 C 和 C++ 相比,Java 始終在編程語言語法、源編譯器和標(biāo)準(zhǔn)庫中內(nèi)置了對(duì)多線程的支持。此外,Java 5 添加了 java.util.concurrent 庫,該庫在 Java 6 和 Java 7 中進(jìn)行了擴(kuò)展,為并發(fā)和并行編程提供了廣泛的支持。

許多嵌入式設(shè)計(jì)使用 C 或 C++ 和 Java 的組合。例如,Java 在汽車應(yīng)用程序中非常流行,因?yàn)樗鼮橛|摸屏顯示器或娛樂系統(tǒng)的用戶界面編程提供了一種簡單的方法。此類應(yīng)用程序可能有許多層,其中包含用 C 編寫的安全關(guān)鍵代碼,與運(yùn)行在用戶界面上的非安全關(guān)鍵 Java 代碼進(jìn)行通信。

靜態(tài)分析工具

多核平臺(tái)并發(fā)程序的最大挑戰(zhàn)可能是無法保證能找到所有并發(fā)錯(cuò)誤。實(shí)時(shí)執(zhí)行指令的相對(duì)順序是多線程程序中缺陷的主要來源。當(dāng)多個(gè)線程運(yùn)行時(shí),它們的指令執(zhí)行的相對(duì)順序取決于同時(shí)處于活動(dòng)狀態(tài)的其他線程。如果錯(cuò)誤是通過編程錯(cuò)誤引入的,非確定性交錯(cuò)可能會(huì)導(dǎo)致不可預(yù)知的結(jié)果。隨著指令數(shù)量的增加,可能的交錯(cuò)數(shù)量會(huì)大大增加,這種現(xiàn)象稱為組合爆炸。即使是最小的線程也有許多可能的交錯(cuò)?,F(xiàn)實(shí)世界的并發(fā)程序具有天文數(shù)字的合法交錯(cuò),所以測(cè)試每一個(gè)交織是不可行的。同樣,不可能使用同行代碼審查或演練來探索每條潛在的執(zhí)行路徑。這是高級(jí)靜態(tài)分析工具擅長的地方。

高級(jí)靜態(tài)分析工具使用符號(hào)執(zhí)行引擎來識(shí)別程序中的潛在問題,而無需實(shí)際運(yùn)行程序。它們的工作方式與編譯器非常相似,將源代碼作為輸入,然后對(duì)其進(jìn)行解析并將其轉(zhuǎn)換為中間表示 (IR)。編譯器會(huì)使用 IR 來生成目標(biāo)代碼,而靜態(tài)分析工具會(huì)保留 IR,也稱為模型。檢查器通過遍歷或查詢模型,對(duì)代碼進(jìn)行分析以查找常見缺陷、違反策略等,尋找指示缺陷的特定屬性或模式。復(fù)雜的符號(hào)執(zhí)行技術(shù)通過控制流圖探索路徑,控制流圖是一種數(shù)據(jù)結(jié)構(gòu),表示語句在程序中執(zhí)行的順序。算法跟蹤程序的抽象狀態(tài),并知道如何使用該狀態(tài)來排除對(duì)不可行路徑的考慮。模型的深度決定了工具的有效性。該深度基于內(nèi)置了多少程序行為知識(shí),一次可以考慮多少程序,以及它反映實(shí)際程序行為的準(zhǔn)確程度。

許多開發(fā)人員利用流行的開源工具來查找 Java 中的錯(cuò)誤,包括 FindBugs、PMD 和 CheckStyle。其中最廣泛使用的 FindBugs 使用靜態(tài)分析來識(shí)別 Java 程序中數(shù)百種不同類型的潛在錯(cuò)誤。FindBugs 對(duì) Java 字節(jié)碼(Java 虛擬機(jī)執(zhí)行的指令形式)進(jìn)行操作。PMD 和 CheckStyle 檢查源代碼是否符合編碼標(biāo)準(zhǔn)并檢測(cè)不良做法。

這些工具中的每一個(gè)都有其優(yōu)勢(shì)。一般來說,靜態(tài)分析工具的一個(gè)重要優(yōu)勢(shì)是它們可以在開發(fā)早期使用,甚至在測(cè)試開始之前就可以發(fā)現(xiàn)錯(cuò)誤??捎糜?Java 的大多數(shù)靜態(tài)分析工具都是通用的,可以捕獲一系列表面問題。

與這些開源工具相比,有一些商業(yè)產(chǎn)品專門用于非常精確地識(shí)別 Java、C 或 C++ 中的并發(fā)問題。這些工具包含非常深的模型,使他們能夠發(fā)現(xiàn)其他工具經(jīng)常遺漏的并發(fā)問題。這些高級(jí)靜態(tài)分析工具中的一些最有效的工具是基于對(duì)軟件并發(fā)行為的前沿學(xué)術(shù)研究。它們通過整個(gè)程序過程間分析提供 C 和 C++ 源代碼的高級(jí)靜態(tài)分析,通常可以處理多達(dá) 1000 萬行代碼的程序。除了查找競(jìng)爭(zhēng)條件和死鎖之外,Java 的一種商業(yè)工具還可以識(shí)別由于錯(cuò)誤使用 java.util.concurrent 提供的并發(fā)集合庫而導(dǎo)致的不可預(yù)測(cè)的結(jié)果。在協(xié)調(diào)對(duì)共享的非并發(fā)集合的訪問時(shí),它會(huì)檢測(cè)到錯(cuò)誤的錯(cuò)誤處理或不正確的同步。此外,它還可以幫助診斷由錯(cuò)誤的 API 使用、冗余同步和不必要地使用共享可變狀態(tài)引起的性能瓶頸。

由于許多項(xiàng)目將包括 Java 和 C 或 C++,因此團(tuán)隊(duì)會(huì)發(fā)現(xiàn)在集成開發(fā)環(huán)境 (IDE) 中使用工具更容易、更高效。有一些工具套件可用于嵌入式和托管平臺(tái)。商業(yè)版本為程序分析、程序檢查、程序理解和架構(gòu)可視化提供自動(dòng)化工作流程和強(qiáng)大工具。使用帶有目標(biāo)高級(jí)靜態(tài)分析工具的 IDE 使開發(fā)人員能夠發(fā)現(xiàn)現(xiàn)有并發(fā)代碼的基本設(shè)計(jì)意圖,并識(shí)別新代碼何時(shí)偏離該設(shè)計(jì)。它在首次引入新的并發(fā)缺陷時(shí)提供預(yù)警,并使用尖端技術(shù)幫助開發(fā)人員識(shí)別和理解它們。

有效的多核系統(tǒng)設(shè)計(jì)

為多核平臺(tái)開發(fā)嵌入式應(yīng)用程序需要一種新方法。需要先進(jìn)的編程技術(shù)來利用并行處理內(nèi)核??绮⑿刑幚砥鞯某绦蚓€程交錯(cuò)創(chuàng)建了天文數(shù)字的潛在執(zhí)行路徑。這使得不可能測(cè)試或?qū)彶槊恳粋€(gè)可能的場(chǎng)景。靜態(tài)分析提供了唯一可行的方法來探索高度并發(fā)系統(tǒng)中軟件錯(cuò)誤的所有可能代碼路徑。當(dāng)與其他代碼質(zhì)量實(shí)踐(例如代碼審查和集成測(cè)試)結(jié)合使用時(shí),高級(jí)靜態(tài)分析工具可以顯著降低由于未發(fā)現(xiàn)的并發(fā)錯(cuò)誤而導(dǎo)致的現(xiàn)場(chǎng)故障風(fēng)險(xiǎn)。

審核編輯:郭婷

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

    關(guān)注

    5060

    文章

    18983

    瀏覽量

    302323
  • JAVA
    +關(guān)注

    關(guān)注

    19

    文章

    2953

    瀏覽量

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

    關(guān)注

    21

    文章

    2102

    瀏覽量

    73460
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    pcb板設(shè)計(jì)的常見錯(cuò)誤

    印刷電路板(PCB)是電子設(shè)備不可或缺的組成部分,它負(fù)責(zé)連接電子元件并傳輸電信號(hào)。一個(gè)優(yōu)秀的PCB設(shè)計(jì)對(duì)于確保電路的性能、可靠性和成本效益至關(guān)重要。然而,在PCB設(shè)計(jì)過程,工程師可能會(huì)犯一些常見
    的頭像 發(fā)表于 11-04 13:58 ?108次閱讀

    socket編程錯(cuò)誤處理技巧

    Socket編程是網(wǎng)絡(luò)編程的基礎(chǔ),它允許程序之間通過TCP/IP協(xié)議進(jìn)行通信。然而,網(wǎng)絡(luò)通信是不穩(wěn)定的,可能會(huì)遇到各種問題,如網(wǎng)絡(luò)延遲、連接中斷、數(shù)據(jù)丟失等。 錯(cuò)誤處理的重要性 提高程序的健壯性
    的頭像 發(fā)表于 11-01 17:47 ?777次閱讀

    SRAM錯(cuò)誤檢測(cè)

    電子發(fā)燒友網(wǎng)站提供《SRAM錯(cuò)誤檢測(cè).pdf》資料免費(fèi)下載
    發(fā)表于 09-20 11:15 ?0次下載
    SRAM<b class='flag-5'>中</b>的<b class='flag-5'>錯(cuò)誤</b>檢測(cè)

    多核CPU的優(yōu)勢(shì)是什么

    多核CPU(Central Processing Unit,中央處理器)作為現(xiàn)代計(jì)算機(jī)技術(shù)的重要里程碑,其優(yōu)勢(shì)在于顯著提升了計(jì)算性能、多任務(wù)處理能力、系統(tǒng)穩(wěn)定性以及能效比等多個(gè)方面。以下將詳細(xì)闡述多核CPU的幾大優(yōu)勢(shì),并結(jié)合相關(guān)
    的頭像 發(fā)表于 08-22 14:30 ?1902次閱讀

    并發(fā)物聯(lián)網(wǎng)云平臺(tái)是什么

    并發(fā)物聯(lián)網(wǎng)云平臺(tái)是一種能夠處理大量設(shè)備同時(shí)連接并進(jìn)行數(shù)據(jù)交換的云計(jì)算平臺(tái)。這種平臺(tái)通常被設(shè)計(jì)用來應(yīng)對(duì)來自數(shù)以萬計(jì)甚至數(shù)十億計(jì)的物聯(lián)網(wǎng)設(shè)備的并發(fā)請(qǐng)求,保證系統(tǒng)的穩(wěn)定性和響應(yīng)速度。 首先,從技術(shù)層面
    的頭像 發(fā)表于 08-13 13:50 ?207次閱讀

    并發(fā)系統(tǒng)的藝術(shù):如何在流量洪峰中游刃有余

    前言 我們常說的三高,高并發(fā)、高可用、高性能,這些技術(shù)是構(gòu)建現(xiàn)代互聯(lián)網(wǎng)應(yīng)用程序所必需的。對(duì)于京東618備戰(zhàn)來說,所有的臺(tái)系統(tǒng)服務(wù),無疑都是圍繞著三高來展開的。而對(duì)于京東龐大的客戶群體,高并發(fā)
    的頭像 發(fā)表于 08-05 13:43 ?217次閱讀
    高<b class='flag-5'>并發(fā)</b><b class='flag-5'>系統(tǒng)</b>的藝術(shù):如何在流量洪峰中游刃有余

    克服載波同步載波相位模糊對(duì)信號(hào)傳輸產(chǎn)生影響方法是?

    在數(shù)字通信系統(tǒng),載波同步是確保信號(hào)正確傳輸和接收的重要環(huán)節(jié)。載波相位模糊是載波同步中常見的問題,它會(huì)導(dǎo)致信號(hào)解調(diào)錯(cuò)誤,從而影響通信質(zhì)量。
    的頭像 發(fā)表于 05-24 15:01 ?817次閱讀

    鴻蒙原生應(yīng)用開發(fā)-ArkTS語言基礎(chǔ)類庫多線程并發(fā)概述

    并發(fā)模型是用來實(shí)現(xiàn)不同應(yīng)用場(chǎng)景并發(fā)任務(wù)的編程模型,常見的并發(fā)模型分為基于內(nèi)存共享的并發(fā)模型和基于消息通信的
    發(fā)表于 03-22 15:40

    閉包在錯(cuò)誤處理的應(yīng)用模式探索

    通過在函數(shù)和方法返回錯(cuò)誤對(duì)象作為它們的唯一或最后一個(gè)返回值——如果返回 nil,則沒有錯(cuò)誤發(fā)生——并且主調(diào)(calling)函數(shù)總是應(yīng)該檢查收到的錯(cuò)誤。
    的頭像 發(fā)表于 03-15 09:57 ?388次閱讀

    應(yīng)用程序的服務(wù)器錯(cuò)誤怎么解決?

    在使用應(yīng)用程序時(shí),可能會(huì)遇到服務(wù)器錯(cuò)誤的問題。這種錯(cuò)誤通常會(huì)導(dǎo)致應(yīng)用程序無法正常運(yùn)行 ,給用戶帶來不便。下面將介紹應(yīng)用程序的服務(wù)器錯(cuò)誤及其解決方法,幫助您快速解決這一問題。
    的頭像 發(fā)表于 03-12 15:13 ?5602次閱讀

    多核異構(gòu)通信框架(RPMsg-Lite)

    概要 隨著科技的飛速發(fā)展,計(jì)算需求日益復(fù)雜和多樣化,傳統(tǒng)的單核處理器已難以滿足所有應(yīng)用場(chǎng)景的需求。在這樣的背景下,異構(gòu)多核系統(tǒng)應(yīng)運(yùn)而生,成為推動(dòng)計(jì)算領(lǐng)域進(jìn)步的重要力量。異構(gòu)多核系統(tǒng)不僅
    的頭像 發(fā)表于 03-08 18:20 ?4748次閱讀
    <b class='flag-5'>多核</b>異構(gòu)通信框架(RPMsg-Lite)

    AURIX系列MCU多核系統(tǒng)和時(shí)鐘有關(guān)系嗎?

    AURIX系列MCU多核系統(tǒng)和時(shí)鐘有關(guān)系嗎?2.如何系統(tǒng)的理解GTM的時(shí)鐘結(jié)構(gòu)(以前用的ST的片子,發(fā)現(xiàn)英飛凌MCU的時(shí)鐘樹和ST的很不一樣,有些時(shí)鐘實(shí)現(xiàn)的功能和原理是一樣的)?3.編寫應(yīng)用程序是不是不能脫離底層比較好?
    發(fā)表于 02-05 06:10

    盤點(diǎn)PCB設(shè)計(jì)的常見錯(cuò)誤

    搞技術(shù),難免存在錯(cuò)誤,只有經(jīng)歷過錯(cuò)誤,才能更快地成長。PCB設(shè)計(jì)也一樣,今天就來盤點(diǎn)一下PCB設(shè)計(jì)中最常見的錯(cuò)誤。
    的頭像 發(fā)表于 01-12 09:53 ?1305次閱讀
    盤點(diǎn)PCB設(shè)計(jì)<b class='flag-5'>中</b>的常見<b class='flag-5'>錯(cuò)誤</b>

    探討多線程編程的volatile關(guān)鍵字應(yīng)用

    有時(shí)候,我們可能需要在指針類型之間進(jìn)行轉(zhuǎn)換,而編譯器會(huì)認(rèn)為這是不安全的操作,從而導(dǎo)致編譯錯(cuò)誤。使用volatile關(guān)鍵字可以告知編譯器,這個(gè)類型轉(zhuǎn)換是有意義的,不應(yīng)該引發(fā)錯(cuò)誤。
    發(fā)表于 12-27 13:53 ?402次閱讀

    腳本錯(cuò)誤scripterror怎么解決

    分析和排查。以下是一些常見的解決腳本錯(cuò)誤的方法: 檢查語法錯(cuò)誤: 仔細(xì)檢查腳本的代碼,看是否有拼寫錯(cuò)誤、缺少分號(hào)、括號(hào)不匹配等語法錯(cuò)誤
    的頭像 發(fā)表于 11-26 14:46 ?7768次閱讀