專利名稱:用于處理數(shù)據(jù)處理系統(tǒng)中的線程的方法和裝置的制作方法
技術(shù)領(lǐng)域:
本發(fā)明一般涉及一種改進(jìn)的數(shù)據(jù)處理系統(tǒng),更具體地說,涉及用于管理數(shù)據(jù)處理系統(tǒng)中的線程的方法和裝置。
背景技術(shù):
線程是中央處理單元(CPU)利用的基本單位。線程通常具有程序計數(shù)器、寄存器組和堆棧空間。一個線程和其它的線程共用其代碼部分、數(shù)據(jù)部分和操作系統(tǒng)資源,例如打開的文件和信號。這些組件也被稱為“任務(wù)”。一些系統(tǒng)在用戶級的庫中實(shí)現(xiàn)用戶線程,而不通過系統(tǒng)調(diào)用,從而線程轉(zhuǎn)換不需要調(diào)用操作系統(tǒng)并對內(nèi)核產(chǎn)生中斷。
在許多方面,線程用和進(jìn)程相同的方式操作。線程可以處于幾個狀態(tài)之一就緒、阻塞、睡眠、運(yùn)行或終止。在用戶空間中的用戶線程由內(nèi)核中的內(nèi)核線程運(yùn)行。內(nèi)核線程也被稱為“虛擬處理器”。在一些情況下,使用一對一的模型,其中每個用戶線程具有一個相應(yīng)的內(nèi)核線程。在其它的情況下,使用M:N模型,其中許多用戶線程在少數(shù)內(nèi)核線程上運(yùn)行,以便提高性能。對于這個模型,會發(fā)生一些情況,例如在一個互斥體上阻塞,其中不再需要內(nèi)核線程來運(yùn)行特定的用戶線程?;コ怏w是一種加鎖機(jī)制,其涉及對用于抓取和釋放對象的編程標(biāo)記的使用。當(dāng)不能被共享的數(shù)據(jù)被獲得,或者不能被在系統(tǒng)中的其它位置同時進(jìn)行的處理被開始時,互斥體被設(shè)置為“鎖定”,這阻塞了使用它的其它企圖。當(dāng)不再需要該數(shù)據(jù)或者該例程被完成時,互斥體被設(shè)置為“非鎖定”。如果沒有其它的用戶線程是當(dāng)前可運(yùn)行的,則這個內(nèi)核線程將使其自己從那個特定的用戶線程分離開并進(jìn)入睡眠狀態(tài)。
內(nèi)核線程的分離以便進(jìn)入睡眠狀態(tài)引起若干個動作發(fā)生。發(fā)生的一個動作是,內(nèi)核線程從用戶堆棧轉(zhuǎn)換到其自己的較小的堆棧。此外,內(nèi)核線程設(shè)置信號屏蔽,以便阻塞大部分信號。當(dāng)該內(nèi)核線程被再次需要時,這個線程將轉(zhuǎn)換到用戶線程的堆棧,并設(shè)置多個線程特定的屬性,例如信號屏蔽。
本發(fā)明認(rèn)識到,這個當(dāng)前使用的分離和隨后的再附加機(jī)制涉及大的性能開銷。每個分離或再附加需要系統(tǒng)調(diào)用,以便把數(shù)據(jù)從用戶空間復(fù)制到內(nèi)核空間或者從內(nèi)核空間復(fù)制到用戶空間。此外,數(shù)個鎖被在內(nèi)核庫和內(nèi)核兩者中使用,導(dǎo)致可能增加的鎖爭用。這種類型的分離還涉及潛在的信號處理問題。具體地說,在內(nèi)核線程阻塞信號之前會出現(xiàn)一個小的窗口,其中內(nèi)核線程在執(zhí)行于其小的內(nèi)核堆棧上時可能會接收到一個信號。本發(fā)明還認(rèn)識到在較大的用戶線程堆棧上很好地運(yùn)行的信號處理器可能使較小的內(nèi)核線程堆棧溢出,從而破壞存儲器和/或使應(yīng)用程序進(jìn)行核心轉(zhuǎn)儲(core dump)。
性能開銷和堆棧溢出這兩個問題是單獨(dú)的問題,但是具有相似的根本原因。這個原因便是“空閑”內(nèi)核線程的分離。因此,具有一種改進(jìn)的方法、設(shè)備以及計算機(jī)指令,用于以減小性能開銷并避免堆棧溢出的方式處理空閑的內(nèi)核線程將是有利的。
發(fā)明內(nèi)容
本發(fā)明提供一種用于管理線程的方法、設(shè)備和計算機(jī)指令。一個與用戶線程相關(guān)聯(lián)的內(nèi)核線程被檢測為不被該用戶線程需要。所述內(nèi)核線程被半分離,其中用于該線程的數(shù)據(jù)不改變堆棧以響應(yīng)該內(nèi)核線程不被需要。
優(yōu)選地,該內(nèi)核線程被放置在一個半分離表上,并與用戶線程同時處于不能運(yùn)行的狀態(tài)。
優(yōu)選地,當(dāng)用戶線程從睡眠中醒來時,該內(nèi)核線程被從半分離表中刪除,使得不需要被再附加到用戶線程。
優(yōu)選地,線程在AIX操作系統(tǒng)中執(zhí)行。
優(yōu)選地,用于內(nèi)核線程的數(shù)據(jù)保留在用戶堆棧上,而不需要把數(shù)據(jù)復(fù)制到內(nèi)核堆棧以便半分離內(nèi)核線程。
優(yōu)選地,使用一個庫進(jìn)行對內(nèi)核線程不被需要的檢測和半分離內(nèi)核線程。
優(yōu)選地,當(dāng)用戶線程從睡眠狀態(tài)醒來時,確定第二內(nèi)核線程是否被分離而不是半分離,并且如果第二內(nèi)核線程被分離,其被附加到該用戶線程上。
優(yōu)選地,所述不能運(yùn)行的狀態(tài)是等待狀態(tài)或睡眠狀態(tài)之一。
按照另一個方面,本發(fā)明提供一種用于管理線程的數(shù)據(jù)處理系統(tǒng),所述數(shù)據(jù)處理系統(tǒng)包括總線系統(tǒng);和所述總線系統(tǒng)相連的通信單元;和所述總線系統(tǒng)相連的存儲器,其中所述存儲器包括一組指令;以及和所述總線系統(tǒng)相連的處理單元,其中所述處理單元執(zhí)行所述一組指令,以便檢測和用戶線程相關(guān)聯(lián)的不被該用戶線程需要的內(nèi)核線程;并且半分離所述內(nèi)核線程,其中用于所述線程的數(shù)據(jù)不改變堆棧以響應(yīng)該內(nèi)核線程不被需要。
如附圖所示,下面僅以舉例方式參照本發(fā)明的優(yōu)選實(shí)施例說明本發(fā)明其中圖1表示一種數(shù)據(jù)處理系統(tǒng),其中可以按照本發(fā)明的優(yōu)選實(shí)施例實(shí)施本發(fā)明;圖2是可以實(shí)施本發(fā)明的數(shù)據(jù)處理系統(tǒng)的方框圖;圖3是表示在處理內(nèi)核線程中使用的組件的示意圖;圖4A-4C是在半分離表中使用的數(shù)據(jù)結(jié)構(gòu)的示例;圖5是用于處理阻塞調(diào)用的已知的方法的流程圖;圖6是用于管理空閑線程的方法的流程圖;圖7是用于喚醒內(nèi)核線程的已知的方法的流程圖;以及圖8是用于處理內(nèi)核線程的方法的流程圖。
具體實(shí)施例方式
現(xiàn)在參看附圖,特別參看圖1,給出了按照本發(fā)明的優(yōu)選實(shí)施例可以實(shí)施本發(fā)明的數(shù)據(jù)處理系統(tǒng)的圖示表示。所示的計算機(jī)100包括系統(tǒng)單元102、視頻顯示終端104、鍵盤106、存儲裝置108,存儲裝置108可以包括軟盤驅(qū)動器和其它類型的永久的和可移動的存儲介質(zhì)、以及鼠標(biāo)110。計算機(jī)100可以包括附加的輸入裝置,諸如例如游戲桿、觸摸墊、觸摸屏、軌跡球、麥克風(fēng)等。計算機(jī)100可以使用任何適合的計算機(jī)來實(shí)現(xiàn),例如IBM eServer計算機(jī)或者IntelliStation計算機(jī),它們是位于紐約,阿蒙克的國際商業(yè)機(jī)器公司的產(chǎn)品。雖然給出的圖示給出了一種計算機(jī),但是本發(fā)明的其它實(shí)施例可以用其它類型的數(shù)據(jù)處理系統(tǒng)例如網(wǎng)絡(luò)計算機(jī)來實(shí)施。計算機(jī)100優(yōu)選地包括圖形用戶接口(GUI),其可以借助于駐留在運(yùn)行于計算機(jī)100內(nèi)的計算機(jī)可讀的介質(zhì)中的系統(tǒng)軟件來實(shí)現(xiàn)。
現(xiàn)在參見圖2,示出了本發(fā)明可以被實(shí)現(xiàn)于其內(nèi)的數(shù)據(jù)處理系統(tǒng)的方框圖。數(shù)據(jù)處理系統(tǒng)200是計算機(jī)例如圖1的計算機(jī)100的一個例子,實(shí)現(xiàn)本發(fā)明的處理的代碼或指令可以位于其上。數(shù)據(jù)處理系統(tǒng)200使用外圍組件互連(PCI)局部總線體系結(jié)構(gòu)。雖然所示的例子使用PCI總線,其它的總線體系結(jié)構(gòu)例如加速圖形端口(AGP)和工業(yè)標(biāo)準(zhǔn)結(jié)構(gòu)(ISA)也可被使用。處理器202和主存儲器204通過PCI橋208和PCI局部總線206相連。PCI橋208還可以包括用于處理器202的集成的存儲器控制器和高速緩沖存儲器。在所示的例子中,局域網(wǎng)(LAN)適配器210、小型計算機(jī)接口SCSI主機(jī)總線適配器212、以及擴(kuò)展總線接口214通過直接組件連接和PCI局部總線206相連。與此相反,音頻適配器216、圖形適配器218、以及音頻/視頻適配器219通過被插入擴(kuò)展槽中的內(nèi)插板卡和PCI總線206相連。擴(kuò)展總線接口214提供用于鍵盤以及鼠標(biāo)適配器220、調(diào)制解調(diào)器222以及附加存儲器224的連接。SCSI主機(jī)總線適配器212提供了用于硬盤驅(qū)動器226、磁帶驅(qū)動器228以及CD-ROM驅(qū)動器230的連接。典型的PCI局部總線實(shí)現(xiàn)支持3個或4個PCI擴(kuò)展槽或內(nèi)插連接器。
一個操作系統(tǒng)在處理器202上運(yùn)行并被用于協(xié)調(diào)和提供對圖2中的數(shù)據(jù)處理系統(tǒng)200內(nèi)的各種組件的控制。該操作系統(tǒng)可以是市場上可得到的操作系統(tǒng),例如高級交互執(zhí)行體(AIX)或Windows XP。AIX是UNIX的一個版本,并且可以從國際商業(yè)機(jī)器公司得到。Windows XP可以從微軟公司得到。用于操作系統(tǒng)和應(yīng)用的指令或程序被設(shè)置在存儲裝置例如硬盤驅(qū)動器226上,并可被裝入主存儲器204中,以便由處理器202執(zhí)行。
本領(lǐng)域的普通技術(shù)人員應(yīng)當(dāng)理解,圖2中的硬件可以根據(jù)實(shí)施方案而改變。除了圖2所示的硬件之外或代替圖2所示的硬件,也可以使用其它的內(nèi)部硬件或外圍設(shè)備,例如閃速只讀存儲器(ROM)、等同的非易失性存儲器、或光盤驅(qū)動器等。此外,本發(fā)明的處理可以應(yīng)用于多處理器數(shù)據(jù)處理系統(tǒng)。
例如,數(shù)據(jù)處理系統(tǒng)200,如果可選擇地被配置為網(wǎng)絡(luò)計算機(jī),可以不包括SCSI主機(jī)總線適配器212、硬盤驅(qū)動器226、磁帶驅(qū)動器228以及CD-ROM驅(qū)動器230。在這種情況下,計算機(jī),其被恰當(dāng)?shù)胤Q為客戶計算機(jī),包括某種類型的網(wǎng)絡(luò)通信接口,例如LAN適配器210、調(diào)制解調(diào)器222或其類似物。作為另一個例子,數(shù)據(jù)處理系統(tǒng)200可以是一種獨(dú)立的系統(tǒng),其被配置為不依賴于某些類型的網(wǎng)絡(luò)通信接口就可以啟動,不論數(shù)據(jù)處理系統(tǒng)200是否包括某些類型的網(wǎng)絡(luò)通信接口。作為另一個例子,數(shù)據(jù)處理系統(tǒng)200可以是個人數(shù)字助理(PDA),其配置有ROM和/或閃速ROM,用于提供用于存儲操作系統(tǒng)文件和/或用戶產(chǎn)生的數(shù)據(jù)的非易失性存儲器。
圖2所示的例子和上述的例子不意味著體系結(jié)構(gòu)上的限制。例如,除了采取PDA的形式之外,數(shù)據(jù)處理系統(tǒng)200還可以是筆記本計算機(jī)或手持計算機(jī)。數(shù)據(jù)處理系統(tǒng)200還可以是信息站或Web設(shè)備。
本發(fā)明的處理由使用計算機(jī)執(zhí)行的指令的處理器來執(zhí)行,所述指令可以位于存儲器例如主存儲器204、存儲器224或一個或幾個外圍設(shè)備226-230中。
現(xiàn)在參看圖3,一個按照本發(fā)明的優(yōu)選實(shí)施例示出了在處理內(nèi)核線程中使用的組件的示意圖。在這個例子中,用戶線程300、302、304、306和308位于用戶空間310內(nèi),而內(nèi)核線程312、314和316位于內(nèi)核空間318內(nèi)。這個例子中的這些線程遵從M:N模型,其中許多用戶線程在少數(shù)內(nèi)核線程上運(yùn)行,以便提高性能。
當(dāng)前,用戶線程300正在由內(nèi)核線程312運(yùn)行,用戶線程304正在由內(nèi)核線程314運(yùn)行,用戶線程306正在由內(nèi)核線程316運(yùn)行。對這些用戶線程執(zhí)行的操作位于用戶線程堆棧320內(nèi)。每個用戶線程和一個用戶線程堆棧相關(guān)聯(lián)。內(nèi)核線程312,314和316具有位于用戶線程堆棧320中的數(shù)據(jù)。用戶線程堆棧320內(nèi)的特定堆棧是和正由內(nèi)核線程運(yùn)行的用戶線程相關(guān)聯(lián)的堆棧。
一般地說,如果內(nèi)核線程例如內(nèi)核線程312對于運(yùn)行用戶線程例如用戶線程300來說不再被需要,則內(nèi)核線程312將分離其自身,并和用戶線程300一道進(jìn)入睡眠狀態(tài)。在睡眠狀態(tài)下的內(nèi)核線程一般被置于分離表322內(nèi),所述分離表由Pthread庫324管理。Pthread庫324是一個可動態(tài)加載的庫,其被用于AIX中。隨著從用戶線程300分離,用于內(nèi)核線程312的信息,所述信息表示當(dāng)前堆棧指針,該指針指向用戶線程堆棧320內(nèi)的用戶線程堆棧,被修改為指向?yàn)樗膬?nèi)核線程在內(nèi)核線程堆棧326中保留的區(qū)域。當(dāng)用戶線程300從睡眠狀態(tài)醒來時,內(nèi)核線程312可以被從分離表322中刪除,并再附加到用戶線程300??商鎿Q地,如果內(nèi)核線程312為不可得到的,則可以將分離表322中的另一個可以得到的內(nèi)核線程附加到用戶線程300。
按照本發(fā)明的優(yōu)選實(shí)施例,當(dāng)用戶線程300進(jìn)入不需要內(nèi)核線程312的狀態(tài)例如睡眠狀態(tài)時,借助于Pthread庫324,內(nèi)核線程312被置于半分離表328中,而不被置于分離表322中。對于半分離,內(nèi)核線程312不改變其堆棧或信號屏蔽。而是,內(nèi)核線程312被置于半分離表328上,并和用戶線程300同時睡眠。在這個同時睡眠狀態(tài)下,內(nèi)核線程312保持諸如和其同時睡眠的用戶線程的堆棧和信號屏蔽的信息。這個信息也被稱為“用戶線程特定屬性”。以這種同時睡眠,內(nèi)核線程312把自身識別為可用于運(yùn)行其它的用戶線程,但是最好是首先使用分離表322上的一個線程。優(yōu)先選擇被給予運(yùn)行和內(nèi)核線程312相關(guān)聯(lián)的用戶線程,即用戶線程300。根據(jù)特定的實(shí)施方案,半分離表328可以用不同的方式來實(shí)現(xiàn)。在這個例子中,這個表被實(shí)現(xiàn)為線程結(jié)構(gòu)的鏈接的內(nèi)核。
如果用戶線程300從睡眠狀態(tài)醒來,內(nèi)核線程312將把自身從半分離表328中刪除,并繼續(xù)運(yùn)行用戶線程300。這種機(jī)制提供一個途經(jīng),其中喚醒Pthread庫324中的一個線程只涉及較低的等待時間。當(dāng)從被爭奪的互斥體、條件變量或信號醒來時,這種機(jī)制是有用的,因?yàn)楦S這些事件而執(zhí)行的動作通常必須在程序的其余部分可以進(jìn)行之前被完成。
如果在后來的時間需要半分離表328中的內(nèi)核線程來運(yùn)行另外的用戶線程,則借助于從當(dāng)前用戶線程的狀態(tài)分離到新的用戶線程的狀態(tài)的而不分離內(nèi)核線程,可以避免因保持分離而導(dǎo)致的性能處罰。例如,如果內(nèi)核線程312在半分離表328上,并且另一個用戶線程例如用戶線程302需要內(nèi)核線程312以運(yùn)行該線程,通過將用戶線程300的堆棧內(nèi)的屬性改變?yōu)楹陀脩艟€程302的那些屬性匹配,和用戶線程300相關(guān)聯(lián)的堆??杀桓郊拥接脩艟€程302。例如,堆棧指針和信號屏蔽可以被從用于用戶線程300的堆棧指針和信號屏蔽改變?yōu)橛糜谟脩艟€程302的堆棧指針和信號屏蔽。
結(jié)果,只有當(dāng)和內(nèi)核線程相關(guān)聯(lián)的用戶線程退出或結(jié)束時,該內(nèi)核線程才完全分離。因而,在大多數(shù)情況下,避免了和通常的分離相關(guān)聯(lián)的性能開銷。
參見圖4A-4C,其中按照本發(fā)明的優(yōu)選實(shí)施例示出了在半分離表中使用的數(shù)據(jù)結(jié)構(gòu)。這些數(shù)據(jù)結(jié)構(gòu)可用于實(shí)現(xiàn)半分離表,諸如圖3中的半分離表328。
在圖4A中,使用鏈接表指向不同的內(nèi)核線程。例如,表項(xiàng)400和402被用于指向不同的內(nèi)核線程。表頭標(biāo)記406標(biāo)識著鏈接表的開始。表項(xiàng)400包含前一個指針408和下一個指針410。表項(xiàng)402包含前一個指針412和下一個指針414。這些指針用于指向鏈接表內(nèi)的前一個表項(xiàng)和下一個表項(xiàng)。此外,表項(xiàng)400包括指針416,表項(xiàng)402包括指針418,這些指針指向內(nèi)核線程,諸如內(nèi)核線程420和422。
接著,在圖4B中,在表結(jié)構(gòu)中使用的信息被合并在線程結(jié)構(gòu)中。在這個例子中,表頭標(biāo)記430指向開頭,或第一個線程,內(nèi)核線程432。內(nèi)核線程432包括有下一個指針434,指針434指向內(nèi)核線程436。內(nèi)核線程432還包括前一個指針438,指針438指向表中的某個前面的內(nèi)核線程。內(nèi)核線程436包括前一個指針440,指針440指回內(nèi)核線程432。內(nèi)核線程436中的下一個指針442指向表中的下一個內(nèi)核線程。這個例子是給出的例子中的一種優(yōu)選的表結(jié)構(gòu)。
在圖4C中,使用數(shù)組450指向不同的內(nèi)核線程。表頭標(biāo)記452指向數(shù)組450的開始,數(shù)組450包括指針454,456和458。這些指針分別指向內(nèi)核線程460,462和464。提供這些例子僅僅用于說明可以如何實(shí)現(xiàn)半分離表。根據(jù)特定的實(shí)現(xiàn)方案,其它類型的結(jié)構(gòu),例如樹,也可以被使用。
現(xiàn)在參看圖5,給出了用于處理阻塞調(diào)用的已知方法的流程圖。圖5中所示的方法可以被實(shí)現(xiàn)在一個庫中,例如圖3中的Pthread庫324。阻塞調(diào)用是可以引起用戶級的線程從運(yùn)行或可運(yùn)行狀態(tài)改變到等待狀態(tài)或睡眠狀態(tài)的另一狀態(tài)的任何調(diào)用。
該方法以檢測潛在阻塞調(diào)用開始(步驟500)。該方法從用戶線程分離內(nèi)核線程(步驟502)。步驟502需要從用戶線程堆棧向內(nèi)核線程堆棧復(fù)制信息以及其它的操作的開銷,所述的其它的操作諸如將信號屏蔽改變?yōu)樽枞盘?。接著,該方法查找新的用戶線程以便運(yùn)行(步驟504)。如果發(fā)現(xiàn)可運(yùn)行的線程,則該內(nèi)核線程被附加到該新的用戶線程(步驟506)。步驟506涉及這樣的開銷,諸如從內(nèi)核線程堆棧向用戶線程堆棧復(fù)制數(shù)據(jù)以及設(shè)置信號屏蔽。新的用戶線程被運(yùn)行(步驟508),此后該方法結(jié)束。
再次參看步驟504,如果沒有可運(yùn)行的線程,內(nèi)核線程便被置于分離表上,并成為睡眠狀態(tài)(步驟510)。此后,該方法等待,以便檢測成為可運(yùn)行的用戶線程(步驟512)。此后,內(nèi)核線程被附加到作為可運(yùn)行的用戶線程被檢測到的用戶線程(步驟514)。然后,該用戶線程由內(nèi)核線程運(yùn)行(步驟516),此后,該方法結(jié)束。
現(xiàn)在參見圖6,按照本發(fā)明的優(yōu)選實(shí)施例示出了用于管理空閑線程的方法的流程圖。圖6所示的方法可以在庫中實(shí)現(xiàn),例如圖3所示的Pthread庫324。
該方法從檢測潛在的阻塞調(diào)用開始(步600)。這種潛在的阻塞調(diào)用是一種把用戶級線程置于等待或睡眠狀態(tài)的調(diào)用。正在睡眠或者正在等待的線程被稱為“不可運(yùn)行的”線程。然后該方法尋找新的用戶線程以便運(yùn)行(步驟602)。如果發(fā)現(xiàn)了可運(yùn)行的用戶線程,該方法將內(nèi)核線程轉(zhuǎn)換到該新的用戶線程(步驟604)。步驟604的轉(zhuǎn)換可以通過使用用戶級調(diào)度器來實(shí)現(xiàn)。根據(jù)特定的實(shí)施方案,這個轉(zhuǎn)換可能需要或者不需要內(nèi)核線程的分離和再附加。用戶線程由該內(nèi)核線程運(yùn)行(步驟606),此后該方法結(jié)束。
再次回到步驟602,如果沒有發(fā)現(xiàn)可運(yùn)行的用戶線程,內(nèi)核線程被置于半分離的睡眠狀態(tài)(步驟608)。在這種類型的睡眠中,內(nèi)核線程被置于半分離表上,然后進(jìn)入睡眠狀態(tài)。和該內(nèi)核線程相關(guān)聯(lián)的用戶線程與該內(nèi)核線程一起被保持或被列于半分離表中。進(jìn)行這種關(guān)聯(lián)以便指出優(yōu)先使用這個特定的內(nèi)核線程來運(yùn)行該用戶線程,而不是運(yùn)行另一個用戶線程,除非必需這樣做。
此后,對一個事件進(jìn)行檢測和處理(步驟610)。如果該事件是與該內(nèi)核線程相關(guān)聯(lián)的用戶線程成為是可運(yùn)行的,則該用戶線程由該內(nèi)核線程運(yùn)行(步驟612),此后該方法結(jié)束。再次參看步驟610,如果和該內(nèi)核線程相關(guān)聯(lián)的用戶線程退出或者不需要該內(nèi)核線程,則該內(nèi)核線程被置于分離表上并進(jìn)入睡眠狀態(tài)(步驟614),此后該方法結(jié)束。更具體地說,步驟614進(jìn)入圖5所示的以步驟510開始的一系列的步驟。
返回步驟610,如果事件是任何其它的事件,則該方法查找用戶線程以便運(yùn)行(步驟616)。如果未找到可運(yùn)行的線程,則該方法返回步驟608。否則,如果另一個用戶線程成為可運(yùn)行的,則該方法把該內(nèi)核線程轉(zhuǎn)換到成為可運(yùn)行的那個用戶線程(步驟618)。這個步驟可以包括兩個操作,即分離和附加。可替換地,可以使用把內(nèi)核線程從當(dāng)前的用戶線程轉(zhuǎn)換到新的用戶線程的單個的操作。然后用戶線程以內(nèi)核線程運(yùn)行(步驟620),然后該方法結(jié)束。
現(xiàn)在參見圖7,其中示出了用于喚醒內(nèi)核線程的已知方法的流程圖。圖7所示的方法可以在一個庫中實(shí)現(xiàn),例如圖3所示的Pthread庫324。在本圖中所示的方法允許線程等待或睡眠,直到一個用戶線程被檢測為是可運(yùn)行的。
該方法由檢查用于內(nèi)核線程的分離表開始(步驟700)。如果分離表不是空的,則從分離表中刪除一個內(nèi)核線程(步驟702)。該內(nèi)核線程被喚醒(步驟704),此后該方法結(jié)束。再次參看步驟700,如果分離表是空的,則該方法結(jié)束。
現(xiàn)在轉(zhuǎn)向圖8,示出了按照本發(fā)明的優(yōu)選實(shí)施例用于處理內(nèi)核線程的流程圖。圖8中所示的方法可以在一個庫中實(shí)現(xiàn),例如圖3中的Pthread庫324。該方法在一個使另一個內(nèi)核線程成為可運(yùn)行的內(nèi)核線程中啟動。
該方法以檢查用于內(nèi)核線程的分離表開始(步驟800)。如果分離表是空的,該方法便檢查用于內(nèi)核線程的半分離表(步驟802)。如果半分離表是空的,則該方法結(jié)束。否則,如果半分離表不是空的,則從半分離表中刪除一個內(nèi)核線程(步驟804)。從半分離表中被刪除的這個內(nèi)核線程被喚醒(步驟806),此后該方法結(jié)束。而后,該內(nèi)核線程運(yùn)行。
再次參看步驟800,如果分離表不是空的,則從分離表中刪除一個內(nèi)核線程(步驟808)。該內(nèi)核線程被喚醒(步驟810),此后該方法結(jié)束。本發(fā)明的機(jī)制仍然使用分離表,因?yàn)榉蛛x而不是半分離在某些情況下可能是需要的。這個表對于已有的用戶線程可能是需要的。在這種情況下,當(dāng)喚醒用戶線程時,從分離表中選擇內(nèi)核線程優(yōu)先于從半分離表中選擇內(nèi)核線程。
因而,本發(fā)明提供一種用于管理空閑的內(nèi)核線程的改進(jìn)的方法、設(shè)備和計算機(jī)指令。本發(fā)明的機(jī)制避免了當(dāng)前內(nèi)核線程分離和隨后再附加所涉及的開銷。此外,本發(fā)明的機(jī)制還避免了可能發(fā)生的堆棧溢出。這些優(yōu)點(diǎn)是通過使用半分離方法提供的。這個方法涉及把內(nèi)核線程置于半分離表中,并且然后將內(nèi)核線程置于睡眠狀態(tài)。執(zhí)行這些步驟不需要在使內(nèi)核線程和用戶線程分離時一般所需的那些步驟。
重要的是注意到,雖然在一個功能完全的數(shù)據(jù)處理系統(tǒng)的環(huán)境下說明了本發(fā)明,本領(lǐng)域的普通技術(shù)人員應(yīng)當(dāng)理解,本發(fā)明的方法能夠以指令的計算機(jī)可讀介質(zhì)的形式以及各種形式發(fā)布,并且,不管實(shí)際上用于進(jìn)行發(fā)布的信號承載介質(zhì)的具體類型是什么本發(fā)明都同樣地適用。計算機(jī)可讀介質(zhì)的例子包括可記錄型的介質(zhì)例如軟盤、硬盤驅(qū)動器、RAM、CD-ROM、DVD-ROM;以及傳輸型的介質(zhì),例如數(shù)字和模擬通信鏈路、使用諸如例如射頻和光波傳輸?shù)膫鬏斝问降挠芯€或無線通信鏈路。計算機(jī)可讀介質(zhì)可以采取編碼格式的形式,其被解碼以便實(shí)際用于特定的數(shù)據(jù)處理系統(tǒng)中。
權(quán)利要求
1.一種用于在數(shù)據(jù)處理系統(tǒng)中管理線程的方法,包括檢測和一個用戶線程相關(guān)聯(lián)的、不被該用戶線程需要的內(nèi)核線程;以及響應(yīng)內(nèi)核線程不被需要,半分離該內(nèi)核線程,其中用于該線程的數(shù)據(jù)不改變堆棧。
2.如權(quán)利要求1所述的方法,還包括把所述內(nèi)核線程置于一個半分離表中;以及把所述內(nèi)核線程與所述用戶線程同時置于不可運(yùn)行的狀態(tài)。
3.如權(quán)利要求2所述的方法,還包括響應(yīng)所述用戶線程從睡眠中醒來,從半分離表中刪除所述內(nèi)核線程,其中不需要和所述用戶線程的再附加。
4.如權(quán)利要求2所述的方法,還包括響應(yīng)所述用戶線程從睡眠狀態(tài)醒來,確定第二內(nèi)核線程是否被分離而不是半分離;以及響應(yīng)第二內(nèi)核線程被分離,將第二內(nèi)核線程附加到所述用戶線程。
5.如權(quán)利要求2所述的方法,其中不可運(yùn)行的狀態(tài)是等待狀態(tài)或睡眠狀態(tài)之一。
6.一種用于管理線程的數(shù)據(jù)處理系統(tǒng),所述數(shù)據(jù)處理系統(tǒng)包括檢測裝置,用于檢測和一個用戶線程相關(guān)的、不被該用戶線程需要的內(nèi)核線程;以及半分離裝置,用于響應(yīng)所述內(nèi)核線程是不被需要的,半分離所述內(nèi)核線程,其中用于該線程的數(shù)據(jù)不改變堆棧。
7.如權(quán)利要求6所述的數(shù)據(jù)處理系統(tǒng),還包括第一放置裝置,用于把所述內(nèi)核線程置于一個半分離表中;以及第二放置裝置,用于把所述內(nèi)核線程與所述用戶線程同時置于不可運(yùn)行的狀態(tài)。
8.如權(quán)利要求7所述的數(shù)據(jù)處理系統(tǒng),還包括刪除裝置,用于響應(yīng)所述用戶線程從睡眠中醒來,從半分離表中刪除所述內(nèi)核線程,其中不需要和所述用戶線程的再附加。
9.如權(quán)利要求7所述的數(shù)據(jù)處理系統(tǒng),還包括確定裝置,用于響應(yīng)所述用戶線程從睡眠狀態(tài)醒來,確定第二內(nèi)核線程是否被分離而不是半分離;以及附加裝置,用于響應(yīng)第二內(nèi)核線程被分離,將第二內(nèi)核線程附加到所述用戶線程。
10.如權(quán)利要求7所述的方法,其中不可運(yùn)行的狀態(tài)是等待狀態(tài)或睡眠狀態(tài)之一。
11.一種計算機(jī)可讀介質(zhì)中的用于管理線程的計算機(jī)程序產(chǎn)品,所述計算機(jī)程序產(chǎn)品包括用于執(zhí)行權(quán)利要求1到6中任何一個方法的指令。
全文摘要
本發(fā)明披露了一種用于管理線程的方法、設(shè)備和計算機(jī)指令。與一個用戶線程相關(guān)聯(lián)的內(nèi)核線程被檢測為不被該用戶線程需要。該內(nèi)核線程被半分離,其中響應(yīng)該內(nèi)核線程是不被需要的,用于該線程的數(shù)據(jù)不改變堆棧。
文檔編號G06F9/48GK1735865SQ03822194
公開日2006年2月15日 申請日期2003年8月11日 優(yōu)先權(quán)日2002年9月19日
發(fā)明者A·門多薩, J·H·朔普 申請人:國際商業(yè)機(jī)器公司