国产精品1024永久观看,大尺度欧美暖暖视频在线观看,亚洲宅男精品一区在线观看,欧美日韩一区二区三区视频,2021中文字幕在线观看

  • <option id="fbvk0"></option>
    1. <rt id="fbvk0"><tr id="fbvk0"></tr></rt>
      <center id="fbvk0"><optgroup id="fbvk0"></optgroup></center>
      <center id="fbvk0"></center>

      <li id="fbvk0"><abbr id="fbvk0"><dl id="fbvk0"></dl></abbr></li>

      一種用于數據競爭檢測的程序調度方法

      文檔序號:9261307閱讀:227來源:國知局
      一種用于數據競爭檢測的程序調度方法
      【技術領域】
      [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所
      當前第1頁1 2 
      網友詢問留言 已有0條留言
      • 還沒有人留言評論。精彩留言會獲得點贊!
      1