專利名稱:用于在被爭奪的互斥鎖上被動態(tài)限定的自旋線程的方法與系統(tǒng)的制作方法
技術領域:
本發(fā)明涉及一種改進的數據處理系統(tǒng),更具體地,涉及一種用于多進程協(xié)調的方法與裝置。再具體地講,本發(fā)明提供了一種用于在任務管理或控制過程中使用互斥鎖的進程調度或資源分配的方法與裝置。
背景技術:
現代操作系統(tǒng)支持多道程序,由此看起來在具有單一的中央處理單元(CPU)或者可能在對稱多處理器(SMP)機器中的多個CPU的單一計算設備上有多個程序并發(fā)執(zhí)行。通過同時使用串行化執(zhí)行來達到并發(fā)執(zhí)行,也被稱為“時間分片”設備的操作系統(tǒng)允許多個程序中的一個在某限定時間段(即時間片)內獨占地運行,然后跟隨著多個程序中另一個不同的程序獨占執(zhí)行所使用的時間段。因為在程序之間的切換發(fā)生得很快,所以看起來程序是并發(fā)運行的,雖然實際上它們是串行運行的。當完成對于一個程序的時間片時,該程序被置入掛起或“睡眠”狀態(tài),并且另一程序“蘇醒”并開始運行。
提高單一程序或單一進程的性能的一種方法是將該程序或進程分為指令路徑,經常被稱為“線程”,這些執(zhí)行路徑看起來是并發(fā)執(zhí)行的。這樣的程序或進程一般被稱為“多任務”或“多線程”;操作系統(tǒng)為每個線程提供時間片,在該時間片內其具有對CPU的獨占使用。操作系統(tǒng)一般提供內置的機制用來在并發(fā)程序和/或線程之間以非常迅速與高效的方式進行切換;對于多線程某些類型的CPU提供對操作系統(tǒng)的直接的硬件支持。因為本發(fā)明的思路同樣適用于并發(fā)線程和并發(fā)程序,其可能包括單一線程或多個線程,所以所使用的名詞“線程”可以指非多線程程序或者在多線程環(huán)境下的一個線程。
當線程執(zhí)行時,它們必然需要訪問數據處理系統(tǒng)中的資源,諸如存儲器、數據結構、文件、或其他資源。用來被多個線程共享的資源并且以如下方式共享要保護包含在該資源中或通過該資源傳遞的數據的完整性;作到這一點的一種方式是通過對競爭共享資源的線程的串行化執(zhí)行。當第一線程已經在使用資源時,需要該資源的第二線程必須等待,直至該資源不再被使用,這一般作為第一線程已經成功完成其對該資源的使用的結果而發(fā)生。
操作系統(tǒng)一般提供多種機制來協(xié)調多個線程對共享資源的使用。雖然應用程序開發(fā)者能夠創(chuàng)建其自己的特定機制,以確保對共享資源的串行化訪問,但是應用程序開發(fā)者一般使用由操作系統(tǒng)提供或者在標準軟件庫中提供的機制,以將共享資源的控制邏輯嵌入多個線程之中。使用操作系統(tǒng)特有的機制是有利的,這是因為其允許操作系統(tǒng)將有關對于資源的競爭的信息集成到其時間分片功能之中。因此,操作系統(tǒng)根據其需求及其對資源的競爭分配時間片給線程,而不是通過使用嚴格周期性的時間片。
用來串行化對共享資源的訪問的常用機制是互斥鎖,其為具有兩個狀態(tài)的簡單鎖鎖定與未鎖定。該鎖一般以通過軟件子例程或例程標準庫中的模塊而創(chuàng)建、銷毀、或修改的數據對象或數據結構來實現?;コ怄i可以邏輯地關聯(lián)于共享資源,從而成功鎖定該互斥鎖的線程被稱為互斥鎖的當前所有人;只有占有特定互斥鎖的線程進入訪問與該特定互斥鎖相關聯(lián)的共享資源,并且只有占有該特定互斥鎖的線程解鎖該特定互斥鎖。因此,訪問共享資源的線程內的臨界代碼部分被經鎖定的互斥鎖的調用以及解鎖該同一互斥鎖的調用所包圍。如果線程嘗試鎖定互斥鎖并且失敗,則在其進入訪問該共享資源的臨界代碼部分之前,必須等待直至其能夠鎖定該互斥鎖。如果互斥鎖分配在由協(xié)調的進程所共享的存儲器之內,則互斥鎖可以用來在同一進程內或者跨越多個進程來使多個線程同步。
在不能獲取互斥鎖之后線程等待互斥鎖的方式取決于實現互斥鎖機制的方式。廣泛使用的鎖有三種阻塞鎖(blocking lock)、自旋鎖(spin lock)、以及阻塞鎖與自旋鎖的某種組合類型。如果已經獲取了互斥鎖,并且另一線程請求鎖定該互斥鎖,則實現為阻塞鎖的互斥鎖使該等待線程不再是可運行的或者使其掛起,即進入“睡眠”。相反,自旋鎖不將等待線程置入睡眠。而是等待中的線程執(zhí)行循環(huán),由此反復請求該鎖,直至其被當前擁有該互斥鎖的線程釋放;該循環(huán)可以包括空的迭代循環(huán),即“忙循環(huán)”或“忙等待”,其對一變量進行增量或減量,使得該線程不會馬上重新請求該互斥鎖,而是等待一段時間,該時間取決于迭代循環(huán)的長度。
與阻塞鎖或自旋鎖不同,互斥鎖經常被實現為具有超時退出的自旋鎖,其為組合了阻塞鎖的特點與自旋鎖的特點的鎖。具有超時退出的自旋鎖自旋(spin)一段有限的時間,同時允許線程嘗試再次獲得該鎖;如果該有限的時間段過期了而沒有獲得該鎖,則該線程阻塞。該超時退出的時間段一般通過在忙等待循環(huán)中執(zhí)行固定數目的迭代來控制。除了鎖定例程與解鎖例程之外,軟件庫還經常包含“試鎖”子例程,其中如果未獲取互斥鎖,則控制被返回到請求子例程,即不會強迫請求例程以等待互斥鎖變?yōu)榭捎谩?br> 阻塞與自旋的動作具有其優(yōu)缺點。阻塞迅速地掛起等待線程的執(zhí)行,當時阻塞的動作可能會掛起不久將獲得鎖的線程,并且掛起線程意味著相對不小的費用,例如,必須保存該線程的執(zhí)行上下文。在另一方面,自旋鎖消耗資源,諸如CPU時間與存儲器高速緩存線路,當時如果合理地選擇自旋時間段的長度,則等待線程經常會相對較快地獲得互斥鎖,由此使得自旋操作能夠比阻塞操作消耗較少的計算資源。
在自旋與阻塞之間的選擇取決于許多因素,尤其是線程在設備上執(zhí)行的計算環(huán)境。因此,以下做法是有利的動態(tài)地調整線程在互斥鎖的自旋與阻塞之間選擇的方式。尤其有利的是為線程提供以下能力當線程在被爭奪的互斥鎖的自旋與阻塞之間選擇時,考慮被爭奪的互斥鎖的當前特點。
發(fā)明內容
提供了一種在數據處理系統(tǒng)中管理互斥鎖的方法。對于每個互斥鎖,保持對于正在自旋同時等待獲取互斥鎖的線程的數目的自旋線程計數。如果線程嘗試獲取鎖定的互斥鎖,則根據限制性條件以及在嘗試獲取過程中正在自旋的線程的數目,線程進入自旋狀態(tài)或睡眠狀態(tài)。另外,在已經在互斥鎖上睡眠之后線程在互斥鎖上自旋所需的相對時間長度,可以用來調節(jié)允許在互斥鎖上自旋的線程的數目。
本發(fā)明提供一種在數據處理系統(tǒng)中管理互斥鎖的方法,該方法包括以下步驟保持對于正在互斥鎖上自旋的線程的數目的自旋線程計數值;第一線程嘗試獲取該互斥鎖;以及作為對確定該互斥鎖已經被第二線程獲取的響應,根據所述自旋線程計數值,確定第一線程進入自旋狀態(tài)還是睡眠狀態(tài);其中,如果所述自旋線程計數值小于自旋線程計數門限值,則進入自旋狀態(tài);以及如果所述自旋線程計數值大于或等于自旋線程計數門限值,則進入睡眠狀態(tài)。
本發(fā)明還提供一種用于管理互斥鎖的裝置,包括用于保持對于正在互斥鎖上自旋的線程的數目的自旋線程計數值的部分;用于第一線程嘗試獲取該互斥鎖的部分;用于作為對確定該互斥鎖已經被第二線程獲取的響應,根據所述自旋線程計數值,確定第一線程進入自旋狀態(tài)還是睡眠狀態(tài)的部分;用于如果所述自旋線程計數值小于自旋線程計數門限值,則進入自旋狀態(tài)的部分;以及用于如果所述自旋線程計數值大于或等于自旋線程計數門限值,則進入睡眠狀態(tài)的部分。
被認為是本發(fā)明特性的體現本發(fā)明的新穎性的技術特征在權利要求
中列出。然而,通過參照附圖同時閱讀以下對本發(fā)明優(yōu)選實施方式的描述,可以更好地了解本發(fā)明自身、以及優(yōu)選使用模式、進一步的目標及其優(yōu)點,其中圖1A顯示數據處理系統(tǒng)的一般網絡,每個處理系統(tǒng)都可以實現本發(fā)明;圖1B顯示了可能用于數據處理系統(tǒng)內的一般計算機體系結構,其中可以實現本發(fā)明;圖2A顯示在使用互斥鎖的一般多線程應用程序內的組件的邏輯組成的方框圖;圖2B顯示一般數據處理系統(tǒng)上的組件的邏輯組成的方框圖,該數據處理系統(tǒng)支持執(zhí)行使用由操作系統(tǒng)內核支持的互斥鎖的多線程應用程序;圖3顯示自旋鎖互斥鎖的一般實現;圖4顯示根據本發(fā)明實施方式的、已經被擴展以包括用于支持自適應互斥鎖的信息的互斥鎖數據結構的方框圖;圖5A顯示根據本發(fā)明實施方式的、通過一流程線程能夠鎖定處于解鎖狀態(tài)的互斥鎖同時該線程可能轉移到其他處理的過程的流程圖;圖5B顯示運行塊的流程圖,在該運行塊中可在經鎖定的互斥鎖上自旋的線程的數目由可配置門限值限制;圖5C顯示其中線程在鎖定的互斥鎖上自旋或忙等待的運行塊的流程圖;圖5D顯示運行塊的流程圖,其中線程在經鎖定的互斥鎖上睡眠;圖5E顯示根據本發(fā)明實施方式的運行塊的流程圖,其中當動態(tài)調整對于可以在經鎖定的互斥鎖上自旋的線程數目的限制值時線程可以獲取互斥鎖的;圖6顯示一過程的流程圖,其中線程通過該流程來釋放自適應互斥鎖。
具體實施方式
一般地,可以包括或涉及本發(fā)明的設備包括多種數據處理技術。因此,作為背景,在詳細描述本發(fā)明之前,將描述分布式數據處理系統(tǒng)之內的硬件與軟件組件的一般組成。
現在參照附圖,圖1A顯示數據處理系統(tǒng)的一般網絡,其中的每一個都可以實現本發(fā)明的一部分。分布式數據處理系統(tǒng)100包含網絡101,其為可以用來提供分布式數據處理系統(tǒng)100內連接在一起的各種設備與計算機之間的通信鏈接的介質。網絡101可以包括永久連接,諸如電線或光纖電纜,或者通過電話或無線通信進行的暫時連接。在所示例子中,服務器102與服務器103與存儲單元104一起連接到網絡101。另外,客戶端105-107也連接到網絡101。客戶端105-107以及服務器102-103可以由各種計算設備代表,諸如大型機、個人計算機、個人數字助理(PDA)等等。分布式數據處理系統(tǒng)100可以包括未顯示的其他服務器、客戶端、路由器、其他設備、以及對等體系結構。
在所示例子中,分布式數據處理系統(tǒng)100可以包括具有網絡101的因特網,代表使用各種協(xié)議以相互通信的網絡與網關的世界范圍集合,諸如輕量目錄訪問協(xié)議(LDAP)、傳輸控制協(xié)議/互連網協(xié)議(TCP/IP)、超文本傳輸協(xié)議(HTTP)、無線應用協(xié)議(WAP)等等。當然,分布式數據處理系統(tǒng)100也可以包括多個不同類型的網絡,諸如(例如)內部網、局域網(LAN)、或廣域網(WAN)。例如,服務器102直接支持客戶端109與網絡110,其包含了無線通信鏈接。有網絡功能的電話111通過無線鏈接連112接到網絡110,并且PDA 113通過無線鏈接114連接到網絡110。電話111與PDA 113也可以使用適當的技術(諸如“藍牙”無線技術)直接在其之間通過無線鏈接115傳送數據,以生成所謂的個人區(qū)域網絡(PAN),或者個人臨時網絡。以類似的方式,PDA 113可以通過無線通信鏈接116傳送數據給PDA 107。
本發(fā)明可以在多種硬件平臺上實現;圖1A意為異構計算環(huán)境的例子,并不是對于本發(fā)明的體系結構上的限制。
現在參照圖1B,其中的圖顯示了數據處理系統(tǒng)(諸如圖1A所示)的一般計算機體系結構,其中可以實現本發(fā)明。數據處理系統(tǒng)120包含連接到內部系統(tǒng)總線123的一個或更多個中央處理單元(CPU)122,該內部系統(tǒng)總線123互連了隨機存取存儲器(RAM)124、只讀存儲器126、以及輸入/輸出適配器128,輸入/輸出適配器128支持各種I/O設備,諸如打印機130、磁盤單元132、或其他未顯示的設備,諸如音頻輸出系統(tǒng)等等。系統(tǒng)總線123還連接了通信適配器134,其提供到通信鏈接136的訪問。用戶接口適配器148連接各種用戶設備,諸如鍵盤140和鼠標142,或其它未示裝置如觸摸屏、輸入筆、麥克風等等。顯示適配器144將系統(tǒng)總線123連接到顯示設備146。
本領域技術人員應該理解圖1B中的硬件可以根據系統(tǒng)的實現而變化。例如,該系統(tǒng)可以具有一個或更多個處理器,諸如基于IntelPenteium的處理器與數字信號處理器(DSP),以及一種或更多種類型的易失與非易失存儲器。除圖1B所示的硬件之外,或者替換它們,可以使用其他外圍設備。所示的例子并不意味著對本發(fā)明的體系結構的限制。
除了能夠在各種硬件平臺上實現之外,本發(fā)明還可以實現于各種軟件環(huán)境。一般的操作系統(tǒng)可以用來控制在每個數據處理系統(tǒng)中的程序執(zhí)行。例如,一個設備可以運行Unix操作系統(tǒng),同時另一設備包含簡單的Java運行時環(huán)境。代表性的計算機平臺可以包括瀏覽器,其為公知的軟件應用程序,用來訪問各種格式的超文本文檔,諸如圖形文件、字處理文件、可擴展標記語言(XML)、超文本標記語言(HTML)、手持設備標記語言(HDML)、無線標記語言(WML)、以及各種其他文件格式與類型。
本發(fā)明可以實現在各種硬件與軟件平臺之上,如上參照圖1A與圖1B所述,包括對稱多處理器(SMP)機器。雖然本發(fā)明不需要圖1A與1B中所示的所有組件,但是這些部件可以由其中嵌入了本發(fā)明的組件使用,例如操作系統(tǒng)、應用程序、或者其他組件。另外,本發(fā)明可以實現于其中采用諸如顯示設備等各種組件以間接地支持本發(fā)明的計算機環(huán)境中,例如允許系統(tǒng)管理員配置參數與部件。
然而,更具體地,本發(fā)明針對改進的互斥鎖,其可以實現于操作系統(tǒng)內、在應用程序內、或者以其他方式實現于數據處理系統(tǒng)內。在更詳細地描述該改進互斥鎖之前,先描述一般互斥鎖的使用。如上所述,應用程序開發(fā)者可以創(chuàng)建應用程序特有的互斥鎖,如圖2A所示,但是應用程序開發(fā)者一般采用由操作系統(tǒng)提供或者在標準軟件庫內提供的機制,如圖2B所示。本發(fā)明可以各種應用程序特有的或者非應用程序特有的形式實現,而影響本發(fā)明的范圍。
現在參照圖2A,其中的方框圖顯示了在使用互斥鎖的一般多線程應用程序內的組件的邏輯組成。多線程應用程序202包括多個線程,諸如線程204與線程206。與依賴可能由操作系統(tǒng)提供的或者在標準軟件庫(諸如POSIX的pthread庫)內提供的互斥鎖函數不同,應用程序可以實現其自己的互斥鎖函數208,其由互斥鎖數據結構210支持,以針對由組成該應用程序的線程所共享的資源使其自身線程的運行串行化。
現在參照圖2B,其中的方框圖顯示在一般數據處理系統(tǒng)上的組件的邏輯組成,該數據處理系統(tǒng)支持執(zhí)行使用由操作系統(tǒng)內核支持的互斥鎖的多線程應用程序。計算機220支持包含內核級函數222的操作系統(tǒng),該內核級函數222控制多線程應用程序224與226的運行,多線程應用程序224與226分別包括線程228與230。內核內的線程調度器232使用線程調度器數據結構234確定何時線程運行以及何時掛起線程,線程調度器數據結構234可以包含用來協(xié)助管理線程調度任務的數據結構;例如,該數據結構可以包括FIFO(先入先出)隊列,諸如與各種線程狀態(tài)相關聯(lián)的隊列,例如,準備執(zhí)行隊列、睡眠隊列、I/O阻塞隊列、互斥鎖等待隊列、或者其他狀態(tài)。駐留于內核內的互斥鎖管理例程236(或者作為以內核級特權運行的內核擴展的例程)提供了以下函數,用來創(chuàng)建、修改、并銷毀互斥鎖,其在互斥鎖數據結構238中得到反映。此后,認為名詞“睡眠”等同于任意形式的“掛起”。
現在參照圖3,其中顯示了自旋鎖互斥鎖的一般實現。當線程請求獲取互斥鎖時,開始該過程(步驟302);此后,認為名詞“獲取”、“保留”、“具有”、“擁有”、或者“鎖定”互斥鎖是等同的。確定互斥鎖是否自由并解鎖(步驟304),并且如果否,則檢查該線程是否已經通過在該互斥鎖上自旋而使用了可配置數量的時間(步驟306)。如果否,則該線程進行忙等待循環(huán)(步驟308),即其自旋于循環(huán),同時其等待互斥鎖變?yōu)榭捎茫蝗绻摼€程先前已經通過了步驟302-308,則在該線程通過完成另一忙等待循環(huán)來繼續(xù)進行自旋操作。在自旋一段時間之后,該線程重復步驟302。
如果在步驟304該互斥鎖自由,則為該線程鎖定該互斥鎖(步驟310),并且線程進入訪問共享資源(步驟312),而不可能與另一線程沖突并破壞與共享資源相關聯(lián)的數據的完整性。在線程進行了其對共享資源的操作之后,則該線程就請求釋放互斥鎖,并且該互斥鎖被解鎖(步驟314),由此結束該過程。在互斥鎖被解鎖之后,其他并發(fā)執(zhí)行的線程可以使用該互斥鎖。如果如在步驟306所確定的、線程已經通過在互斥鎖上自旋而使用了可配置數量的時間,則在該線程在該互斥鎖上睡眠(步驟316),例如,通過調用將該進程置入睡眠狀態(tài)的內核函數。該線程可以睡眠可配置的時間段,或者內核可以具有在互斥鎖解鎖時喚醒該線程的能力。在任何一種情況下,在線程被喚醒后,該線程再次嘗試獲取互斥鎖。
現在轉到本發(fā)明,本發(fā)明針對用于獲取被爭奪的互斥鎖的過程,其以逐個互斥鎖的方式動態(tài)適應于當前資源,該當前資源正在被嘗試獲取被爭奪的互斥鎖的多個線程消耗。此后余下的附圖顯示了本發(fā)明的各種實施方式。
現在參照圖4,其中的方框圖顯示了根據本發(fā)明實施方式的、已經被擴展以包括用于支持自適應互斥鎖的信息的互斥鎖數據結構。應該注意,在所示互斥鎖數據結構中的信息數據項可以以其他數據結構存儲,而圖4中的互斥鎖數據結構只是在邏輯上相關聯(lián)以支持本發(fā)明實施方式的各種信息數據項的邏輯組成的例子;在互斥鎖數據結構中可以包括其他信息數據項。
互斥鎖數據結構402包含互斥鎖404,其為可被反轉的數據值反映該互斥鎖的鎖定與解鎖狀態(tài)。如果互斥鎖是鎖定的,則鎖定線程標識符406表示由操作系統(tǒng)向當前持有該互斥鎖的線程分配的線程標識符,即鎖定該互斥鎖的線程。如果互斥鎖是鎖定的并且有等待其釋放的線程,即在該互斥鎖上自旋或睡眠的線程,則等待線程列表408包含正在等待該互斥鎖釋放的線程的線程標識符??商鎿Q地,等待線程列表408可以包括記錄列表,其中每個記錄都代表正在該互斥鎖上等待的線程,并且每個記錄可以包括線程管理信息。
互斥鎖數據結構402還包括數據值410,其代表正在該互斥鎖上自旋的線程的數目。如果線程在等待互斥鎖釋放時進入了自旋狀態(tài),則增加自旋線程的數目。如果線程獲得互斥鎖,則線程退出自旋狀態(tài),并且減小自旋線程的數目。數據值412表示對于在任意時間可以在等待互斥鎖時自旋的線程的數目的門限值。假如達到該限制,則線程不再進入自旋狀態(tài)同時等待互斥鎖,以下將詳細描述。在可替換實施方式中,互斥鎖數據結構402也可以包括數據值414,其表示后-睡眠互斥鎖獲取嘗試計數門限值;以下參照圖5E將詳細描述該門限值的使用。
現在參照圖5A,其中的流程圖顯示了根據本發(fā)明實施方式的過程,通過該過程線程能夠鎖定處于解鎖狀態(tài)的互斥鎖并且同時可能轉移到其他處理。圖5A-5E顯示可能在線程嘗試獲取互斥鎖時發(fā)生的處理的不同部分。圖5A中的流程圖表示一種初始處理,其可能在線程嘗試獲取互斥鎖時調用例程時發(fā)生。從圖5A的流程圖中,該處理可能轉移到在圖5B-5E中所示的其他流程圖中,但是描繪其他每個流程圖使得該處理在圖5A中結束。
參照圖5A,當進入鎖定自適應互斥鎖的例程時,開始該過程(步驟502),例如,當從特定線程調用該例程時。在這個例子中,該例程可以被稱為“互斥鎖管理例程”,其可能作為內核級例程存在,通過特殊的操作系統(tǒng)調用訪問該內核級例程,也可能作為只能用特殊特權運行的某種其他類型的例程存在。可替換地,應用程序可能實現本發(fā)明的實施方式,在這種情況下,可以將互斥鎖管理例程編譯到該應用程序的目標代碼中。
為了反映線程的最近的狀態(tài),例如,出于線程調度器的緣故,設置標志值以指示該線程在互斥鎖上等待(步驟504)。也可能初始化各種其他的線程特有的數據值。
然后確定互斥鎖是否已經被鎖定(步驟506)。如果互斥鎖未被鎖定,則為該線程鎖定該互斥鎖(步驟508)。應該注意,步驟508與步驟510應該實現為原子操作,即作為不能被中斷的操作;存在各種公知技術來進行針對互斥鎖的原子操作。
為了反映線程的當前狀態(tài),線程標識符存儲在所需要的任意數據結構之中,以指示已經獲取該互斥鎖的線程的身份(步驟510),然后清除等待標志值以指示該線程不再在該互斥鎖上等待(步驟512)。然后,互斥鎖管理例程返回執(zhí)行調用的例程(步驟514),并且結束獲取互斥鎖的過程。
現在參照圖5B,其中的流程圖顯示了其中可以在經鎖定的互斥鎖上自旋的線程的數目由可配置門限值限制的運行塊。在圖5B的流程圖中所示的運行塊表示可能在圖5A的步驟506確定經鎖定的互斥鎖之后發(fā)生的某些處理。
現在參照圖5B,在該運行塊開始時,確定已經在互斥鎖上自旋的線程的數目是否已經達到了最大值(步驟522)。互斥鎖管理數據結構可能包含在等待該特定互斥鎖時已經進入自旋狀態(tài)的線程當前總數,并且互斥鎖管理數據結構也可以包含互斥鎖特有的自旋線程計數門限值,例如,如圖4所示。如果已經達到了對于自旋線程的數目的限制,則該過程轉移到圖5D所示的運行塊,使得該線程進入睡眠狀態(tài),而不是進入自旋狀態(tài)。
如果在步驟522確定還沒有達到對于自旋線程的數目的限制,則該線程可以進入自旋狀態(tài),同時其等待鎖定的互斥鎖變?yōu)榭捎?。然后增加在互斥鎖管理數據結構中表示自旋線程的數目的數據值,以反映另一線程已經進入了對于該互斥鎖的自旋狀態(tài)(步驟524)。應該注意,步驟522與步驟524應該實現為原子操作;對于自旋線程計數的檢查與更新應該作為單一操作進行,其不能被中斷,以防在給定時間兩個或更多個線程進行該檢查。
然后,確定該互斥鎖是否保持鎖定(步驟526)。如果是,則該線程在該互斥鎖上自旋。該線程可以通過在步驟526進入緊密循環(huán)(tight loop)而在互斥鎖上自旋;該線程可以反復檢查互斥鎖是否已被解鎖,并且如果否,則該線程立即轉移返回步驟526??商鎿Q地,如圖5B所示,可以執(zhí)行更密集的自旋;該線程可以轉移到在圖5C中所示的運行塊,其中該線程執(zhí)行可配置的忙等待循環(huán)。
如果在步驟526確定互斥鎖被解鎖,這可能在線程已經在互斥鎖自旋了一定時間段之后發(fā)生,則為該線程鎖定互斥鎖(步驟528)。再次地,應該注意步驟526與步驟528應該實現為原子操作。在獲取互斥鎖之后,該線程就不再處于自旋狀態(tài)。因此,減少在互斥鎖管理數據結構中表示自旋線程的數目的數據值(步驟530)。結束該運行塊,此后返回圖5A中的步驟510。
現在參照圖5C,其中的流程圖顯示了其中線程在鎖定的互斥鎖上自旋或忙等待的運行塊。在圖5C中的流程圖中所顯示的運行塊表示可能在圖5B的步驟526確定互斥鎖被鎖定之后發(fā)生的某些處理。
現在參照圖5C,該運行塊開始時設置標志值,以指示該線程在互斥鎖上自旋或者忙等待(步驟532),由此反映該線程的最近狀態(tài)。然后,如果必要,則初始化忙等待循環(huán)(步驟534),并且進入、執(zhí)行、并完成該忙等待循環(huán)(步驟536)。例如,該忙等待循環(huán)可以包含空迭代循環(huán),其不進行除檢查該鎖的狀態(tài)以及可選地嘗試獲取該鎖之外任何實際上有用的工作。因為該線程已經完成了忙等待循環(huán),所以清除表示該線程在互斥鎖上自旋或者忙等待的標志值(步驟538),由此反映該線程的最近狀態(tài)。結束該運行塊,此后返回圖5B中的步驟526。在可替換實施方式中,圖5C中所示的忙等待循環(huán)可以包括可配置的忙等待超時退出,其限制線程所進行的忙等待的數量,并且如果該線程達到了這一限制,在該線程進入睡眠狀態(tài)。
現在參照圖5D,其中的流程圖顯示了其中線程在經鎖定的互斥鎖上睡眠的運行塊。在圖5D中的流程圖內所顯示的運行塊表示可能在互斥鎖在圖5B的步驟522已經確定已經達到自旋線程的最大數目之后所發(fā)生的某些處理。
現在參照圖5D,該運行塊開始時設置標志值,以指示該線程正在互斥鎖上睡眠(步驟542),因此反映該線程的最近狀態(tài)。然后,該線程進入睡眠狀態(tài)一段時間(步驟544)。該線程可能睡眠一預先設置的時間段,但優(yōu)選地,該線程睡眠直至被來自另一線程的目標喚醒信號或者以其他方式(例如通過線程調度器的動作)所喚醒。
在某個時間點上,線程退出睡眠狀態(tài)(步驟546)。因為該線程已經完成了睡眠循環(huán),所以清除表示該線程正在互斥鎖上睡眠的標志值(步驟548),由此反映該線程的最近狀態(tài)。
作為可選的步驟,可以設置后-睡眠(post-sleep)標志以指示該線程已經在互斥鎖上睡眠,同時等待獲取該互斥鎖(步驟550);當線程開始進入互斥鎖管理例程嘗試獲取互斥鎖時(例如在圖5A的步驟502),該后-睡眠標志可以已經被初始化。下面針對圖5E中所示的本發(fā)明的可替換實施方式將更詳細地描述該后-睡眠標志的意義。結束該運行塊,此后返回圖5B中的步驟522。
再次參照圖5B,使用本發(fā)明,線程根據互斥鎖的當前計算環(huán)境進行各種動作。更具體地,顯然當線程嘗試獲取互斥鎖時,其行為取決于已經正在互斥鎖上自旋的線程的當前數目以及對于在任意給定時間允許在互斥鎖上自旋的線程的最大數目的限制值或門限值。通過這種方法,本發(fā)明保證了足夠數目的線程在互斥鎖上自旋,以減少獲取互斥鎖時的延遲,即如果多于一個的線程正在互斥鎖上等待,則盡可能快地獲取互斥鎖。另外,減少了外來的自旋,這是因為只允許有限數目的線程在互斥鎖上自旋,而其他線程被置入睡眠。
對于大多數工作負荷來說,自旋線程計數門限可以設置為值一,從而在任意給定時間只有單獨一個線程在互斥鎖上自旋。然而,可能存在這種情況需要將該門限設置為更大的值,以避免成為瓶頸的串行化喚醒。例如,如果對互斥鎖爭奪得很激烈,并且該互斥鎖被保持了短于線程睡眠與蘇醒所需的時間段的一段時間,則線程將進入睡眠,否則此時如果其自旋的話其會迅速獲取該互斥鎖。在這種場景下,最好有多于一個的自旋線程。
在可替換實施方式中,對于自旋線程數目的門限限制是動態(tài)可調整的。當在線程已經在互斥鎖上睡眠之后該線程開始在互斥鎖上自旋時,在其獲取該互斥鎖之前,該線程監(jiān)視其自旋的時間長度。如果在蘇醒后該線程相對較快地獲取了互斥鎖,則可以增加自旋線程計數門限,由此確保足夠數目的線程在互斥鎖上自旋,從而盡可能快地在互斥鎖釋放之后獲取它。相反,如果在蘇醒之后線程自旋過長,則可以減少自旋線程計數門限,然而自旋線程計數門限將具有下限制值一。通過這種方式,該互斥鎖在運行時自適應于其環(huán)境的計算行為。
現在參照圖5E,其中的流程圖顯示了根據本發(fā)明實施方式的運行塊,其中當動態(tài)調整對于可以在經鎖定的互斥鎖上自旋的線程數目的限制值時線程可以獲取互斥鎖。在圖5E中的流程圖中所顯示的該運行塊表示在圖5A的步驟506互斥鎖被確定為鎖定之后可能發(fā)生的某些處理。圖5E與圖5B有些類似;圖5E中的某些步驟與圖5B中的某些步驟相同,并且圖5E中的處理可以轉移到圖5C與圖5D中的運行塊。然而,圖5E表示圖5B中所示運行塊的可替換實施方式;當在圖5A的步驟506處過程轉移時,可以執(zhí)行圖5B或圖5E中的運行塊,但不能兩者都執(zhí)行。
現在參照圖5E,當該運行塊開始時,確定已經正在互斥鎖上自旋的線程的數目是否達到了最大值(步驟552)。如果已經達到了對于自旋線程的數目的限制,則該處理轉移到圖5D中所示的運行塊,從而該線程進入睡眠狀態(tài),而不是進入自旋狀態(tài)。
如果在步驟552處,確定沒有達到對自旋線程的數目的限制,則該線程可以進入自旋狀態(tài),同時其等待經鎖定的互斥鎖變?yōu)榭捎谩H缓?,增加在互斥鎖管理數據結構中表示自旋線程數目的數據值,以反映另一線程已經進入了該互斥鎖上的自旋狀態(tài)(步驟554)。再次地,應該注意步驟552與步驟554應該實現為原子操作。
在確定互斥鎖是否保持鎖定之前,即在嘗試實際獲取互斥鎖的操作之前,增加表示線程特有的、互斥鎖獲取嘗試計數的數據值(步驟556)。該互斥鎖獲取嘗試計數為線程特有的數據值;其可以逐線程的方式作為線程執(zhí)行上下文中的局部變量來被維持。換而言之,該互斥鎖獲取嘗試計數可以不是在互斥鎖特有的互斥鎖管理數據結構中所保持的線程全局數據值。當線程開始進入互斥鎖管理例程以嘗試獲取互斥鎖(例如圖5A中的步驟502)時,可以初始化該互斥鎖嘗試計數;可初始化表示計數的該數據值為值一,以便該值準確地反映在圖5A步驟506處對于獲取互斥鎖的初始嘗試。以下將更詳細地描述該互斥鎖獲取嘗試計數的使用。
然后確定互斥鎖是否保持鎖定(步驟558)。如果是,則線程在互斥鎖上自旋。線程可以通過在步驟556與558進入緊密循環(huán)而在自旋鎖上自旋;該線程可以反復檢查互斥鎖是否已經解鎖,并且如果否,則線程立即轉移返回步驟556。可替換地,如圖5E所示,可以進行更密集的自旋;線程可以轉移到圖5C所示的運行塊,其中線程執(zhí)行可配置的忙等待循環(huán)。
如果在步驟558確定互斥鎖為解鎖,這可能在線程在互斥鎖上自旋了一段時間段之后發(fā)生,則為線程鎖定互斥鎖(步驟560)。再次地,應該注意步驟558與步驟560應該實現為原子操作。在獲取互斥鎖之后,線程就不再處于自旋狀態(tài)。因此,減少在互斥鎖管理數據結構中表示自旋線程數目的數據值(步驟562)。
此時,圖5E與圖5B顯著地不同,圖5E顯示以下的實施方式對于自旋線程的數目的限制被實現為動態(tài)可調整的值。確定該線程是否已進入睡眠狀態(tài)同時等待互斥鎖(步驟564)。例如,在圖5D的步驟550,已經設置后-睡眠標志以表示該線程已經在互斥鎖上睡眠同時等待獲取互斥鎖。如果線程沒有進入睡眠狀態(tài),則結束該運行塊,此后返回圖5A中的步驟510。如果線程確實進入了睡眠狀態(tài),則通過以下步驟調整對于自旋線程的數目的限制。
確定該線程是否已經以多于限定值嘗試獲取互斥鎖(步驟566)。每次嘗試時,在步驟556處積累獲取互斥鎖的嘗試的數目的計數;這是線程特有的或與線程相關的值。后-睡眠互斥鎖獲取嘗試計數門限值為互斥鎖特有的值;例如,其可以在互斥鎖特有的數據結構中保持,如圖4所示。
如果后-睡眠線程的互斥鎖獲取嘗試數目大于后-睡眠互斥鎖獲取嘗試計數門限,則該線程在獲取互斥鎖之前已經自旋了相對較長的時間,因此減少自旋線程計數門限(步驟568)。如果后-睡眠線程的互斥鎖獲取嘗試數目小于后-睡眠互斥鎖獲取嘗試計數門限,則該線程在獲取互斥鎖之前已經自旋了相對較短的時間,因此增加自旋線程計數門限(步驟570)。雖然圖中未顯示,但是對于自旋線程的最大可能數目可以有上限,其中該上限將取決于可用于支持線程的資源。另外,可以以除一以外的量增加或減少自旋線程計數門限,即不以值一來增加或減小。另外,可以根據可用來支持自旋線程的其他資源的值來動態(tài)計算用來增加或減少自旋線程計數門限的值。
后-睡眠互斥鎖獲取嘗試計數門限可以是可配置的值,其為互斥鎖所特有、應用程序所特有、或者可能為系統(tǒng)所特有,從而其用于在給定系統(tǒng)內所支持的每個互斥鎖。另外,后-睡眠互斥鎖獲取嘗試計數門限可以是根據資源可用性而動態(tài)可調整的。
在可替換實施方式中,可以用表示下門限值與上門限值的兩個門限值來替換后-睡眠互斥鎖獲取嘗試計數門限。對互斥鎖獲取嘗試的數目與后-睡眠互斥鎖獲取嘗試計數下門限值的比較結果將控制何時增加自旋線程計數門限。對互斥鎖獲取嘗試的數目與后-睡眠互斥鎖獲取嘗試計數上門限值的比較結果將控制何時減少自旋線程計數門限。如果互斥鎖獲取嘗試的數目落入這兩個門限值之間,則不調整自旋線程計數門限。可以在本發(fā)明的各種實施方式中實現用于調整自旋線程計數門限的其他算法。
在圖5E中所示的可替換實施方式中,對于自旋線程的數目的門限限制是動態(tài)可調整的。在步驟566,對后-睡眠線程的互斥鎖獲取嘗試的數目與后-睡眠互斥鎖獲取嘗試計數門限的比較結果,將確定是否有足夠數目的線程在互斥鎖上自旋。如上所述,該某些情景下,在任意給定時間由具有多于一個自旋線程可能更好。
當線程在已經在互斥鎖上睡眠之后開始在互斥鎖上自旋時,該線程監(jiān)視其在獲取互斥鎖之前自旋的時間長度;這在步驟556通過保持對于互斥鎖獲取嘗試數目的計數來進行,但是在本發(fā)明的其他實施方式下可能保持其他計算費用測度。
相對較小的互斥鎖獲取嘗試的計數值確定線程在蘇醒之后相對較快地獲取互斥鎖;在步驟566處負的結果可說明上述情況。對于這種情況,可以增加自旋線程計數門限,以確保足夠數目的線程在互斥鎖上自旋;這由步驟570表示。
相反,相對較大的互斥鎖獲取嘗試的計數值確定線程在蘇醒之后過度自旋;在步驟566處正的結果可說明上述情況。對于這種情況,可以減少自旋線程計數門限,以確保不會有太多的線程在互斥鎖上自旋;這由步驟568給出,然而自旋線程計數門限將具有下限值一。通過這種方式,該互斥鎖在運行時自適應于其環(huán)境的計算行為。
現在參照圖6,其中的流程圖顯示了線程釋放自適應互斥鎖的過程。通過顯示一線程,該線程釋放先前通過使用圖5A-5E的過程而獲得的互斥鎖,圖6補充了圖5A-5E。當進入解鎖互斥鎖的例程時,開始該過程(步驟602)。在檢查以確保請求解鎖互斥鎖的線程為先前鎖定該互斥鎖的線程之后,解鎖該互斥鎖(步驟604);應該注意步驟604應當實現為原子操作。然后,該例程清除或刪除先前存儲在數據結構中的所有線程標識符,該線程標識符指示先前鎖定該互斥鎖的線程的身份(步驟606)。
然后確定是否有任何已經在等待該互斥鎖的線程正在該互斥鎖上睡眠(步驟608)。如果是,則向正在該互斥鎖上睡眠的線程發(fā)送喚醒信號(步驟610),例如,對線程的執(zhí)行進行安排的系統(tǒng)調用。如果多個線程正在該互斥鎖上睡眠,則可以使用適當的算法來選擇應該嘗試鎖定該互斥鎖的下一個線程。然后,解鎖例程返回調用例程(步驟612),由此結束解鎖互斥鎖的過程。
從以上的詳細描述,可以明顯地看出本發(fā)明的的優(yōu)點。在現有技術中,當互斥鎖被鎖定時,線程一般在鎖定的互斥鎖上進行自旋超時退出操作,這將使該線程在可以在系統(tǒng)級或應用程序級上配置的一段時間之后睡眠。使用本發(fā)明,對于線程應當在經鎖定的互斥鎖上自旋還是睡眠的確定取決于圍繞該特定互斥鎖的計算環(huán)境。本發(fā)明調整線程針對特定的經鎖定的互斥鎖的行為,使得線程進入以如下方式自旋狀態(tài)或進入睡眠狀態(tài)該方式取決于其他線程針對該互斥鎖的先前的動作。
應該注意,雖然在功能完備的數據處理系統(tǒng)的環(huán)境下描述了本發(fā)明,但是本領域技術人員應該理解本發(fā)明的過程能夠以計算機可讀介質指令的形式以及各種其他形式分布,而不管實際用來執(zhí)行該分布的信號承載介質的特定類型。計算機可讀介質的例子包括諸如EPROM、ROM、磁帶、紙張、軟盤、硬盤驅動器、RAM、以及CD-ROM等介質,以及諸如數字與模擬通信鏈接等傳送類型的介質。
對本發(fā)明的描述的目的在于說明,而不是窮盡的或限于所公開的實施方式。對于本領域技術人員來說,顯然有許多改動與變化。所選擇的實施方式是用來解釋本發(fā)明的原理及其實際應用,并且使本領域技術人員能夠理解本發(fā)明,從而實現適合于其他所設想的用途的具有各種修改的實施方式。
權利要求
1.一種在數據處理系統(tǒng)中管理互斥鎖的方法,該方法包括以下步驟保持對于正在互斥鎖上自旋的線程的數目的自旋線程計數值;第一線程嘗試獲取該互斥鎖;以及作為對確定該互斥鎖已經被第二線程獲取的響應,根據所述自旋線程計數值,確定第一線程進入自旋狀態(tài)還是睡眠狀態(tài);其中,如果所述自旋線程計數值小于自旋線程計數門限值,則進入自旋狀態(tài);以及如果所述自旋線程計數值大于或等于自旋線程計數門限值,則進入睡眠狀態(tài)。
2.根據權利要求
1的方法,還包括以下步驟比較所述自旋線程計數值與自旋線程計數門限值,以選擇自旋狀態(tài)或睡眠狀態(tài)。
3.根據權利要求
2的方法,還包括以下步驟根據線程在所述互斥鎖上睡眠之后獲取所述互斥鎖所需的時間量,調整所述自旋線程計數門限值。
4.根據權利要求
2的方法,還包括以下步驟根據線程在所述互斥鎖上睡眠之后獲取所述互斥鎖所需的獲取嘗試次數,調整所述自旋線程計數門限值。
5.根據權利要求
2的方法,還包括以下步驟如果在所述互斥鎖上睡眠之后線程獲取所述互斥鎖相對較慢,則減小所述自旋線程計數門限值。
6.根據權利要求
2的方法,還包括以下步驟如果在所述互斥鎖上睡眠之后線程獲取所述互斥鎖相對較快,則增加所述自旋線程計數門限值。
7.一種用于管理互斥鎖的裝置,包括用于保持對于正在互斥鎖上自旋的線程的數目的自旋線程計數值的部分;用于第一線程嘗試獲取該互斥鎖的部分;用于作為對確定該互斥鎖已經被第二線程獲取的響應,根據所述自旋線程計數值,確定第一線程進入自旋狀態(tài)還是睡眠狀態(tài)的部分;用于如果所述自旋線程計數值小于自旋線程計數門限值,則進入自旋狀態(tài)的部分;以及用于如果所述自旋線程計數值大于或等于自旋線程計數門限值,則進入睡眠狀態(tài)的部分。
8.根據權利要求
7的裝置,還包括用于比較所述自旋線程計數值與自旋線程計數門限值,以選擇自旋狀態(tài)或睡眠狀態(tài)的部分;以及用于根據線程在所述互斥鎖上睡眠之后獲取所述互斥鎖所需的獲取嘗試次數,調整所述自旋線程計數門限值的部分。
專利摘要
提供了一種在數據處理系統(tǒng)中管理互斥鎖的方法。對于每個互斥鎖,保持對于正在自旋同時等待獲取互斥鎖的線程的數目的自旋線程計數。如果線程嘗試獲取鎖定的互斥鎖,則根據限制性條件以及在嘗試獲取過程中正在自旋的線程的數目,線程進入自旋狀態(tài)或睡眠狀態(tài)。另外,在已經在互斥鎖上睡眠之后線程在互斥鎖上自旋所需的相對時間長度,可以用來調節(jié)允許在互斥鎖上自旋的線程的數目。
文檔編號G06F9/52GKCN1307551SQ200410054937
公開日2007年3月28日 申請日期2004年7月26日
發(fā)明者喬爾·H·肖普 申請人:國際商業(yè)機器公司導出引文BiBTeX, EndNote, RefMan專利引用 (3),