1. 簡介
1.2 A PPROACHES TO T ESTING C ONCURRENT S OFTWARE
1.2.3 Reachability Testing
1.2.3 Reachability Testing
將執行過程中所有synchronization events 的執行順序記錄下來是進行並行程 式測試的第一步。前面提到synchronization events 之間彼此會競爭特定的執行順 序,並進而影響程式執行的結果;因此如果想要在反覆的執行過程中得到相同的 執行結果,顯然必須記錄前次執行的synchronization events 順序並依此控制之後 的執行。在並行架構中,如果想要達到控制程式執行、重現前次執行結果的目的,
僅需要記錄synchronization events 間 partially order 的關係,而一次完整執行中所 產 生 的 記 錄 被 稱 作 為 SYN-sequence。Deterministic testing 的概念即是:將 SYN-sequence 作為程式輸入的一部分,利用特定的協定將並行程式中所有的 synchronization events 作 包 裝 , 使 synchronization events 能 按 照 輸 入 的 SYN-sequence 完成執行。這種概念雖然適當地處理了並行程式非決定性行為的
問題,但仍存在另一個盲點:在每次重複的測試過程中,執行的 SYN-sequence 都與先前相同,而synchronization events 可能的排列情形卻往往總數龐大,因此 倚賴deterministic testing 並無法完整的進行測試。相對於 deterministic testing 指 定程式執行時的 SYN-sequence,nondeterministic testing 著眼於讓程式在不受干 預的情形下被反覆地執行,因此每次執行的SYN-sequence 都可能不同。在傳統 測試循序程式時,以反覆執行為主體的測試是相當常見的;但在測試並行程式時,
由 於 不 確 定 性 行 為 使 得 反 覆 執 行 的 過 程 中 , 往 往 執 行 的 僅 是 所 有 可 能 SYN-sequence 的一小部分;根據實驗數據[1]顯示:對於一個擁有 420 個相異 SYN-sequences 的並行程式,經過 300 次的重複執行,期間被執行的相異 SYN-sequences 個數僅僅只有 7 個;即使重複執行的次數提高到 1000 次,卻也
只有 10 個相異的 SYN-sequences 被執行。從以上的介紹發現,無論採用 deterministic testing 或 nondeterministic testing,對於測試並行程式都有其不足之 處。Reachability testing 是一種用來測試並行程式非決定性行為的方法,架構上 揉 合 了 nondeterministic testing 與 deterministic testing 兩 者 的 概 念 ; 透 過 reachability testing,系統開發人員可以確認並行程式執行的正確與否。
Execution P with input X
Race analyzer (To derive race-variants)
Prefix-based replay of R
…………
A SYN-sequence S
Queue to store race variants
Derived race variants
Remove a race variant R from queue
Obtain a SYN-sequence
圖.3 Reachability testing 架構圖
Reachability testing 整個測試過程如圖 3 可粗分成兩個階段:monitor phase 與 replay phase。在 monitor phase 中,受測程式的執行如同 nondeterministic testing 一般,是完全不受控制的,系統的排程可自由地組合任何可能SYN-sequence 並 完成執行。對於reachability testing 整體架構而言,monitor phase 所需要作的僅是 將受測程式執行的SYN-sequence 記錄下來,供作後續的分析與執行需要。顧名 思義,replay phase 的目的即在重現前次的執行,它應用 deterministic testing 的概 念,受測程式在執行時需要指定synchronization events 的 partially order 關係,藉 由reachability testing 提供的協定,將所有 synchronization events 按指定的次序執 行 。 很 明 顯 地 , 單 純 地 實 作 monitor phase 與 replay phase 並 不 能 解 決 nondeterministic testing 與 deterministic testing 的不足,reachability testing 因此導 入了race analyzer 的機制,將 monitor phase 與 replay phase 作完美的結合。Race analyzer 的主要工作在於從 monitor phase 記錄的 SYN-sequence 中,分析出其他
不同於此SYN-sequence 但又可能出現的 partially order 關係,稱作 race variant。
換言之,race analyzer 可藉由更動 SYN-sequence 中部分 synchronization events 的 partially order 關係用以產生 race variants;由於在被更動點之後的 synchronization events 已無法保證其執行的必然性(例如:經由不同的執行順序,執行過程中可 能會產生不同的變數值,而這些變數值可能會作為程式中conditional branch 的依 據,並決定部分程式碼的執行與否);相對於SYN-sequence,race variants 將不再 代表某次完整的執行順序,而是某個執行順序中最前面的一部分;當要進行受測 程式的整個執行時,必須將replay phase 作一適當的調整。前面提到的 replay phase 僅是應用deterministic testing 的概念,但由於指定的 partially order 關係──race variant 是一個不完整的執行過程,reachability testing 因此提出 prefix-based replay
的概念,透過在race variant 中加入一個特殊標記的方式,使 replay phase 時得知 race analyzer 更動的 partially order 的位置,當 replay 的過程中遇到前述的特殊標 記,reachability testing 立刻切換到 monitor 模式,改由系統排程自由地產生可能
的執行順序,執行受測程式中之後的部分,並將此記錄下來形成另一個不同的 SYN-sequence 再交由 race analyzer 分析、產生其它新的 race variants。由此可見,
reachability testing 利 用 這 樣 反 覆 的 動 作 , 一 開 始 將 第 一 次 執 行 得 到 的 SYN-sequence 從頭開始對每一個 partially order 關係作更動,產生一些 race variants,並標示更動的位置;在後續的 race analyzer 進行過程中,特殊標記前的 partially order 將不再被更動,因此隨著 reachability testing 中每一輪的執行,標記
的位置會逐步地向受測程式結尾處靠近。當特殊標記到達程式結尾,race analyzer 將不再產生任何新的race variants,整個 reachability testing 過程也在執行完所有 的race variants 後結束。最後,為了達到完整測試的目的,race analyzer 所採用 的演算法必須能保證所有受測程式可能產生的race variants 都會在測試過程中產 生,另外由於效率上的考量,演算法同時也要儘量避免產生重複的race variants。