並行程式除錯 測試與模型檢測

2022-08-31 05:30:19 字數 1366 閱讀 8128

並行程式除錯、測試與模型檢測

並行程式除錯的挑戰:

1、由於不能確定不同執行緒的執行順序,導致可能的執行路徑發生組合**;

2、使用模型檢驗程式正確性能以應用到分布式系統上。

名詞解釋

確定性重放:通過記錄系統中不確定性事件的發生順序,在重放階段按照記錄的順序執行相關事件,使得重放階段與記錄階段的執行具有相同的程式狀態,從而緩解並行程式執行的不確定性對除錯帶來的影響。

確定性並行:在並行程式執行時,必須遵守一定的規則來執行不確定事件,從而直接將並行程式的執行本身變成確定性的。

併發錯誤:通常**於多執行緒中未能正確處理同步問題。其特點是存在於多執行緒環境中並且具有不確定性。本質上,併發錯誤可分為:原子性違例、順序違例和死鎖。原子性違例發生於乙個執行緒的**區域與另乙個執行緒出現非可序列化交叉的情況。順序違例是指當乙個執行緒的操作a本應發生在另乙個執行緒的操作b之後,卻發生在了b之前的情況。死鎖是指多個執行緒迴圈等待共享資源,彼此不釋放以獲得資源的一種情況。

相關技術

確定性並行

不確定的執行緒交叉執行和執行緒間的訪存衝突為多核程式執行帶來了不確定性。這種不確定性為多核程式除錯帶來了困難。特別是對bug的重現,往往因為多核程式執行的隨機性,使得恢復同一bug的執行變得十分困難。通過將並行序列化,能夠使得多核程式的執行路徑變得可**和確定。其中的方法包括輪流執行法、無衝突訪存法、確定性程式設計模型。輪流執行通過將序列和並行**進行分離,對訪存衝突的**段採用序列執行方式,方法是根據執行緒對記憶體塊的請求情況,重新分配執行緒訪問記憶體塊的的許可權。無衝突訪問通過將執行緒的共享記憶體進行分離,為每個執行緒建立共享變數的本地副本使得執行緒的執行不會導致訪存衝突,從而避免了多核程式執行的不確定性。確定性程式設計模型通過改變並行程式設計模型來對多核程式的執行實現控制,包括diverge&merge模型,訊息通訊模型,函式式程式設計模型等等。

軟體測試

軟體測試需要滿足完備性和可靠性。測試方法包括對**的靜態測試和動態測試。前者包括基於程式驗證的方法發現執行邏輯和語法定義等方面的錯誤,其中的研究課題包括模式匹配、定理證明、模型測試、經典的符號執行和基於學習的測試等;後者是通過實際執行程式檢查執行結果與預期結果的差距來確定被測程式是否存在錯誤,相關的測試方法有可以從排程粒度和排程策略兩個角度進行分類。排程策略包括壓力測試,多次重複測試;啟發式引導,實時監控和引導程式執行;隨機排程,改變系統(包括作業系統)的排程方式,加大系統排程方式的隨機性,包括隨機休眠、預設搶占、限定搶占等排程策略;系統排程,結合模型檢驗技術窮舉測試程式可能的狀態看哦可能關鍵,從而斷言被測程式是否存在漏洞。

問題:多執行緒之間的同步可以通過鎖和條件變數之間的協作獲得較好的效能,在多程序之間的同步又是有怎樣的工作機制?

參考:ccf 2023年2月刊 

記憶體一致性模型:

擴充套件 JUnit 測試並行程式

測試並行程式與以往有什麼不同 隨著多核的普及,並行程式的開發已經提上日程。相對序列程式而言,並行程式更有可能出錯。一方面,並行程式的執行序列具有很強的隨機性,執行緒交錯執行的序列可能每次都不一樣,而只要乙個序列有問題,整個程式就是不正確的。另一方面,並行程式對大多數程式設計師來說,都是乙個新的領域,...

併發程式與並行程式

併發程式是指可以被同時發起執行的程式 並行程式被設計成可以在並行的硬體上執行的併發程式。併發程式代表了所有可以實現並發行為的程式,它是乙個寬泛的概念,其中包含了並行程式。inter process communication 程序間通訊 go支援的ipc方法有管道 訊號和socket.程序 我們把乙...

Java並行程式基礎

程序是計算機中的程式關於某資料集合上的一次運動活動,是系統進行資源分配的基礎單位。程序是執行緒的容器。程式是指令 資料及其組織形式的描述,程序是程式的實體。執行緒的所有狀態都在thread的state列舉中 public enum state t1.start 也可以使用runnable介面來實現相...