一種用于數據競爭檢測的程序調度方法
【技術領域】
[0001] 本發(fā)明屬于軟件測試技術領域和軟件可靠性領域,特別設及多線程程序中數據競 爭檢測和程度調度方法。
【背景技術】
[0002] 隨著多核CPU的廣泛使用,越來越多的軟件使用了多線程技術來并發(fā)地處理一定 的任務。但是,多線程程序在運行過程中需要各個線程很好地同步來完成某個任務。當該 些線程之間的同步出現錯誤時,就會導致并發(fā)缺陷的發(fā)生,數據競爭值ataRace)就是最基 本的一種并發(fā)缺陷。
[0003] 數據競爭的定義為;兩個或兩個W上線程對同一變量同時操作(讀或寫),且至少 包含一個寫操作。主流的數據競爭的準確檢測是基于Happens-before關系(簡稱皿R,使 用符號表示的。皿R的定義如下;(1)同一個線程若先執(zhí)行一條語句ei再執(zhí)行一條語句 62,則ej-62; 0)若線程tx釋放一個鎖m(記作e,),之后鎖m被線程ty獲?。ㄓ涀鱡y), 則一 0)傳遞性,若ey丑Cywe"則(j、一ez。皿R被用來判斷對同一變量的 兩次訪問(含有一個寫操作)是否有先后順序,如果沒有先后順序,則該兩次訪問構成一個 數據競爭。
[0004] 然而,皿R能夠隱藏很多的數據競爭。如圖la所示,兩個線程t濟ty對變量X的 兩次寫操作構成了一個數據競爭,但是皿R由于鎖m的存在而隱藏該個數據競爭,因為兩個 線程對X的操作是有先后順序的(如箭頭所示)。因此,單純使用皿R來檢測數據競爭,會 漏掉很多的數據競爭。另外,即使大量重復運行一個程序多次,皿R也無法高效地檢測到那 些被它之前隱藏的數據競爭。因此,基于皿R的數據競爭工具在檢測那些被其隱藏的數據 競爭方面是低效的。
【發(fā)明內容】
[0005] 本發(fā)明技術解決問題;克服現有技術的不足,提供一種用于數據競爭檢測的程序 調度方法,使得很難檢測的數據競爭被檢測到,提高了數據競爭的檢測效率。
[0006] 本發(fā)明技術解決方案:一種用于數據競爭檢測的程序調度方法,通過分析程序中 每個程序塊所包含的鎖類型的集合,在程序運行過程中主動調度每個線程的運行,使得很 難檢測的數據競爭被檢測到,提高了基于Happens-before的數據競爭的檢測效率,包括W 下步驟:
[0007] (1)劃分給定程序為若干個程序塊;
[000引 (2)運行一次給定程序,并計算每個程序塊中鎖的類型的集合;
[0009] (3)選擇數據競爭檢測工具,再次運行給定程序,并根據每個線程和鎖、程序塊中 鎖類型集合的關系調度每個線程的運行;
[0010] (4)在步驟(3)的運行中同時使用選定的工具檢測數據競爭;
[0011] (5)在步驟(3)的運行中同時重新計算每個程序塊的鎖的類型集合,用于下一次 運行的調度;
[0012] (6)重復步驟(3)至(5)若干次,并收集每次檢測到的數據競爭。
[0013] 所述步驟(2)和巧)中程序塊的鎖類型集合生成為動態(tài)生成或靜態(tài)生成;若使用 靜態(tài)生成,則權利要求1中步驟(5)可W省略。
[0014] 所述步驟(1)中劃分給定程序為若干個程序塊采用單位程序塊劃分方法。
[0015] 所述單位程序塊劃分方法包括函數、程序基本塊劃分。
[0016] 所述步驟(1)中每個程序塊為連續(xù)的若干行程序語句。
[0017] 所述步驟(2)和巧)中鎖類型的算法為化va程序的中的類型或用于區(qū)分不同鎖 的內存對象摘要算法。
[0018] 所述步驟(3)中的數據競爭檢測工具為Happens-before。
[0019] 本發(fā)明與現有技術相比的優(yōu)點在于:本發(fā)明在程序的運行中,動態(tài)地對程序的不 同塊進行分析,找出每個塊中所含有的鎖的類型集合,并在程序的之后運行中,分析每個線 程將要獲取的鎖和其它線程正在執(zhí)行的程序塊之間的關系,并依據此關系主動調度各個線 程的運行,使得被皿R隱藏的數據競爭得W暴露,進而被基于皿R的工具檢測到,從而提高 了基于皿R工具在數據競爭檢測的效率。
【附圖說明】
[0020] 圖la和圖化分別為數據競爭的隱藏情況和其被本發(fā)明方法檢測到的情況;
[0021] 圖2為本發(fā)明的實現流程圖;
[002引圖3為本發(fā)明步驟(2)b)中程序塊bi和bj.關系示意圖;
[0023] 圖4為數據競爭檢測數量對比;
[0024] 圖5為本發(fā)明實施例對應的程序;
[0025] 圖6為本發(fā)明實施例運行中線程tl和t2的交替運行過程。
【具體實施方式】
[0026] 針對圖1中a被皿R隱藏的數據競爭,本發(fā)明會調度該程序的運行,使之產生1中 b所示的運行,從而暴露在X上面的數據競爭,進而被基于皿R的數據競爭檢測工具檢測到。
[0027] 如圖2所示,本發(fā)明步驟包括;劃分給定程序P為若干個程序塊{bi,b2,…b。};通 過運行程序P-次,動態(tài)確定每個程序塊bi中鎖的類型的集合{L化1),L化2),…Ub。)};選 取某個基于Happens-before的數據競爭檢測工具,再次運行程序P并根據每個線程和鎖、 程序塊中鎖的類型集合的關系調度每個線程的運行,并使用已選定的數據競爭檢測工具檢 測數據競爭;在程序的調度過程中重新計算每個程序塊對應的鎖類型集合;重復上述步驟 若干次。
[002引本發(fā)明具體實現步驟如下:
[0029] (1)劃分給定程序P為若干個程序塊{biA,…b。},每個程序塊為連續(xù)的若干行程 序語句;
[0030] (2)選定一個參數k(默認值為12),運行程序P,并計算每個程序塊bi的鎖類型集 合L化1),其中L化1)是W下兩個集合的并集:
[0031] a)所有線程在b沖運行時獲取的鎖的類型集合;
[0032]b)所有線程在程序塊bj.中運行時獲取的鎖的類型集合,其中bj.限定為從bi可通 過k個程序塊的調用可到達的程序塊,如圖3所示。
[0033] (3)選取某個基于化卵ens-be化re的數據競爭檢測工具,運行程序P,并按照如下 規(guī)則調度程序P中每個線程的運行并使用已選定的數據競爭檢測工具檢測數據競爭:
[0034]a)當一個線程t將要獲取一個鎖m時,判斷是否存在另一個線程t',且線程t'當 前所在的程序塊Iv對應的鎖類型集合UbtO包含鎖m的類型。
[003引 b)若存在a)中的線程t',則暫停線程t的執(zhí)行,直到線程t'獲取并釋放某個鎖 m',且鎖m'和鎖m具有相同的類型。
[0036]C)若程序P中全部的線程都被暫停,則隨機選取一個線程并繼續(xù)執(zhí)行該線程。
[0037] (4)在步驟3對應的程序運行中,按照步驟2的方法重新計算每個程序塊對應的鎖 類型集合,用作下次運行時的鎖類型集合;
[003引 (5)重復步驟(3)和(4)若干次,并報告所有檢測到的數據競爭。
[0039] 圖5列出了該實施例對應的程序P。該發(fā)明在程序P上的調度舉例如下。
[0040] (1)程序P的劃分。可按照程序中函數為單位,如表2中(a)所示;也可W按照程 序基本塊等劃分,如表2中(b)所不:。
[0041] 表2程序的兩種劃分
[0042]
[0044] (2)W上述劃分1為例,計算每個基本塊中鎖的集合(LS(bi)),選取參數k為12。 通過運行程序,動態(tài)計算每個程序塊對應的鎖集合,如表3所示。
[0045] 表 3
[0046]
[0047] 也可W按照程序代碼靜態(tài)計算每個塊對應的鎖集合,針對劃分2的靜態(tài)計算結果 如表4所示。
[0048]表 4
[0049]
[0051] (3)在表2(a)所示劃分W及其對應于的表3中鎖集合為基礎,使用該專利中的方 法調度程序的運行,并使用基于皿R的數據競爭檢測算法來檢測數據競爭,如下:
[0052] 由于main線程在啟動線程tl和t2后處于等待狀態(tài)(在line9),該線程不會被 調度。
[005引對于線程tl和t2,假設在tl調用函數n0時,線程t2剛剛進入函數f30。[0化4]此時n0所在的程序塊為b2(見表2 (a)),而b2對應的鎖集合為化ouble}(見表 3),該發(fā)明中的調度會檢查是否有其它線程當前所在的塊中包含Double鎖。
[0055] 由于線程t2所