專利名稱::管理線程異常的防護(hù)方法
技術(shù)領(lǐng)域:
:本發(fā)明涉及一種線程維護(hù)方法,具體說涉及一種在POSIX(PortableOperatingSystemInterface,可移植操作系統(tǒng)接口)線程庫(kù)環(huán)境下、多線程進(jìn)程的管理線程異常的防護(hù)方法。
背景技術(shù):
:Linux系統(tǒng)向管理員提供了非常好的方法,使他們可以在系統(tǒng)運(yùn)行時(shí)更改內(nèi)核,而不需要重新引導(dǎo)內(nèi)核系統(tǒng)。這是通過/proc虛擬文件系統(tǒng)實(shí)現(xiàn)的。/proc文件虛擬系統(tǒng)是一種內(nèi)核和內(nèi)核模塊用來向進(jìn)程(process)發(fā)送信息的機(jī)制(所以叫做/proc)。這個(gè)偽文件系統(tǒng)可以和內(nèi)核內(nèi)部數(shù)據(jù)結(jié)構(gòu)進(jìn)行交互,可以用于獲取運(yùn)行中的進(jìn)程的信息。在/proc中有一些編號(hào)的子目錄,每個(gè)編號(hào)的目錄對(duì)應(yīng)一個(gè)進(jìn)程標(biāo)識(shí)PID。這樣,每一個(gè)運(yùn)行中的進(jìn)程/proc中都有一個(gè)用它的PID命名的目錄。這些子目錄中包含可以提供有關(guān)進(jìn)程的狀態(tài)和環(huán)境的重要細(xì)節(jié)信息的文件。POSIX線程庫(kù)是uclibc庫(kù)中提供的標(biāo)準(zhǔn)線程庫(kù),用來提供在各個(gè)滿足POSIX標(biāo)準(zhǔn)的系統(tǒng)中可方便移植的通用線程庫(kù)接口。該線程庫(kù)主要提供了線程創(chuàng)建,銷毀等線程管理的功能,使用該庫(kù)接口函數(shù)編寫的多線程程序,可以在任何其他的POSIX操作系統(tǒng)上編譯執(zhí)行。在該庫(kù)的實(shí)現(xiàn)中,為了實(shí)現(xiàn)信號(hào)處理、線程創(chuàng)建和進(jìn)程管理中其他部分的正確語義,引入了管理線程的概念。管理線程對(duì)用戶透明,從層次上看,它位于主線程和用戶創(chuàng)建的子線程之間。從用戶角度來看,線程的層次結(jié)構(gòu)是主線程一一子線程的二層模式,但從系統(tǒng)角度來看,實(shí)際上已轉(zhuǎn)化為主線程一一管理線程一一子線程的三層模式。管理線程不執(zhí)行用戶代碼,只是集中處理來自其他線程(包括主線程)的創(chuàng)建線程、請(qǐng)求退出等請(qǐng)求,擔(dān)負(fù)著整個(gè)進(jìn)程管理的重大職責(zé)。由于實(shí)現(xiàn)方面的種種原因,使管理線程的權(quán)力過高,同時(shí)又不受任何其他進(jìn)程監(jiān)管,這便導(dǎo)致了目前POSIX線程庫(kù)的如下缺陷一旦管理線程異常(ZOMBIE),所在進(jìn)程的所有工作可能也會(huì)中止,但是整個(gè)系統(tǒng)卻渾然不知。如果在產(chǎn)品中出現(xiàn)這種情況,必將會(huì)影響到用戶的正常使用。
發(fā)明內(nèi)容本發(fā)明所解決的技術(shù)問題是提供一種管理線程異常的防護(hù)方法,能夠在POSIX線程庫(kù)環(huán)境下避免由于管理線程變成ZOMBIE狀態(tài)而引起進(jìn)程異常。本發(fā)明的技術(shù)方案如下管理線程異常的防護(hù)方法包括如下步驟(1)通過狀態(tài)檢測(cè),獲取系統(tǒng)進(jìn)程的狀態(tài)信息,記錄管理線程異常的進(jìn)程名稱;(2)根據(jù)獲取的該進(jìn)程名稱,查找該進(jìn)程名稱對(duì)應(yīng)的進(jìn)程號(hào);(3)清除該進(jìn)程號(hào)對(duì)應(yīng)的線程;(4)創(chuàng)建該進(jìn)程名稱的進(jìn)程。進(jìn)一步,步驟(l)進(jìn)一步包括設(shè)定異常檢測(cè)的定時(shí)時(shí)間間隔。進(jìn)一步,步驟(1)具體為定時(shí)掃描proc目錄下所有進(jìn)程目錄,利用linux系統(tǒng)的proc文件系統(tǒng)對(duì)應(yīng)目錄下的進(jìn)程信息進(jìn)行查詢,記錄所有管理線程狀態(tài)為管理線程異常的進(jìn)程名稱。進(jìn)一步,步驟(1)中,proc目錄下,linux系統(tǒng)的proc文件系統(tǒng)下的stat文件存放著進(jìn)程的狀態(tài)信息,所述管理線程異常的狀態(tài)信息存放在所述stat文件中。進(jìn)一步,步驟(2)中,當(dāng)管理線程異常的進(jìn)程名稱的數(shù)量為一個(gè)以上時(shí),依次查找每個(gè)進(jìn)程名稱的線程的進(jìn)程號(hào);步驟(3)中,依次清除每個(gè)進(jìn)程號(hào)對(duì)應(yīng)的線程;步驟(4)中,依次創(chuàng)建進(jìn)程名稱對(duì)應(yīng)的進(jìn)程。進(jìn)一步包括步驟(5):等待定時(shí)時(shí)間間隔后,進(jìn)行下一輪的檢測(cè)。進(jìn)一步,步驟(l)中,在系統(tǒng)進(jìn)程的當(dāng)前狀態(tài)信息中沒有檢測(cè)到管理線程異常的狀態(tài),則執(zhí)行步驟(5)。進(jìn)一步,步驟U)中,所述proc文件系統(tǒng)的所有信息都會(huì)由內(nèi)核定時(shí)更新。進(jìn)一步,步驟(l)中,定時(shí)時(shí)間間隔的范圍是050秒。本發(fā)明所提供的管理線程異常的防護(hù)方法可以保證1、在用戶指定的定時(shí)間隔內(nèi),可以成功檢測(cè)出所有管理線程變成ZOMBIE狀態(tài)的進(jìn)程。2、對(duì)于檢測(cè)出上述異常的多線程進(jìn)程,可以保證及時(shí)將這些進(jìn)程從異常恢復(fù)過來。本發(fā)明完善了POSIX多線程進(jìn)程的管理,使原來無人監(jiān)管的管理線程得到了監(jiān)控,避免了由于管理線程異常而出現(xiàn)的所在進(jìn)程工作異常,從而影響用戶^f吏用的問題。圖l是本發(fā)明優(yōu)選實(shí)施例的流程圖。具體實(shí)施方式下面參照附圖對(duì)本發(fā)明的優(yōu)選實(shí)施例作詳細(xì)描述。本發(fā)明方法的技術(shù)方案從整體上來說,包括管理線程異常狀態(tài)檢測(cè)和異常后的恢復(fù)兩方面。首先,管理線程異常(ZOMBIE)狀態(tài)的檢測(cè)。參照?qǐng)Dl所示,狀態(tài)的檢測(cè)可以定時(shí)進(jìn)行,定時(shí)間隔可以根據(jù)需要進(jìn)行設(shè)定。查詢進(jìn)程狀態(tài)時(shí),可憑借linux系統(tǒng)自帶的/proc文件系統(tǒng),其下的數(shù)字目錄即為該系統(tǒng)上所有的運(yùn)行進(jìn)程,每個(gè)數(shù)字目錄下還包括一些文件,表示了這個(gè)進(jìn)程的所有相關(guān)信息,其中stat文件存放著進(jìn)程的狀態(tài)信息。由于/proc文件系統(tǒng)的所有信息都會(huì)由內(nèi)核定時(shí)更新,故通過對(duì)/proc中信息的查詢,可以即時(shí)獲得系統(tǒng)中進(jìn)程的當(dāng)前狀態(tài)信息,只需要把狀態(tài)為ZOMBIE的進(jìn)程名稱記錄下來,就完成了狀態(tài);險(xiǎn)測(cè)的過程。其次,異常(ZOMB正)后的恢復(fù)。異常后的恢復(fù)包括清除原來進(jìn)程和創(chuàng)建新進(jìn)程兩步。在管理線程異常(ZOMBIE)后,由于管理線程層次和作用的特殊性,采用通常的清除主線程的方法是清除不了整個(gè)進(jìn)程的所有線程的。要把進(jìn)程清除干凈,需要根據(jù)獲得的進(jìn)程名稱,在/proc文件系統(tǒng)中依次查找每個(gè)進(jìn)程名稱的所有線程的進(jìn)程號(hào),逐個(gè)清除進(jìn)程號(hào)對(duì)應(yīng)的線程,從而達(dá)到把整個(gè)進(jìn)程清除千凈的目的。接著,再次創(chuàng)建相應(yīng)進(jìn)程,從而將異常的進(jìn)程恢復(fù)。以下結(jié)合一個(gè)例子,對(duì)本發(fā)明涉及的管理線程ZOMBIE狀態(tài)防護(hù)的整個(gè)流程進(jìn)行詳細(xì)的闡述假設(shè)系統(tǒng)運(yùn)行了一段時(shí)間后,系統(tǒng)中有兩個(gè)多線程進(jìn)程的管理線程狀態(tài)先后異常(ZOMBIE)。設(shè)定異常檢測(cè)的定時(shí)間隔為30秒,則在第一個(gè)進(jìn)程管理線程異常后30秒內(nèi)執(zhí)行的第一次進(jìn)程狀態(tài)掃描過程中,將檢測(cè)到有兩個(gè)管理線程處于ZOMBIE狀態(tài),并記錄這兩個(gè)進(jìn)程名稱。假設(shè)這兩個(gè)進(jìn)程名稱為"procl"、"proc2"。再次對(duì)/proc文件系統(tǒng)中的進(jìn)程的當(dāng)前狀態(tài)進(jìn)行查詢,首先查詢名稱為"procl"的所有進(jìn)程號(hào),將會(huì)找到和異常的管理線程屬于同一進(jìn)程的所有線程,將找到的所有線程清除后,則"procl"進(jìn)程清除干凈。然后重新創(chuàng)建"procl"的進(jìn)程,使其恢復(fù)正常執(zhí)行。接著,再處理"proc2"的進(jìn)程。查詢名稱為"proc2,,的所有進(jìn)程號(hào),找到和異常的管理線程屬于同一進(jìn)程的所有進(jìn)程號(hào),將找到的所有線程清除后,則"proc2"進(jìn)程清除干凈。然后重新創(chuàng)建"proc2"的進(jìn)程,使其恢復(fù)正常執(zhí)行。等到兩個(gè)進(jìn)程處理完畢,本次掃描檢測(cè)和恢復(fù)過程結(jié)束,將等待30秒進(jìn)行下一輪的監(jiān)測(cè)。假設(shè)系統(tǒng)運(yùn)行了一段時(shí)間后,系統(tǒng)中發(fā)現(xiàn)多個(gè)管理線程狀態(tài)異常(ZOMB正),則對(duì)多個(gè)進(jìn)程名稱對(duì)應(yīng)的進(jìn)程依次進(jìn)行記錄、清除和恢復(fù),從而將異常的進(jìn)程恢復(fù)。權(quán)利要求1、一種管理線程異常的防護(hù)方法,包括如下步驟(1)通過狀態(tài)檢測(cè),獲取系統(tǒng)進(jìn)程的狀態(tài)信息,記錄管理線程異常的進(jìn)程名稱;(2)根據(jù)獲取的該進(jìn)程名稱,查找該進(jìn)程名稱對(duì)應(yīng)的進(jìn)程號(hào);(3)清除該進(jìn)程號(hào)對(duì)應(yīng)的線程;(4)創(chuàng)建該進(jìn)程名稱的進(jìn)程。2、根據(jù)權(quán)利要求1所述的管理線程異常的防護(hù)方法,其特征在于,步驟(l)進(jìn)一步包括設(shè)定異常檢測(cè)的定時(shí)時(shí)間間隔。3、根據(jù)權(quán)利要求2所述的管理線程異常的防護(hù)方法,其特征在于,步驟(1)具體為定時(shí)掃描proc目錄下所有進(jìn)程目錄,利用linux系統(tǒng)的proc文件系統(tǒng)對(duì)應(yīng)目錄下的進(jìn)程信息進(jìn)行查詢,記錄所有管理線程狀態(tài)為管理線程異常的進(jìn)程名稱。4、根據(jù)權(quán)利要求3所述的管理線程異常的防護(hù)方法,其特征在于,步驟(1)中,proc目錄下,linux系統(tǒng)的proc文件系統(tǒng)下的stat文件存放著進(jìn)程的狀態(tài)信息,所述管理線程異常的狀態(tài)信息存放在所述stat文件中。5、根據(jù)權(quán)利要求1所述的管理線程異常的防護(hù)方法,其特征在于,步驟(2)中,當(dāng)管理線程異常的進(jìn)程名稱的數(shù)量為一個(gè)以上時(shí),依次查找每個(gè)進(jìn)程名稱的線程的進(jìn)程號(hào);步驟(3)中,依次清除每個(gè)進(jìn)程號(hào)對(duì)應(yīng)的線程;步驟(4)中,依次創(chuàng)建進(jìn)程名稱對(duì)應(yīng)的進(jìn)程。6、根據(jù)權(quán)利要求2所述的管理線程異常的防護(hù)方法,其特征在于,進(jìn)一步包括步驟(5):等待定時(shí)時(shí)間間隔后,進(jìn)行下一輪的檢測(cè)。7、根據(jù)權(quán)利要求6所述的管理線程異常的防護(hù)方法,其特征在于,步驟(l)中,在系統(tǒng)進(jìn)程的當(dāng)前狀態(tài)信息中沒有檢測(cè)到管理線程異常的狀態(tài),則執(zhí)行步驟(5)。8、根據(jù)權(quán)利要求3所述的管理線程異常的防護(hù)方法,其特征在于,步驟(l)中,所速proc文件系統(tǒng)的所有信息都會(huì)由內(nèi)核定時(shí)更新。9、根據(jù)權(quán)利要求2所述的管理線程異常的防護(hù)方法,其特征在于,步驟U)中,定時(shí)時(shí)間間隔的范圍是050秒。全文摘要本發(fā)明公開了一種管理線程異常的防護(hù)方法,包括如下步驟獲取系統(tǒng)進(jìn)程的狀態(tài)信息,記錄管理線程異常的進(jìn)程名稱;根據(jù)獲取的該進(jìn)程名稱,查找該進(jìn)程名稱對(duì)應(yīng)的進(jìn)程號(hào);清除該進(jìn)程號(hào)對(duì)應(yīng)的線程;創(chuàng)建該進(jìn)程名稱的進(jìn)程。本發(fā)明完善了POSIX多線程進(jìn)程的管理,使原來無人監(jiān)管的管理線程得到了監(jiān)控,避免了由于管理線程異常而出現(xiàn)的所在進(jìn)程工作異常,從而影響用戶使用的問題。文檔編號(hào)G06F9/46GK101114252SQ200610099269公開日2008年1月30日申請(qǐng)日期2006年7月25日優(yōu)先權(quán)日2006年7月25日發(fā)明者毛堅(jiān)桓申請(qǐng)人:中興通訊股份有限公司