專利名稱:檢測多線程程序中的死鎖的方法及系統(tǒng)的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及計(jì)算機(jī)技術(shù)領(lǐng)域,尤其涉及在多任務(wù)情況下檢測死鎖的方法及系統(tǒng)。
背景技術(shù):
隨著計(jì)算機(jī)技術(shù)的快速發(fā)展,多任務(wù)、多線程或者多處理器的技術(shù)應(yīng)用目前已經(jīng)非常廣泛。所述多任務(wù)是指同一個(gè)程序能有幾個(gè)并發(fā)執(zhí)行的路徑,這些任務(wù)共享內(nèi)存地址空間,可以并發(fā)異步執(zhí)行。死鎖(Dead Lock)是指兩個(gè)或兩個(gè)以上的進(jìn)程在執(zhí)行過程中,因爭奪資源而造成的一種互相等待的現(xiàn)象,若無外力作用,它們都將無法推進(jìn)下去。此時(shí)稱系統(tǒng)處于死鎖狀態(tài)或系統(tǒng)產(chǎn)生了死鎖,這些永遠(yuǎn)在互相等待的進(jìn)程稱為死鎖進(jìn)程。然而,由于死鎖只在涉及例如正在執(zhí)行的線程的交錯(cuò)或時(shí)序的特定條件下才可能發(fā)生,它是難以檢測的。在目前的檢測方法中,可以分為靜態(tài)代碼分析和運(yùn)行時(shí)分析。靜態(tài)代碼分析,是指對目標(biāo)源程序進(jìn)行分析,找出目標(biāo)線程和相關(guān)的資源,建立線程和資源之間的關(guān)系圖,如果存在循環(huán)就認(rèn)為存在死鎖。運(yùn)行時(shí)分析需要增加額外的數(shù)據(jù)結(jié)構(gòu)和軟件模塊,每當(dāng)有線程使用資源(獲取或者釋放)加以記錄分析,如果獲取的資源和釋放的資源不一致,或者其他異常,認(rèn)為存在死鎖。在現(xiàn)有技術(shù)的情況下,都需要目標(biāo)程序的源代碼,這在比較大的程序進(jìn)行聯(lián)合開發(fā)的情況下,往往并不能得到所有的源代碼,在源代碼比較多的情況下,對源代碼進(jìn)行分析也是一件很困難的事情。另外,現(xiàn)有動態(tài)死鎖檢測方法都需要增加額外的數(shù)據(jù)結(jié)構(gòu)和軟件模塊,并且會修改目標(biāo)程序的行為。比如,目標(biāo)程序請求資源或者釋放資源的時(shí)候,往往需要在增加的數(shù)據(jù)結(jié)構(gòu)中填寫對應(yīng)的值。這樣做,會影響目標(biāo)程序的行為,導(dǎo)致得到的結(jié)果的可信度降低。
發(fā)明內(nèi)容
本發(fā)明是為了解決上述問題而提出的,其目的在于提供一種采用動態(tài)插入探測點(diǎn)的方式,且不需要目標(biāo)程序源代碼,也不影響目標(biāo)程序的運(yùn)行的檢測多線程程序中的死鎖的方法及系統(tǒng)。根據(jù)本發(fā)明的目的,提供一種檢測多線程程序中的死鎖的方法,其特征在于,包括以下步驟選定所要檢測的線程;啟動跟蹤程序,以跟蹤在內(nèi)核中運(yùn)行的線程;啟動目標(biāo)多線程程序;判斷是否存在所選定的線程在運(yùn)行;在線程庫中動態(tài)地插入探測點(diǎn),以通過探測函數(shù)對所述選定的線程進(jìn)行探測;記錄所述探測函數(shù)所探測的數(shù)據(jù),并且當(dāng)記錄的數(shù)據(jù)超過內(nèi)核的閥值時(shí),將數(shù)據(jù)傳輸?shù)接脩艨臻g并進(jìn)行存儲;對存儲于用戶空間中的數(shù)據(jù)進(jìn)行分析,以判斷是否產(chǎn)生死鎖。所述探測函數(shù)進(jìn)行探測的方式包括入口探測與返回探測,其中,所述入口探測是在資源函數(shù)進(jìn)入時(shí)執(zhí)行,所述返回探測是在資源函數(shù)返回的時(shí)候執(zhí)行。
在記錄所述探測函數(shù)所探測的數(shù)據(jù)的步驟中,記錄線程號和資源標(biāo)示。在對存儲到用戶空間的數(shù)據(jù)進(jìn)行分析的步驟中,當(dāng)多個(gè)線程中的其中一個(gè)線程長時(shí)間請求資源,而所述線程請求的資源被另一個(gè)線程所擁有,且所述另一個(gè)線程所請求的資源由所述線程擁有時(shí),判斷為發(fā)生死鎖。在對存儲 到用戶空間的數(shù)據(jù)進(jìn)行分析的步驟中,當(dāng)多個(gè)線程中的其中一個(gè)線程長時(shí)間請求資源,并且所述線程請求的資源被另一個(gè)線程所擁有,而所述另一個(gè)線程所請求的資源由所述線程擁有時(shí),判斷為發(fā)生死鎖。根據(jù)本發(fā)明的另一目的,提供一種檢測多線程程序中的死鎖的系統(tǒng),包括探測設(shè)置模塊,其用于在線程庫中動態(tài)插入探測點(diǎn),以通過探測函數(shù)對線程進(jìn)行探測,并且記錄所述探測函數(shù)所探測的數(shù)據(jù);數(shù)據(jù)傳輸模塊,以用于當(dāng)所述記錄數(shù)據(jù)超過閥值時(shí),將所述記錄數(shù)據(jù)傳輸?shù)接脩艨臻g并進(jìn)行存儲;分析模塊,以用于對存儲到用戶空間的所述記錄數(shù)據(jù)進(jìn)行分析,以判斷是否產(chǎn)生死鎖。所述探測函數(shù)的探測方式包括入口探測和返回探測,其中,所述入口探測是在資源函數(shù)進(jìn)入時(shí)執(zhí)行,所述返回探測是在資源函數(shù)返回的時(shí)候執(zhí)行。所述探測函數(shù)記錄線程號和資源標(biāo)示。當(dāng)多個(gè)線程中的其中一個(gè)線程長時(shí)間請求資源,而所述線程請求的資源被另一個(gè)線程所擁有,且所述另一個(gè)線程所請求的資源由所述線程擁有時(shí),則所述分析模塊判斷為發(fā)生死鎖。根據(jù)本發(fā)明,在不需要目標(biāo)程序的源代碼的情況下,就可以有效地檢測出死鎖,因而有利于多線程的調(diào)試作業(yè),而且還有利于多線程程序?qū)Y源使用情況的分析。
通過下面的附圖對本發(fā)明實(shí)施例進(jìn)行的描述,本發(fā)明的上述和其他目的和特點(diǎn)將會變得更加清楚,其中圖1為根據(jù)本發(fā)明的檢測多線程程序中的死鎖的方法的流程圖;圖2為根據(jù)本發(fā)明的動態(tài)插入用戶空間的方法的簡要示意圖;圖3為根據(jù)本發(fā)明的死鎖的分析方法的流程圖;圖4為圖3的中的死鎖狀態(tài)的簡要示意圖;圖5為根據(jù)本發(fā)明的檢測多線程程序中的死鎖的系統(tǒng)的方框圖。
具體實(shí)施例方式以下,參照附圖來詳細(xì)說明根據(jù)本發(fā)明的實(shí)施例。如圖1所示,根據(jù)本發(fā)明的檢測多線程程序中的死鎖的方法包括以下步驟。在步驟S100,用戶選定所要檢測的線程。然后,在步驟SlOl啟動跟蹤程序,以跟蹤在內(nèi)核中運(yùn)行的線程。接著,在步驟S102,啟動目標(biāo)多線程程序。此時(shí),所述目標(biāo)程序?yàn)橛脩艨臻g的應(yīng)用程序。用戶空間的應(yīng)用程序的探測相對于內(nèi)核空間的探測的不同點(diǎn)在于,內(nèi)核總是被加載于物理內(nèi)存中,其有固定的地址,因此探測點(diǎn)可以在任何時(shí)候插入。但是用戶空間的應(yīng)用程序是按需要加載于內(nèi)存里面去的,其沒有固定的地址,因此探測點(diǎn)就不是在任何時(shí)候都可以插入。此時(shí)的解決方式是維護(hù)一個(gè)預(yù)先定義的探測點(diǎn)的列表,然后在內(nèi)核函數(shù)do_page_fault插入一個(gè)探測點(diǎn),從do_page_fault函數(shù)里面獲取加載頁面的信息,當(dāng)do_page_ fault返回的時(shí)候檢查探測點(diǎn)列表,如果在內(nèi)核中發(fā)現(xiàn)存在需要插入探測點(diǎn)的線程,則在新加載的頁面里面插入探測點(diǎn)。即,當(dāng)啟動目標(biāo)程序時(shí),所啟動的程序就會被加載于內(nèi)核中運(yùn)行,此時(shí)將產(chǎn)生頁面錯(cuò)誤。由此,在步驟S103中,用戶根據(jù)頁面錯(cuò)誤判斷是否存在用戶所選定的線程在運(yùn)行。當(dāng)發(fā)現(xiàn)存在運(yùn)行中的用戶所選定的線程時(shí),執(zhí)行步驟S104,在線程庫中動態(tài)插入探測點(diǎn),以通過探測函數(shù)對用戶所選定的線程進(jìn)行探測。圖2為根據(jù)本發(fā)明的動態(tài)插入探測點(diǎn)的方法的簡要示意圖。參照圖2可知,由于用戶空間的應(yīng)用程序不同于內(nèi)核程序,其并沒有一次全部被加載到內(nèi)存中,而是在運(yùn)行時(shí)選擇性地進(jìn)行加載。因此,當(dāng)用戶設(shè)置動態(tài)探測指令,這些指令會被記錄到探測數(shù)據(jù)中。當(dāng)發(fā)生頁面錯(cuò)誤的時(shí)候,頁面錯(cuò)誤處理器會調(diào)用探測設(shè)置模塊,該探測設(shè)置模塊去搜索新加載的應(yīng)用程序是否需要插入探測函數(shù),如果需要,就動態(tài)插入探測函數(shù)。動態(tài)插入探測點(diǎn)的方法有很多方式,本發(fā)明中,動態(tài)插入探測點(diǎn)利用kprobes,具體的插入方式為在需要插入探測點(diǎn)的地方插入一個(gè)中斷指令, 當(dāng)執(zhí)行到這個(gè)中斷指令,會調(diào)用相應(yīng)的中斷函數(shù),用戶自己定義的探測函數(shù)在中斷函數(shù)中執(zhí)行。Kprobes向運(yùn)行的內(nèi)核中給定地址寫入斷點(diǎn)指令,插入一個(gè)探測函數(shù)。而執(zhí)行探測的指令會導(dǎo)致斷點(diǎn)錯(cuò)誤,Kprobes鉤住(hook in)斷點(diǎn)處理器并收集調(diào)試信息。所述探測函數(shù)探測的方式提供兩種探測種類,一是入口探測,另一種是返回探測。其中,所述入口探測是在資源函數(shù)進(jìn)入時(shí)執(zhí)行,所述返回探測是在資源函數(shù)返回的時(shí)候執(zhí)行,記錄下線程號和資源標(biāo)示。因此,在資源函數(shù)入口點(diǎn)(entry)和出口點(diǎn)(return)分別插入探測函數(shù)。然后,執(zhí)行步驟S105,所述探測函數(shù)記錄所探測的數(shù)據(jù)。當(dāng)目標(biāo)程序啟動時(shí),就會調(diào)用資源請求函數(shù)和資源釋放函數(shù),此時(shí)對應(yīng)的入口探測函數(shù)和返回探測函數(shù)就會被調(diào)用,線程號和資源標(biāo)示將會被記錄下來。因此,所述探測函數(shù)所探測的數(shù)據(jù)中包含線程號以及資源標(biāo)示。 所述資源請求函數(shù)包括資源請求入口函數(shù)和資源請求返回函數(shù),所述資源釋放函數(shù)包括資源釋放入口函數(shù)和資源釋放返回函數(shù)。當(dāng)一個(gè)線程進(jìn)入了資源請求函數(shù),比如PthreacL mutex_lock,表示這個(gè)線程正在請求一個(gè)資源,如果從pthreadjnutexjock成功返回,表示這個(gè)線程成功的獲取資源,在進(jìn)入這個(gè)函數(shù)到返回這個(gè)函數(shù)的時(shí)間段就是線程獲取資源的時(shí)間。而線程進(jìn)入pthread_mutex_unl0Ck表示這個(gè)線程開始釋放資源,并且從pthread_ mutemnlock成功返回,表示這個(gè)線程就釋放掉了資源,此時(shí)別的線程就可以使用所述線程釋放的資源,因?yàn)楫?dāng)一個(gè)線程繼續(xù)占有某個(gè)資源時(shí),別的線程是無法使用該資源的。接著,執(zhí)行步驟S106,判斷所述探測函數(shù)所記錄的數(shù)據(jù)是否超過閥值。當(dāng)所述探測函數(shù)所記錄的數(shù)據(jù)超過閥值時(shí),執(zhí)行步驟S107,將所述記錄的數(shù)據(jù)轉(zhuǎn)移到用戶空間。此時(shí), 所述閥值為內(nèi)核空間的閥值。由于內(nèi)核空間的限制,探測函數(shù)記錄下來的數(shù)據(jù)不會一直保存于內(nèi)存的緩沖區(qū),當(dāng)記錄的數(shù)據(jù)超過一定的閥值,數(shù)據(jù)將會被傳輸?shù)接脩艨臻g,存入磁盤或者數(shù)據(jù)庫系統(tǒng),而相應(yīng)的內(nèi)核數(shù)據(jù)將會被清空。所述閥值是根據(jù)內(nèi)存的大小來確定的,這個(gè)值不能太大,否則會影響到內(nèi)核的運(yùn)行,但也不能太小,否則頻繁傳輸數(shù)據(jù)到用戶空間, 也一樣會影響內(nèi)核的性能。作為參考,IG的內(nèi)存可以分配32MB的緩存。接著,執(zhí)行步驟S108,對于所述轉(zhuǎn)到用戶空間的所述探測函數(shù)所記錄的數(shù)據(jù)進(jìn)行分析,以判斷是否產(chǎn)生了死鎖。圖3為根據(jù)本發(fā)明的死鎖的分析方法的流程圖,圖4為圖3的中的死鎖狀態(tài)的簡要示意圖。參照圖可知,根據(jù)本發(fā)明的死鎖的分析方法如下在步驟S301,通過資源請求入口函數(shù)判斷各個(gè)線程是否在請求資源。然后執(zhí)行步驟S302,以通過資源請求返回函數(shù)判斷各個(gè)線程所擁有的資源。接著,執(zhí)行步驟S303,以通過資源釋放入口函數(shù)和資源釋放返回函數(shù)判斷各個(gè)線程是否釋放掉所占有的資源。然后,執(zhí)行步驟S304,根據(jù)所述探測函數(shù)所探測的線程號及資源標(biāo)示進(jìn)行死鎖分析,即當(dāng)所述多個(gè)線程中的其中一個(gè)線程長時(shí)間占有一資源,且并沒有釋放這一資源,同時(shí)該線程請求另一資源,而所述線程請求的另一資源被另一個(gè)線程長時(shí)間所占有,且另一線程并沒有釋放該另一資源時(shí),判斷為發(fā)生死鎖。圖4中, 線程A長時(shí)間擁有資源R1,且同時(shí)請求資源R2 ;而在相同的時(shí)間內(nèi),線程B長時(shí)間擁有資源 R2,且同時(shí)請求資源R1,此時(shí)就可以判斷為發(fā)生了死鎖。圖5為根據(jù)本發(fā)明的檢測多線程程序中的死鎖的系統(tǒng)的方框圖。由圖可知,根據(jù)本發(fā)明的檢測多線程程序中的死鎖的系統(tǒng),包括探測設(shè)置模塊600、數(shù)據(jù)傳輸模塊601、分析模塊602。所述探測設(shè)置模塊600用于在線程庫中動態(tài)插入探測點(diǎn),以通過探測函數(shù)對用戶所選定的線程進(jìn)行探測,并且在探測函數(shù)里記錄數(shù)據(jù)。而且,所述探測設(shè)置模塊600還能夠動態(tài)設(shè)置內(nèi)核空間的探測函數(shù)。本發(fā)明中,所述探測設(shè)置模塊600動態(tài)插入探測點(diǎn)利用 kprobes,具體的插入方式為在需要插入探測點(diǎn)的地方插入一個(gè)中斷指令,當(dāng)執(zhí)行到這個(gè)中斷指令,會調(diào)用相應(yīng)的中斷函數(shù),用戶自己定義的探測函數(shù)在中斷函數(shù)中執(zhí)行。Kprobes 向運(yùn)行的內(nèi)核中給定地址寫入斷點(diǎn)指令,插入一個(gè)探測函數(shù)。而執(zhí)行探測的指令會導(dǎo)致斷點(diǎn)錯(cuò)誤,Kprobes鉤住(hook in)斷點(diǎn)處理器并收集調(diào)試信息。所述探測函數(shù)的探測類型包括入口探測和返回探測,其中,所述入口探測是在資源函數(shù)進(jìn)入時(shí)執(zhí)行,所述返回探測是在資源函數(shù)返回的時(shí)候執(zhí)行。所述探測函數(shù)記錄函數(shù)線程號和資源標(biāo)示。所述數(shù)據(jù)傳輸模塊601用于當(dāng)所述記錄數(shù)據(jù)超過內(nèi)核的閥值時(shí),將數(shù)據(jù)傳輸?shù)接脩艨臻g儲存。此時(shí),所述閥值是根據(jù)內(nèi)存的大小來確定的,這個(gè)值不能太大,否則會影響到 內(nèi)核的運(yùn)行,但也不能太小,否則頻繁傳輸數(shù)據(jù)到用戶空間,也一樣會影響內(nèi)核的性能。作為參考,IG的內(nèi)存可以分配32MB的緩存。所述分析模塊602用于對用戶空間數(shù)據(jù)進(jìn)行分析,以判斷是否產(chǎn)生死鎖。 所述分析模塊602的分析是通過比較所述探測函數(shù)所探測的線程號及資源標(biāo)示而進(jìn)行的。 艮口,當(dāng)所述多個(gè)線程中的其中一個(gè)線程長時(shí)間占有一資源,且并沒有釋放這一資源,同時(shí)該線程請求另一資源,而所述線程請求的另一資源被另一個(gè)線程長時(shí)間所占有,且另一線程并沒有釋放該另一資源時(shí),則所述分析模塊602判斷為發(fā)生死鎖。本發(fā)明不限于上述實(shí)施例,在不脫離本發(fā)明范圍的情況下,可以進(jìn)行各種變形和修改。
權(quán)利要求
1.一種檢測多線程程序中的死鎖的方法,其特征在于,包括以下步驟選定所要檢測的線程;啟動跟蹤程序,以跟蹤在內(nèi)核中運(yùn)行的線程;啟動目標(biāo)多線程程序; 判斷是否存在所選定的線程在運(yùn)行;在線程庫中動態(tài)地插入探測點(diǎn),以通過探測函數(shù)對所述選定的線程進(jìn)行探測;所述探測函數(shù)記錄所探測的數(shù)據(jù),并且當(dāng)記錄的數(shù)據(jù)超過內(nèi)核的閥值時(shí),將數(shù)據(jù)傳輸?shù)接脩艨臻g并進(jìn)行存儲;對存儲于用戶空間中的數(shù)據(jù)進(jìn)行分析,以判斷是否產(chǎn)生死鎖。
2.根據(jù)權(quán)利要求1所述的方法,其特征在于,進(jìn)行探測的方式包括入口探測與返回探測,其中,所述入口探測是在資源函數(shù)進(jìn)入時(shí)執(zhí)行,所述返回探測是在資源函數(shù)返回的時(shí)候執(zhí)行。
3.根據(jù)權(quán)利要求2所述的方法,其特征在于,在記錄所述探測函數(shù)所探測的數(shù)據(jù)的步驟中,記錄線程號和資源標(biāo)示。
4.根據(jù)權(quán)利要求1所述的方法,其特征在于,在對存儲到用戶空間的數(shù)據(jù)進(jìn)行分析的步驟中,通過比較所述探測函數(shù)所探測的線程號和資源標(biāo)示進(jìn)行分析。
5.根據(jù)權(quán)利要求4所述的方法,其特征在于,當(dāng)多個(gè)線程中的其中一個(gè)線程長時(shí)間請求資源,而所述線程請求的資源被另一個(gè)線程所擁有,且所述另一個(gè)線程所請求的資源由所述線程擁有時(shí),判斷為發(fā)生死鎖。
6.一種檢測多線程程序中的死鎖的系統(tǒng),其特征在于包括探測設(shè)置模塊,其用于在線程庫中動態(tài)插入探測點(diǎn),以通過探測函數(shù)對線程進(jìn)行探測, 并且記錄所述探測函數(shù)所探測的數(shù)據(jù);數(shù)據(jù)傳輸模塊,以用于當(dāng)所述記錄數(shù)據(jù)超過閥值時(shí),將所述記錄數(shù)據(jù)傳輸?shù)接脩艨臻g并進(jìn)行存儲;分析模塊,以用于對存儲到用戶空間的所述記錄數(shù)據(jù)進(jìn)行分析,以判斷是否產(chǎn)生死鎖。
7.根據(jù)權(quán)利要求6所述的系統(tǒng),其特征在于,所述探測函數(shù)的探測方式包括入口探測和返回探測,其中,所述入口探測是在資源函數(shù)進(jìn)入時(shí)執(zhí)行,所述返回探測是在資源函數(shù)返回的時(shí)候執(zhí)行。
8.根據(jù)權(quán)利要求7所述的系統(tǒng),其特征在于,所述探測函數(shù)記錄線程號和資源標(biāo)示。
9.根據(jù)權(quán)利要求6所述的系統(tǒng),其特征在于,所述探測模塊通過比較所述探測函數(shù)所探測的線程號和資源標(biāo)示進(jìn)行分析。
10.根據(jù)權(quán)利要求9所述的系統(tǒng),其特征在于,當(dāng)多個(gè)線程中的其中一個(gè)線程長時(shí)間請求資源,而所述線程請求的資源被另一個(gè)線程所擁有,且所述另一個(gè)線程所請求的資源由所述線程擁有時(shí),則所述分析模塊判斷為發(fā)生死鎖。
全文摘要
本發(fā)明涉及一種檢測多線程程序中的死鎖的方法及其系統(tǒng),所述方法包括以下步驟選定所要檢測的線程;啟動跟蹤程序,以跟蹤在內(nèi)核中運(yùn)行的線程;啟動目標(biāo)多線程程序;判斷是否存在所選定的線程在運(yùn)行;在線程庫中動態(tài)地插入探測點(diǎn),以通過探測函數(shù)對所述選定的線程進(jìn)行探測;所述探測函數(shù)記錄所探測的數(shù)據(jù),并且當(dāng)記錄的數(shù)據(jù)超過內(nèi)核的閥值時(shí),將數(shù)據(jù)傳輸?shù)接脩艨臻g并進(jìn)行存儲;對存儲于用戶空間中的數(shù)據(jù)進(jìn)行分析,以判斷是否產(chǎn)生死鎖。根據(jù)本發(fā)明,在不需要目標(biāo)程序的源代碼的情況下,就可以有效地檢測出死鎖,因而有利于多線程的調(diào)試作業(yè),而且還有利于多線程程序?qū)Y源使用情況的分析。
文檔編號G06F9/46GK102222015SQ201010146519
公開日2011年10月19日 申請日期2010年4月13日 優(yōu)先權(quán)日2010年4月13日
發(fā)明者沈志剛, 田峰 申請人:三星電子(中國)研發(fā)中心, 三星電子株式會社