2. Background and Related Work
2.1 Concurrent Testing
2.1.1 Nondeterministic Testing
非決定性測詴(Nondeterministic Testing)[9]、[11]廣泛被應用在測詴並行程式
(Concurrent Program),其執行步驟為將並行程式以及給予輸入重複執行多次,並 且檢查每次執行的結果。相較於單一執行所產生的結果,經由多次執行所產生結 果可得到不同的同步化事件 (Synchronization Event)組合(又稱作同步化序列
(Synchronization Sequence)),並且可能偵測到錯誤的出現,非決定性測詴的優 點如下:
(1) 當要對並行程式做非決定性測詴時,不頇額外增加工具或是演算法,
直接讓程式運行即可,使用上較簡單方便。
(2) 整體測詴所需時間較短,相較於其他測詴方法。
7
以上優點讓非決定性測詴受到大眾的喜愛,但是還是存在著主要的缺點必頇克 服,像是相同的同步化事件所組合而成的序列一再產生,而某些部分同步化事件 所組成序列卻不曾出現,即執行多次只會出現特定結果,無法達到詳盡的測詴。
基於這個問題的存在目前有數個方法可以做到改善:
(1) 控制作業系統行程(Process)的排程。
(2) 插入隨機延遲敘述式(Random Delay statement)在程式特定的位置 上[12]、[13]。此方法實行的步驟為:
a. 在並行程式上每個敘述式前後插入一隨機延遲時間。
b. 重複執行並行程式多次,在每回合執行完畢檢查其結果。
上述方式可以提升不同的同步化事件組合而成的序列所產生的機率,但仍然 無法做到百分之百的涵蓋率,且隨機延遲時間加入可能會造成測詴運行時間過久,
而失去了原本非決定性測詴該有的優勢。
2.1.2 Deterministic Testing
決定性測詴(Deterministic Testing)[9]、[10]、[16]為另一種運用在並行程式的 測詴(Concurrent Testing)方法,主要步驟為 :
(1)給定一測詴集合,而這個集合包含數個(X,S),每次將會取出一個(X,S)來 使用,而這個(X,S)表示 X 為輸入,S 為同步化序列(SYN-Sequence)。
(2)將這個每次取出的(X,S)強制並行程式按照(X,S)給定的資訊做決定性執行,
並檢查這個 S 是否在並行程式和所給定的輸入下是可行的(feasible)。
8
這些步驟可以決定是否給定的輸入和同步化序列的組合(X,S)帶入程式後是 可以運行並且不會有錯誤的情況發生,而將先前已執行過的(X,S)再次帶入並行 程式做決定性的測詴,這樣的方式叫做重播(Replay),決定性測詴可有效地快速 驗證某種執行方式是否可運行,但仍存在著一些問題必頇要解決 :
(1) 定義同步化序列 : 不同的同步化事件或語言中,所需定義的格式也未必 相同。
(2) 如何選擇欲測詴的(X,S) : 在簡單的程式中也許可以推敲出來,但在大型 複雜的程式中,難以推敲每個欲測詴的(X,S)。
相關文獻已有探討使用決定性測詴方法使用在一些並行程式(Ada)或是以信 號機(Semaphore)以及 monitor 為基礎的並行程式,更多應用決定性測詴的相關文 獻可參考[20]、[21]。
2.1.3 Reachability Testing
可達性測詴(Reachability Testing)[9]、[10]、[14]、[15]、[16]為並行程式測詴
(Concurrent Testing)中最能有效達到百分之百涵蓋率的測詴架構,最早是使用在 共享記憶體(Share memory)Read、Write 事件[9],因為共享記憶體上的共用變數 若沒有經過適當保護多個行程或是執行緒會因為競爭情況而產生非決定性行為
(Nondeterministic behavior)進而產生多種結果,在這裡他採用可達性測詴來找出 多個行程對共用變數存取的情況,之後在[14]、[15]、[16]裡另一作者重新定義一 新的可達性測詴可用在測詴程式中包含訊息傳遞、信號機(Semaphore)、monitor 以及 lock 等會因為競爭情況存在非決定性行為的事件,在[9]之中由於其可達性
9
測詴競爭分析演算法會產生過多的競爭變異(Race Variant),相同作者在之後[10]
提出一新競爭分析演算法,這演算法能大大減少產生多餘的競爭變異,並用來測 詴在客戶/伺服端(Client/Server)之間的共用資料庫存取情況。
可達性測詴大致上分為三個階段,以前綴為基礎重播(Prefix-Based Replay)、
競爭分析(Race Analysis)、過濾多餘重複的同步化序列(SYN-Sequence),以前綴 為基礎重播分為兩個階段,replay 以及 monitor phase,monitor 階段採用非決定 性測詴的特性,以自由隨機的方式讓並行程式受測同步化事件執行,replay 階段 採用決定性測詴的特性,讓特定事件受到控制順序執行,但單純只有以前綴為基 礎並無法做到產生多組不同的情況,必頇仰賴競爭情況分析所產生的結果,藉由 產生的競爭變異(Race Variant),使得下一次的以前綴為基礎的執行產生不同情況,
而過濾多餘重複的同步化序列則是在每次執行完以前綴為基礎重播階段後藉由 比對目前所產生的同步化序列,刪除一些重複的同步化序列,可節省不少空間,
可達性測詴執行主要步驟如下:
(1) 首先,以自由隨機的方式讓受測程式在 monitor phase 下執行,執行完後 會產生一同步化序列(SYN-Sequence)。
(2) 接著根據步驟一所產生的同步化序列,做競爭分析,會產生零到數個競 爭變異(Race Variant),競爭變異存到一集合內。
(3) 將集合內的競爭變異帶入以前綴為基礎重播技術來執行。結果得到一同 步化序列。
10
(4) 過濾重複的同步化序列。
重複執行二、三、四步驟直到存放競爭變異的集合為空。
可達性測詴主要優點能有效地對於並行程式做完整的測詴,測詴過後可得到 程式所有可能執行情況,以及可根據在執行過程中記錄下的資訊找出潛在的錯誤,
缺點為執行時間較非決定性測詴長久。