如今兵罢,隨著計算機(jī)硬件,網(wǎng)絡(luò)技術(shù)以及多核心處理器系統(tǒng)的發(fā)展滓窍,并發(fā)系統(tǒng)已成為當(dāng)前主流的軟件體系卖词,隨著實際應(yīng)用對并發(fā)系統(tǒng)軟件的需求不斷增加,并發(fā)程序的分析、理解贰您、調(diào)試坏平、測試和維護(hù)已引起人們的高度重視,并發(fā)程序在提高計算效率上發(fā)揮著越來越重要的作用。
程序的并發(fā)是指若干個可在同一時間段內(nèi)執(zhí)行的程序模塊锦亦。并發(fā)和并行從宏觀上來講都是同時處理多路請求的概念舶替。但并發(fā)和并行又有區(qū)別,并行是指兩個或者多個事件在同一時刻發(fā)生杠园;而并發(fā)是指兩個或多個事件在同一時間間隔內(nèi)發(fā)生顾瞪。
并發(fā)程序的特性導(dǎo)致錯誤具有不可重現(xiàn)性,程序員很難根據(jù)錯誤報告重現(xiàn)錯誤并進(jìn)行糾正抛蚁,這使軟件排錯工作非常困難陈醒。程序的正確性僅僅依賴于程序員編寫正確的,不會沖突的代碼瞧甩,然而編寫高質(zhì)量的并發(fā)程序?qū)τ诔绦騿T而言并不是一件簡單的事钉跷,很難滿足高可靠性軟件的要求。
由于并發(fā)程序中線程調(diào)度的不確定性肚逸,并發(fā)程序開發(fā)者很難考慮到所有的輸入以及線程調(diào)度組合爷辙,使得目前的并發(fā)程序中很容易出現(xiàn)并發(fā)錯誤。另一方面朦促,并發(fā)程序帶來的問題也給傳統(tǒng)的軟件調(diào)試膝晾、軟件測試、程序分析等領(lǐng)域帶來新的挑戰(zhàn)务冕。并發(fā)程序中使用多線程技術(shù),會帶來數(shù)據(jù)的并發(fā)訪問,如果沒有進(jìn)行恰當(dāng)?shù)耐?可能會引起并發(fā)錯誤,例如數(shù)據(jù)競爭血当、原子性錯誤、數(shù)據(jù)沒有初始化和死鎖等,這些問題說明存在并發(fā)程序缺陷,會帶來和預(yù)期不同的程序執(zhí)行結(jié)果。
雖然對于并發(fā)程序的測試已經(jīng)提出了很多方法臊旭,但尚未形成完備的體系落恼,很多問題還有待解決。因此离熏,針對并發(fā)程序進(jìn)行有效的測試领跛,重現(xiàn)錯誤,找出錯誤路徑撤奸,是現(xiàn)代軟件測試的一個重要研究點。
并發(fā)軟件最常見的錯誤是非確定性喊括,數(shù)據(jù)競爭和死鎖胧瓜。非確定性行為給我們在結(jié)構(gòu)上測試多線程程序帶來了更多的挑戰(zhàn)。這意味著對并發(fā)程序的相同輸入可能導(dǎo)致不同的執(zhí)行序列郑什,它發(fā)生的原因是并發(fā)程序的交錯執(zhí)行從而可能造成應(yīng)用程序得出不正確的運行結(jié)果府喳。并發(fā)錯誤的發(fā)生不僅取決于程序的輸入和運行環(huán)境,它還取決于不同線程對同一內(nèi)存單元的交叉訪問順序以及一些和具體時間有關(guān)的事件(如信號量)蘑拯。
并發(fā)程序中的錯誤可能導(dǎo)致嚴(yán)重的后果钝满,如數(shù)據(jù)競爭,死鎖申窘,活鎖弯蚜,饑餓,順序違背以及原子性違背剃法。
數(shù)據(jù)競爭是指當(dāng)兩個或多個線程同時訪問共享數(shù)據(jù)并更改它時碎捺,會發(fā)生競爭條件;這導(dǎo)致對于共享數(shù)據(jù)的不可預(yù)測的輸出贷洲。數(shù)據(jù)競爭出現(xiàn)在軟件中收厨,當(dāng)應(yīng)用程序依賴于進(jìn)程或線程的順序或時序才能正常運行時。與電子產(chǎn)品一樣优构,存在嚴(yán)重的數(shù)據(jù)競爭诵叁,導(dǎo)致無效的執(zhí)行和錯誤。當(dāng)進(jìn)程或線程依賴某些共享狀態(tài)時钦椭,通常會發(fā)生嚴(yán)重的數(shù)據(jù)競爭拧额。共享狀態(tài)下的操作是必須相互排斥的關(guān)鍵部分。不遵守這個規(guī)則就會破壞共享狀態(tài)的可能性玉凯。
在C11和C ++ 11標(biāo)準(zhǔn)中定義的存儲器模型對于共享存儲器位置的并發(fā)讀取和寫入引起的關(guān)鍵競爭條件使用術(shù)語“數(shù)據(jù)競爭”势腮。包含數(shù)據(jù)競賽的AC或C ++程序有未定義的行為。數(shù)據(jù)競爭問題具有難以再現(xiàn)和調(diào)試的聲譽漫仆,因為最終結(jié)果是非確定性的捎拯,并且取決于干擾線程之間的相對時序。
因此,程序運行時發(fā)生的問題可能會在調(diào)試模式下運行時署照,添加額外的日志記錄或連接調(diào)試器(通常稱為“ Heisenbug ”)時消失祸泪。許多和軟件數(shù)據(jù)競爭有關(guān)聯(lián)的計算機(jī)安全隱患。數(shù)據(jù)競爭允許訪問共享資源的線程或者進(jìn)程利用該資源從而導(dǎo)致其他線程或進(jìn)程發(fā)生故障建芙。兩個或多個程序可能會在嘗試修改或訪問文件系統(tǒng)時發(fā)生沖突没隘,從而導(dǎo)致數(shù)據(jù)損壞或特權(quán)升級。文件系統(tǒng)中存在不同形式的數(shù)據(jù)競爭禁荸,其中不相關(guān)的程序可能會突然使用可用資源(如磁盤空間右蒲,內(nèi)存空間或處理器周期)而相互影響。未仔細(xì)設(shè)計以預(yù)測和處理這種種族情況的軟件可能變得不可預(yù)測赶熟。這樣的風(fēng)險可能會在似乎非彻逋可靠的系統(tǒng)中長時間被忽視。
未完待續(xù)...