本發(fā)明實施例涉及計算機(jī)技術(shù)領(lǐng)域,尤其涉及一種并行程序的MHP分析方法和裝置。
背景技術(shù):
隨著計算機(jī)技術(shù)的發(fā)展,計算機(jī)由單核發(fā)展到多核時代,由單機(jī)處理發(fā)展到到大規(guī)模集群處理。計算機(jī)的發(fā)展同樣促進(jìn)了計算機(jī)軟件的發(fā)展,時至今日,已經(jīng)有多達(dá)上百種的計算機(jī)編程語言被創(chuàng)造出來,比如普及的C/C++、Java、Python等。各種大型軟件程序,例如操作系統(tǒng)、數(shù)據(jù)庫、大型軟件游戲等,動輒就是上百萬行的代碼,這些大型軟件程序可能需要一個團(tuán)隊經(jīng)歷多年才能開發(fā)出來。那么,如何更有效地對軟件程序進(jìn)行調(diào)試,以及進(jìn)行程序的正確性驗證及優(yōu)化等問題,便成為計算機(jī)軟件開發(fā)中的研究熱點。
隨著并行編程的發(fā)展,對并行程序的分析又是軟件程序分析的熱點問題。并行程序分析相對于串行程序分析要復(fù)雜許多。串行程序的分析主要是基于控制流、指針分析以及定值引用等基礎(chǔ)分析之上的程序控制流和數(shù)據(jù)流分析,關(guān)鍵在于串行程序的本質(zhì)為任何一個時刻有且僅有一條語句可以執(zhí)行。而對于并行程序而言,任何一個時刻可以存在多條不同線程或進(jìn)程的語句同時執(zhí)行,于是如何判斷程序語句之間是否可能并發(fā)執(zhí)行就成為并行程序分析的一個研究方向。
并行程序分析復(fù)雜的根本原因在于同時存在多個不同線程或進(jìn)程語句的并行執(zhí)行,這使得不同線程或進(jìn)程的語句在執(zhí)行序上存在不確定的關(guān)系,而這樣的不確定性關(guān)系則可能導(dǎo)致程序的嚴(yán)重錯誤。于是并行程序分析中的一個基本問題就是可能并發(fā)(May Happen in Parallel,MHP)分析,這個分析的結(jié)果就是一條語句的所有的可能并行語句的集合,或者判斷任意2條語句是否可能存在并行執(zhí)行關(guān)系。這個問題的補(bǔ)集給出了一定存在執(zhí)行上先后關(guān)系的語句集合。有了MHP分析后,就可以結(jié)合串行分析的方法,做指針分析、數(shù)據(jù)流分析等。
在對程序進(jìn)行MHP分析之前,需要先構(gòu)建與程序?qū)?yīng)的控制流圖(Control Flow Graph,CFG),再基于CGF進(jìn)行MHP分析。而對于并行程序而言,如何構(gòu)建正確的多線程CFG圖是保證MHP分析正確性的關(guān)鍵。但目前構(gòu)建多線程GFG的方法過于簡單,一般僅考察創(chuàng)建(creat)原語和鎖定(lock)/解鎖(unlock)原語的分析,而忽視在先發(fā)生(Happens-Before)分析的重要性,從而使得根據(jù)CFG進(jìn)行MHP分析時導(dǎo)致分析結(jié)果有很大的誤報或漏報。
技術(shù)實現(xiàn)要素:
本發(fā)明實施例提供一種并行程序的MHP分析方法和裝置,用于提高對并行程序進(jìn)行MHP分析的準(zhǔn)確度。
第一方面提供一種并行程序的MHP分析方法,包括:
從待分析并行程序的主線程開始,每次選擇一個線程,模擬所述待分析并行程序的執(zhí)行,其中,當(dāng)正在模擬執(zhí)行的線程無法繼續(xù)執(zhí)行時,跳轉(zhuǎn)至任一可繼續(xù)執(zhí)行的線程模擬執(zhí)行,直至所述待分析并行程序的所有線程模擬執(zhí)行完畢,其中,所述待分析并行程序包括至少兩個線程;
根據(jù)對所述待分析并行程序進(jìn)行模擬執(zhí)行的結(jié)果,構(gòu)建與所述待分析并行程序?qū)?yīng)的多線程控制流圖;
對所述多線程控制流圖進(jìn)行處理,得到保守正確的多線程控制流圖,所述保守正確的多線程控制流圖中的各節(jié)點的可能并發(fā)MHP結(jié)果不存在漏報;
對所述保守正確的多線程控制流圖進(jìn)行MHP分析,得到所述待分析并行程序的MHP分析結(jié)果。
本發(fā)明實施例提供的MHP分析方法,通過構(gòu)建與待分析并行程序?qū)?yīng)的多線程控制流圖,然后對該多線程控制流圖進(jìn)行處理,得到保守正確的多線程控制流圖,對該保守正確的多線程控制流圖進(jìn)行MHP分析,從而得到待分析并行程序的MHP分析結(jié)果,由于多線程CFG是保守正確的,因此對該多線程CFG的構(gòu)建精確度較高,根據(jù)該多線程CFG進(jìn)行MHP分析獲取的結(jié)果誤報較少也不存在漏報,提高了對并行程序進(jìn)行MHP分析的準(zhǔn)確率。
在第一方面一種可能的實現(xiàn)方式中,所述對所述多線程控制流圖進(jìn)行處理,得到保守正確的多線程控制流圖,包括:
若所述多線程控制流圖中的加入原語節(jié)點與多個線程匹配,則刪除所有與所述加入原語節(jié)點連接的邊;
若所述多線程控制流圖中的等待原語節(jié)點與多個觸發(fā)原語節(jié)點匹配,則刪除所有與所述等待原語節(jié)點連接的邊;
將得到的多線程控制流圖作為保守正確的多線程控制流圖。
由于在進(jìn)行MHP分析時,判斷加入原語究竟和哪個線程是正確匹配的過于復(fù)雜,因此在這里可以刪除所有與加入原語連接的邊,這樣會使在進(jìn)行MHP分析時,認(rèn)為加入原語后面的語句都可能與加入原語并發(fā),這是一種誤報,但不是漏報。同理,等待原語與觸發(fā)原語相匹配,因此若多線程控CFG中的等待原語節(jié)點與多個觸發(fā)原語節(jié)點匹配,則刪除與等待原語節(jié)點連接的邊。經(jīng)過上述處理,即可保證得到的多線程CFG是保守正確的。
在第一方面一種可能的實現(xiàn)方式中,所述對所述保守正確的多線程控制流圖進(jìn)行MHP分析,得到所述待分析并行程序的MHP分析結(jié)果,包括:
計算所述保守正確的多線程控制流圖中各節(jié)點的非并發(fā)集合和產(chǎn)生集合,其中,節(jié)點A的非并發(fā)集合表示無法與節(jié)點A并發(fā)的節(jié)點的集合,節(jié)點A的產(chǎn)生集合表示節(jié)點A所產(chǎn)生的節(jié)點的集合;
根據(jù)各節(jié)點的非并發(fā)集合和產(chǎn)生集合迭代計算所述保守正確的多線程控制流圖中各節(jié)點的MHP分析結(jié)果,直至所述MHP分析結(jié)果收斂,得到所述待分析并行程序的MHP分析結(jié)果。
在第一方面一種可能的實現(xiàn)方式中,所述從所述主線程開始,每次選擇一個線程,模擬所述待分析并行程序的執(zhí)行,其中,當(dāng)正在模擬執(zhí)行的線程無法繼續(xù)執(zhí)行時,跳轉(zhuǎn)至任一可繼續(xù)執(zhí)行的線程模擬執(zhí)行,直至所述待分析并行程序的所有線程模擬執(zhí)行完畢,包括:
步驟一,從所述主線程開始,每次選擇一個線程,模擬選擇的線程的執(zhí)行,當(dāng)所述選擇的線程無法繼續(xù)執(zhí)行時,鎖定所述選擇的線程并記錄所述選擇的線程當(dāng)前的位置信息;
步驟二,跳轉(zhuǎn)至任一未被鎖定且可繼續(xù)執(zhí)行的第一線程,模擬所述第一線程的執(zhí)行,當(dāng)所述第一線程無法繼續(xù)執(zhí)行時,鎖定所述第一線程并記錄所述第一線程當(dāng)前的位置信息,直至所有未被鎖定且可繼續(xù)執(zhí)行的線程均被模擬執(zhí)行;
步驟三,解除所有被鎖定的線程,并重復(fù)執(zhí)行步驟二,直至所述待分析并行程序的所有線程模擬執(zhí)行完畢。
根據(jù)本發(fā)明實施例提供的方法模擬執(zhí)行得到的結(jié)果檢測的多線程CFG,能夠真實體現(xiàn)待分析并行程序中各線程之間的關(guān)系,從而得到準(zhǔn)確可靠的多線程CFG。
在第一方面一種可能的實現(xiàn)方式中,所述模擬選擇的線程的執(zhí)行,包括:
采用深度優(yōu)先搜索分析法模擬選擇的線程的執(zhí)行;
所述模擬所述第一線程的執(zhí)行,包括:
采用深度優(yōu)先搜索分析法模擬所述第一線程的執(zhí)行。
在第一方面一種可能的實現(xiàn)方式中,所述記錄所述選擇的線程當(dāng)前的位置信息,包括:
在調(diào)度信息表中記錄所述選擇的線程的標(biāo)識和當(dāng)前的語句的標(biāo)識;
所述記錄所述第一線程當(dāng)前的位置信息,包括:
在所述調(diào)度信息表中記錄所述第一線程的標(biāo)識和當(dāng)前的語句的標(biāo)識。
第二方面提供一種并行程序的MHP分析裝置,包括:
模擬執(zhí)行模塊,用于從待分析并行程序的主線程開始,每次選擇一個線程,模擬所述待分析并行程序的執(zhí)行,其中,當(dāng)正在模擬執(zhí)行的線程無法繼續(xù)執(zhí)行時,跳轉(zhuǎn)至任一可繼續(xù)執(zhí)行的線程模擬執(zhí)行,直至所述待分析并行程序的所有線程模擬執(zhí)行完畢,其中,所述待分析并行程序包括至少兩個線程;
控制流圖構(gòu)建模塊,用于根據(jù)對所述待分析并行程序進(jìn)行模擬執(zhí)行的結(jié)果,構(gòu)建與所述待分析并行程序?qū)?yīng)的多線程控制流圖;
控制流圖處理模塊,用于對所述多線程控制流圖進(jìn)行處理,得到保守正確的多線程控制流圖,所述保守正確的多線程控制流圖中的各節(jié)點的可能并發(fā)MHP結(jié)果不存在漏報;
MHP分析模塊,用于對所述保守正確的多線程控制流圖進(jìn)行MHP分析,得到所述待分析并行程序的MHP分析結(jié)果。
在第二方面一種可能的實現(xiàn)方式中,所述控制流圖處理模塊,具體用于若所述多線程控制流圖中的加入原語節(jié)點與多個線程匹配,則刪除所有與所述加入原語節(jié)點連接的邊;若所述多線程控制流圖中的等待原語節(jié)點與多個觸發(fā)原語節(jié)點匹配,則刪除所有與所述等待原語節(jié)點連接的邊;將得到的多線程控制流圖作為保守正確的多線程控制流圖。
在第二方面一種可能的實現(xiàn)方式中,所述MHP分析模塊,具體用于計算所述保守正確的多線程控制流圖中各節(jié)點的非并發(fā)集合和產(chǎn)生集合,其中,節(jié)點A的非并發(fā)集合表示無法與節(jié)點A并發(fā)的節(jié)點的集合,節(jié)點A的產(chǎn)生集合表示節(jié)點A所產(chǎn)生的節(jié)點的集合;根據(jù)各節(jié)點的非并發(fā)集合和產(chǎn)生集合迭代計算所述保守正確的多線程控制流圖中各節(jié)點的MHP分析結(jié)果,直至所述MHP分析結(jié)果收斂,得到所述待分析并行程序的MHP分析結(jié)果。
在第二方面一種可能的實現(xiàn)方式中,所述模擬執(zhí)行模塊,具體用于執(zhí)行如下步驟:步驟一,從所述主線程開始,每次選擇一個線程,模擬選擇的線程的執(zhí)行,當(dāng)所述選擇的線程無法繼續(xù)執(zhí)行時,鎖定所述選擇的線程并記錄所述選擇的線程當(dāng)前的位置信息;步驟二,跳轉(zhuǎn)至任一未被鎖定且可繼續(xù)執(zhí)行的第一線程,模擬所述第一線程的執(zhí)行,當(dāng)所述第一線程無法繼續(xù)執(zhí)行時,鎖定所述第一線程并記錄所述第一線程當(dāng)前的位置信息,直至所有未被鎖定且可繼續(xù)執(zhí)行的線程均被模擬執(zhí)行;步驟三,解除所有被鎖定的線程,并重復(fù)執(zhí)行步驟二,直至所述待分析并行程序的所有線程模擬執(zhí)行完畢。
在第二方面一種可能的實現(xiàn)方式中,所述模擬執(zhí)行模塊,具體用于采用深度優(yōu)先搜索分析法模擬選擇的線程的執(zhí)行;采用深度優(yōu)先搜索分析法模擬所述第一線程的執(zhí)行。
在第二方面一種可能的實現(xiàn)方式中,所述模擬執(zhí)行模塊,具體用于在調(diào)度信息表中記錄所述選擇的線程的標(biāo)識和當(dāng)前的語句的標(biāo)識;在所述調(diào)度信息表中記錄所述第一線程的標(biāo)識和當(dāng)前的語句的標(biāo)識。
本發(fā)明實施例提供的MHP分析方法和裝置,通過構(gòu)建與待分析并行程序?qū)?yīng)的多線程控制流圖,然后對該多線程控制流圖進(jìn)行處理,得到保守正確的多線程控制流圖,對該保守正確的多線程控制流圖進(jìn)行MHP分析,從而得到待分析并行程序的MHP分析結(jié)果,由于多線程CFG是保守正確的,因此對該多線程CFG的構(gòu)建精確度較高,根據(jù)該多線程CFG進(jìn)行MHP分析獲取的結(jié)果誤報較少也不存在漏報,提高了對并行程序進(jìn)行MHP分析的準(zhǔn)確率。。
附圖說明
為了更清楚地說明本發(fā)明實施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對實施例或現(xiàn)有技術(shù)描述中所需要使用的附圖作一簡單地介紹,顯而易見地,下面描述中的附圖是本發(fā)明的一些實施例,對于本領(lǐng)域普通技術(shù)人員來講,在不付出創(chuàng)造性勞動性的前提下,還可以根據(jù)這些附圖獲得其它的附圖。
圖1為本發(fā)明實施例提供的并行程序的MHP分析方法實施例一的流程圖;
圖2為本發(fā)明實施例提供的并行程序的MHP分析方法實施例二的流程圖;
圖3為本發(fā)明實施例提供的并行程序的MHP分析方法實施例三的流程圖;
圖4為本發(fā)明實施例提供的并行程序的MHP分析裝置實施例一的結(jié)構(gòu)示意圖。
具體實施方式
為使本發(fā)明實施例的目的、技術(shù)方案和優(yōu)點更加清楚,下面將結(jié)合本發(fā)明實施例中的附圖,對本發(fā)明實施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實施例是本發(fā)明一部分實施例,而不是全部的實施例?;诒景l(fā)明中的實施例,本領(lǐng)域普通技術(shù)人員在沒有作出創(chuàng)造性勞動前提下所獲得的所有其它實施例,都屬于本發(fā)明保護(hù)的范圍。
在對并行程序進(jìn)行編譯的過程中,構(gòu)建并行程序的CFG時,需要匹配各線程中的創(chuàng)建(creat)/加入(join)原語,觸發(fā)(signal)/等待(wait)原語,鎖定(lock)/解鎖(unlock)原語。其中creat/join原語,signal/wait原語之間的匹配構(gòu)成Happens-Before問題,因為這些原語使得其作用的語句見存在明確的偏序關(guān)系,這種偏序關(guān)系是程序真實執(zhí)行中必然滿足的執(zhí)行序關(guān)系。因此如果分析程序不能很好的抓住這個偏序特點,分析結(jié)果必然伴隨著大量的錯誤分析(例如一定不能并發(fā)執(zhí)行的語句被判定為可能并發(fā))。
圖1為本發(fā)明實施例提供的并行程序的MHP分析方法實施例一的流程圖,如圖1所示,本實施例提供的MHP分析方法包括:
步驟S101,從待分析并行程序的主線程開始,每次選擇一個線程,模擬待分析并行程序的執(zhí)行,其中,當(dāng)正在模擬執(zhí)行的線程無法繼續(xù)執(zhí)行時,跳轉(zhuǎn)至任一可繼續(xù)執(zhí)行的線程模擬執(zhí)行,直至待分析并行程序的所有線程模擬執(zhí)行完畢,其中,待分析并行程序包括至少兩個線程。
具體地,本實施例提供的MHP分析方法應(yīng)用于對并行程序進(jìn)行編譯的過程中。對于一個待分析并行程序,由于并行特點,因此其包括多個線程,其中一個線程為主線程,該待分析并行程序從主線程開始執(zhí)行。
在本實施例中,首先從待分析并行程序的主線程開始,每次選擇一個線程,對每個線程進(jìn)行分析,模擬選擇的線程的執(zhí)行。對于每個線程的模擬有一個原則,就是當(dāng)正在模擬執(zhí)行的線程無法繼續(xù)執(zhí)行時,再跳轉(zhuǎn)至任一個可繼續(xù)執(zhí)行的線程模擬執(zhí)行。上述無法繼續(xù)執(zhí)行的線程會在某些線程被執(zhí)行的過程中滿足可繼續(xù)執(zhí)行的條件,因此,重復(fù)上述步驟,可以將待分析并行程序的所有線程都模擬執(zhí)行完畢。
步驟S102,根據(jù)對待分析并行程序進(jìn)行模擬執(zhí)行的結(jié)果,構(gòu)建與待分析并行程序?qū)?yīng)的多線程控制流圖。
具體地,在對待分析并行程序的所有線程都進(jìn)行了模擬執(zhí)行后,即可獲知各線程之間的關(guān)系,即各線程之間是否具有creat/join,signal/wait,lock/unlock原語的匹配關(guān)系。根據(jù)各線程之間的匹配關(guān)系,可以構(gòu)建出與待分析并行程序?qū)?yīng)的多線程GFG。
步驟S103,對多線程控制流圖進(jìn)行處理,得到保守正確的多線程控制流圖,保守正確的多線程控制流圖中的各節(jié)點的MHP結(jié)果不存在漏報。
具體地,與待分析并行程序?qū)?yīng)的多線程CFG體現(xiàn)了待分析并行程序中個線程之間的邏輯關(guān)系,對該多線程CFG進(jìn)行分析即可獲得對待分析并行程序的分析結(jié)果。由于在對程序進(jìn)行MHP分析時,可能出現(xiàn)兩種錯誤,一種為漏報,即將可能并發(fā)的語句判斷為不可并發(fā),另一種為誤報,即將不可能并發(fā)的語句判斷為并發(fā)。在對程序進(jìn)行靜態(tài)分析時,確保分析結(jié)果中不存在漏報的情況,則稱該結(jié)果時保守正確的。
步驟S104,對保守正確的多線程控制流圖進(jìn)行MHP分析,得到待分析并行程序的MHP分析結(jié)果。
具體地,在得到保守正確的多線程CFG后,即可對其進(jìn)行MHP分析,得到分析結(jié)果。該分析結(jié)果即反映了待分析并行程序的MHP分析結(jié)果。由于多線程CFG是保守正確的,因此對該多線程CFG的構(gòu)建精確度較高,根據(jù)該多線程CFG進(jìn)行MHP分析獲取的結(jié)果誤報較少也不存在漏報,提高了對并行程序進(jìn)行MHP分析的準(zhǔn)確率。
本實施例提供的MHP分析方法,通過構(gòu)建與待分析并行程序?qū)?yīng)的多線程控制流圖,然后對該多線程控制流圖進(jìn)行處理,得到保守正確的多線程控制流圖,對該保守正確的多線程控制流圖進(jìn)行MHP分析,從而得到待分析并行程序的MHP分析結(jié)果,由于多線程CFG是保守正確的,因此對該多線程CFG的構(gòu)建精確度較高,根據(jù)該多線程CFG進(jìn)行MHP分析獲取的結(jié)果誤報較少也不存在漏報,提高了對并行程序進(jìn)行MHP分析的準(zhǔn)確率。
為了保證對多線程CFG進(jìn)行處理后得到的多線程CFG是保守正確的,可以對步驟S102得到的多線程CFG進(jìn)行如下處理:若多線程控制流圖中的加入原語節(jié)點與多個線程匹配,則刪除所有與加入原語節(jié)點連接的邊;若多線程控制流圖中的等待原語節(jié)點與多個觸發(fā)原語節(jié)點匹配,則刪除與所述等待原語節(jié)點連接的邊;將得到的多線程控制流圖作為保守正確的多線程控制流圖。
具體地,由于加入原語是用于與創(chuàng)建原語相匹配的,但多個創(chuàng)建原語可能采用一個相同的標(biāo)識,因此加入原語可能與多個線程相匹配,但其中只有一個線程是加入原語應(yīng)正確匹配的。由于在進(jìn)行MHP分析時,判斷加入原語究竟和哪個線程是正確匹配的過于復(fù)雜,因此在這里可以刪除所有與加入原語連接的邊,這樣會使在進(jìn)行MHP分析時,認(rèn)為加入原語后面的語句都可能與加入原語并發(fā),這是一種誤報,但不是漏報。同理,等待原語與觸發(fā)原語相匹配,因此若多線程控CFG中的等待原語節(jié)點與多個觸發(fā)原語節(jié)點匹配,則刪除與等待原語節(jié)點連接的邊。經(jīng)過上述處理,即可保證得到的多線程CFG是保守正確的。
進(jìn)一步地,在圖1所示實施例中,步驟S104中,對保守正確的多線程控制流圖進(jìn)行MHP分析,得到待分析并行程序的MHP分析結(jié)果的步驟,具體可以包括:計算保守正確的多線程控制流圖中各節(jié)點的非并發(fā)集合和產(chǎn)生集合,其中,節(jié)點A的非并發(fā)集合表示無法與節(jié)點A并發(fā)的節(jié)點的集合,節(jié)點A的產(chǎn)生集合表示節(jié)點A所產(chǎn)生的節(jié)點的集合;根據(jù)各節(jié)點的非并發(fā)集合和產(chǎn)生集合迭代計算保守正確的多線程控制流圖中各節(jié)點的MHP分析結(jié)果,直至MHP分析結(jié)果收斂,得到待分析并行程序的MHP分析結(jié)果。
具體地,在對保守正確的多線程CFG進(jìn)行MHP分析時,首先需要對多線程CFG中的各節(jié)點進(jìn)行分析,確定各節(jié)點的非并發(fā)集合和產(chǎn)生集合。其中一個節(jié)點A的非并發(fā)集合表示無法與節(jié)點A并發(fā)的節(jié)點的集合,也就是肯定無法與節(jié)點A并發(fā)的節(jié)點的集合。節(jié)點A的產(chǎn)生集合表示節(jié)點A所產(chǎn)生的節(jié)點的集合。然后每次選擇一個節(jié)點,根據(jù)其輸入節(jié)點集合、輸出節(jié)點集合、非并發(fā)集合和產(chǎn)生集合,計算出該節(jié)點的MHP結(jié)果。其中,每個節(jié)點的輸入節(jié)點結(jié)合、輸出節(jié)點集合和產(chǎn)生集合的并集,再減去非并發(fā)集合,即為該節(jié)點的MHP分析結(jié)果。將對每個節(jié)點計算出的MHP分析結(jié)果沿著多線程CFG的執(zhí)行順序向下傳遞,若有循環(huán)則進(jìn)行迭代計算,最終將每個節(jié)點的MHP分集合過都得到后,集合得到待分析并行程序的MHP分析結(jié)果。
圖2為本發(fā)明實施例提供的并行程序的MHP分析方法實施例二的流程圖,如圖2所示,本實施例提供的MHP分析方法包括:
步驟S201,從主線程開始,每次選擇一個線程,模擬選擇的線程的執(zhí)行,當(dāng)選擇的線程無法繼續(xù)執(zhí)行時,鎖定選擇的線程并記錄選擇的線程當(dāng)前的位置信息。
具體地,本實施例提供的MHP分析方法為圖1所示實施例中步驟S101的具體執(zhí)行步驟。首先,從主線程開始,每次選擇一個線程,模擬所選擇的線程的執(zhí)行,直至該選擇的線程無法繼續(xù)執(zhí)行,也就是對每個選擇的線程都需要盡最大可能模擬執(zhí)行,直至無法繼續(xù)執(zhí)行。然后鎖定該選擇的線程,并記錄該選擇的線程的當(dāng)前位置。在對該選擇的線程解鎖之前,不能繼續(xù)模擬執(zhí)行該選擇的線程。也即,可以采用深度優(yōu)先搜索分析法模擬選擇的線程的執(zhí)行??梢栽谡{(diào)度信息表中記錄選擇的線程的標(biāo)識和當(dāng)前的語句的標(biāo)識,從而記錄選擇的線程當(dāng)前的位置信息。
步驟S202,跳轉(zhuǎn)至任一未被鎖定且可繼續(xù)執(zhí)行的第一線程,模擬第一線程的執(zhí)行,當(dāng)?shù)谝痪€程無法繼續(xù)執(zhí)行時,鎖定第一線程并記錄第一線程當(dāng)前的位置信息,直至未被鎖定且可繼續(xù)執(zhí)行的線程均被模擬執(zhí)行。
具體地,當(dāng)鎖定了上述選擇的線程后,可以跳轉(zhuǎn)至任一個未被鎖定且可以繼續(xù)執(zhí)行的第一線程,并模擬第一線程的執(zhí)行。對第一線程的模擬也需要盡最大的能力模擬執(zhí)行,直至第一線程無法繼續(xù)執(zhí)行。然后鎖定第一線程并記錄第一線程當(dāng)前的位置。重復(fù)選擇未被鎖定且可以繼續(xù)執(zhí)行的第一線程,直至所有未被鎖定且可以繼續(xù)執(zhí)行的線程均被模擬執(zhí)行。也即,可以采用深度優(yōu)先搜索分析法模擬第一線程的執(zhí)行??梢栽谡{(diào)度信息表中記錄第一線程的標(biāo)識和當(dāng)前的語句的標(biāo)識,從而記錄選擇的線程當(dāng)前的位置信息。
步驟S203,解除被鎖定的線程,并重復(fù)執(zhí)行步驟S202,直至待分析并行程序的所有線程模擬執(zhí)行完畢。
具體地,當(dāng)沒有未鎖定且可繼續(xù)執(zhí)行的線程時,需要同時解除所有被鎖定的線程。然后重復(fù)執(zhí)行步驟S202,一直到得分析程序的所有線程均被模擬執(zhí)行完畢。也就是說,在本實施例中,對各線程進(jìn)行模擬執(zhí)行的原則是,第一,需要盡最大能力模擬執(zhí)行當(dāng)前選擇的線程,第二,若仍有可執(zhí)行的線程,則不能執(zhí)行被鎖定的線程。
根據(jù)本實施例提供的方法模擬執(zhí)行得到的結(jié)果檢測的多線程CFG,能夠真實體現(xiàn)待分析并行程序中各線程之間的關(guān)系,從而得到準(zhǔn)確可靠的多線程CFG。
圖1和圖2示出了本發(fā)明提供的并行程序的MHP分析方法的實施流程,下面以一個具體實施例對圖1和圖2所示的并行程序的MHP分析方法進(jìn)行進(jìn)一步說明。
圖3為本發(fā)明實施例提供的并行程序的MHP分析方法實施例三的流程圖,如圖3所示,本實施例提供的MHP分析方法包括:
步驟S301,構(gòu)建一個調(diào)度器,使用調(diào)度器模擬動態(tài)程序的執(zhí)行,每次選擇一個線程進(jìn)行靜態(tài)分析。
具體地,首先,構(gòu)建一個調(diào)度信息列表,用于保存待分析并行程序的線程的信息,這個信息為當(dāng)前分析線程的標(biāo)識(Identity,ID)和分析位置,比如所在函數(shù),所在基本快和所在哪一條語句。各線程間采用隨機(jī)調(diào)度或循壞調(diào)度方案,而線程內(nèi)采用標(biāo)準(zhǔn)的深度優(yōu)先搜索(Depth First Search,DFS)分析方法。于是對于一個線程而言,其在調(diào)度信息列表中將占有唯一一個可調(diào)度的位置,而其信息可表現(xiàn)為棧的形式,用于表達(dá)DFS分析時函數(shù)間層層調(diào)用的關(guān)系。待編譯器掃描完源碼,并進(jìn)行基本的詞法、語法分析以及過程內(nèi)多線程CFG的構(gòu)建后,調(diào)度器開始從主函數(shù)對多線程CFG掃描,如果遇見一個創(chuàng)建原語,則在調(diào)度信息列表中建立這個新創(chuàng)線程的信息,并在之后的合適時間對這個新創(chuàng)線程進(jìn)行分析。如果調(diào)度器遇見一次函數(shù)調(diào)用,則按照DFS進(jìn)行分析,把調(diào)用函數(shù)的位置信息壓棧,然后跳到被調(diào)函數(shù)進(jìn)行分析。如果當(dāng)前線程不能再進(jìn)行分析,比如遇見一個加入原語等,調(diào)度器保存當(dāng)前分析到加入原語的所在函數(shù)、所在基本塊、所在語句等位置信息,然后挑選另外一個線程繼續(xù)進(jìn)行分析。如果當(dāng)前線程分析完畢,則調(diào)度信息列表中可以撤銷這個線程的信息。
步驟S302,調(diào)度器對各線程進(jìn)行分析,在當(dāng)前被分析的線程出現(xiàn)阻塞或不能再分析的時候切換到其他線程進(jìn)行分析,一旦滿足某些條件后,調(diào)度器可以繼續(xù)分析那些之前被阻塞或不能分析的線程。
具體地,根據(jù)各原語的含義,可以定義:加入原語、觸發(fā)原語、等待原語具有阻塞的含義。也就是:加入原語、觸發(fā)原語、等待原語有能力阻止分析程序繼續(xù)分析當(dāng)前線程的能力,一直到某個條件滿足為止。對各線程進(jìn)行分析需要滿足以下兩個規(guī)則:
規(guī)則一:分析程序應(yīng)該盡其最大努力去做分析,在不能再做任何分析之前(因為被阻塞或部分線程分析完畢),分析程序不能做任何創(chuàng)建/加入原語和觸發(fā)/等待原語的匹配工作。規(guī)則二:一旦分析程序準(zhǔn)備去做創(chuàng)建/加入原語和觸發(fā)/等待原語的匹配工作,分析程序應(yīng)該處理當(dāng)前所有的創(chuàng)建/加入原語和觸發(fā)/等待原語,然后再解開阻塞狀態(tài)繼續(xù)分析后續(xù)的程序。
步驟S303,循環(huán)執(zhí)行步驟S302,直到所有源代碼被分析完畢。然后通過兩條提純法則來保證所構(gòu)建的多線程CFG是保守正確的。
第一條提純法則:如果一個加入原語節(jié)點可以和多個線程匹配(包含標(biāo)準(zhǔn)線程(normalized thread)的情況),就刪除所有與該加入原語節(jié)點連接的邊。第二條提純法則:如果一個等待原語節(jié)點可以和多個觸發(fā)原語節(jié)點匹配(包含標(biāo)準(zhǔn)線程的情況),就刪除所有與該等待原語節(jié)點連接的邊。上述標(biāo)準(zhǔn)線程的定義為:在循環(huán)內(nèi)創(chuàng)建的線程;這些線程通常有相同的目標(biāo)線程函數(shù)體,但是在靜態(tài)分析時,由于無法知道創(chuàng)建線程的個數(shù),通常按照單個線程或2個線程進(jìn)行分析,但要標(biāo)記為標(biāo)準(zhǔn)線程,從而標(biāo)明與一般線程的不同。
步驟S304,對創(chuàng)建后的多線程CFG計算進(jìn)行MHP計算。
具體地,首先定義一些符號:t表示一個線程,N(t)表示這個線程的所有節(jié)點;n表示一個節(jié)點,localpred(n)將返回n本地的立即前驅(qū)節(jié)點(即返回的節(jié)點都屬于n所在線程),localsucc(n)返回n本地的立即后繼節(jié)點;pred(n)返回n的所有前驅(qū)節(jié)點,succ(n)返回n的所有后繼節(jié)點;anc(n)返回n的所有祖先節(jié)點;des(n)返回n的所有子孫節(jié)點;path_des(n1,n2)返回從n1到達(dá)n2的所有路徑,這些路徑都通過前向遍歷得到;p是一條路徑,p∈path_des(n1,n2);N(p)返回這條路徑p上的所有節(jié)點;path_anc(n1,n2)返回從n1到達(dá)n2的所有路徑,這些路徑都通過后向遍歷得到。
根據(jù)如下公式計算一些關(guān)鍵節(jié)點的非并發(fā)集合和產(chǎn)生集合,其中KILL(n)表示節(jié)點n的非并發(fā)集合,GEN(n)表示節(jié)點n的產(chǎn)生集合。signal_node表示觸發(fā)原語節(jié)點,wait_node表示等待原語節(jié)點,begin_node表示線程的開口時的入節(jié)點,join_node表示加入原語節(jié)點,exit_node表示線程結(jié)束時的出節(jié)點create_node表示創(chuàng)建原語節(jié)點,create_succ_node表示創(chuàng)建原語的后繼節(jié)點。
計算KILL(signal_node)
其中wait_node是與signal_node相匹配的節(jié)點,wait_node和begin_node屬于同一個線程。
計算GEN(signal_node)
GEN(signal_node):=KILL(signal_node)
計算KILL(wait_node)
KILL(wait_node):={n|n∈anc(signal_node)-des(signal_node)}
signal_node是與wait_node相匹配的節(jié)點。
計算KILL(begin_node)
KILL(begin_node):=∪n∈signal_nodeKILL(n)
begin_node和signal_node屬于同一個線程。
計算KILL(join_node)
KILL(join_node):=ane(exit_node)
計算GEN(begin_node/create_succ_node)
每個create_node有兩個立即后繼節(jié)點,一個是begin_node,一個是create_succ_node。
計算GEN(begin_node/create_succ_node)
然后根據(jù)如下數(shù)據(jù)流方程的公式進(jìn)行MHP的計算。
IN(n):=∪p∈localpred(n)out(p)
POUT(n):=OUT(n)∪IN(n)∪GEN(n)-KILL(n)
MHP(n)=:OUT(n)-LOCK(n)
對整個待分析并行程序進(jìn)行循環(huán)計算,從而可以得到待分析并行程序的MHP分析結(jié)果。
圖4為本發(fā)明實施例提供的并行程序的MHP分析裝置實施例一的結(jié)構(gòu)示意圖,如圖4所示,本實施例提供的并行程序的MHP分析裝置包括:
模擬執(zhí)行模塊41,用于從待分析并行程序的主線程開始,每次選擇一個線程,模擬所述待分析并行程序的執(zhí)行,其中,當(dāng)正在模擬執(zhí)行的線程無法繼續(xù)執(zhí)行時,跳轉(zhuǎn)至任一可繼續(xù)執(zhí)行的線程模擬執(zhí)行,直至所述待分析并行程序的所有線程模擬執(zhí)行完畢,其中,所述待分析并行程序包括至少兩個線程。
控制流圖構(gòu)建模塊42,用于根據(jù)對所述待分析并行程序進(jìn)行模擬執(zhí)行的結(jié)果,構(gòu)建與所述待分析并行程序?qū)?yīng)的多線程控制流圖。
控制流圖處理模塊43,用于對所述多線程控制流圖進(jìn)行處理,得到保守正確的多線程控制流圖,所述保守正確的多線程控制流圖中的各節(jié)點的可能并發(fā)MHP結(jié)果不存在漏報。
MHP分析模塊44,用于對所述保守正確的多線程控制流圖進(jìn)行MHP分析,得到所述待分析并行程序的MHP分析結(jié)果。
本實施例提供的并行程序的MHP分析裝置用于實現(xiàn)圖1所示并行程序的MHP分析方法的流程,其實現(xiàn)原理和技術(shù)效果類似,此處不再贅述。
進(jìn)一步地,在圖4所示實施例中,控制流圖處理模塊43,具體用于若所述多線程控制流圖中的加入原語節(jié)點與多個線程匹配,則刪除所有與所述加入原語節(jié)點連接的邊;若所述多線程控制流圖中的等待原語節(jié)點與多個觸發(fā)原語節(jié)點匹配,則刪除所有與所述等待原語節(jié)點連接的邊;將得到的多線程控制流圖作為保守正確的多線程控制流圖。
進(jìn)一步地,在圖4所示實施例中,MHP分析模塊44,具體用于計算所述保守正確的多線程控制流圖中各節(jié)點的非并發(fā)集合和產(chǎn)生集合,其中,節(jié)點A的非并發(fā)集合表示無法與節(jié)點A并發(fā)的節(jié)點的集合,節(jié)點A的產(chǎn)生集合表示節(jié)點A所產(chǎn)生的節(jié)點的集合;根據(jù)各節(jié)點的非并發(fā)集合和產(chǎn)生集合迭代計算所述保守正確的多線程控制流圖中各節(jié)點的MHP分析結(jié)果,直至所述MHP分析結(jié)果收斂,得到所述待分析并行程序的MHP分析結(jié)果。
進(jìn)一步地,在圖4所示實施例中,模擬執(zhí)行模塊41,具體用于執(zhí)行如下步驟:步驟一,從所述主線程開始,每次選擇一個線程,模擬選擇的線程的執(zhí)行,當(dāng)所述選擇的線程無法繼續(xù)執(zhí)行時,鎖定所述選擇的線程并記錄所述選擇的線程當(dāng)前的位置信息;步驟二,跳轉(zhuǎn)至任一未被鎖定且可繼續(xù)執(zhí)行的第一線程,模擬所述第一線程的執(zhí)行,當(dāng)所述第一線程無法繼續(xù)執(zhí)行時,鎖定所述第一線程并記錄所述第一線程當(dāng)前的位置信息,直至所有未被鎖定且可繼續(xù)執(zhí)行的線程均被模擬執(zhí)行;步驟三,解除所有被鎖定的線程,并重復(fù)執(zhí)行步驟二,直至所述待分析并行程序的所有線程模擬執(zhí)行完畢。
進(jìn)一步地,在圖4所示實施例中,模擬執(zhí)行模塊41,具體用于采用深度優(yōu)先搜索分析法模擬選擇的線程的執(zhí)行;采用深度優(yōu)先搜索分析法模擬所述第一線程的執(zhí)行。
進(jìn)一步地,在圖4所示實施例中,模擬執(zhí)行模塊41,具體用于在調(diào)度信息表中記錄所述選擇的線程的標(biāo)識和當(dāng)前的語句的標(biāo)識;在所述調(diào)度信息表中記錄所述第一線程的標(biāo)識和當(dāng)前的語句的標(biāo)識。
最后應(yīng)說明的是:以上各實施例僅用以說明本發(fā)明的技術(shù)方案,而非對其限制;盡管參照前述各實施例對本發(fā)明進(jìn)行了詳細(xì)的說明,本領(lǐng)域的普通技術(shù)人員應(yīng)當(dāng)理解:其依然可以對前述各實施例所記載的技術(shù)方案進(jìn)行修改,或者對其中部分或者全部技術(shù)特征進(jìn)行等同替換;而這些修改或者替換,并不使相應(yīng)技術(shù)方案的本質(zhì)脫離本發(fā)明各實施例技術(shù)方案的范圍。