新四季網

用於受控運行時環境的利用鎖膨脹進行線程同步的方法和裝置的製作方法

2023-05-30 10:15:31 1

專利名稱:用於受控運行時環境的利用鎖膨脹進行線程同步的方法和裝置的製作方法
技術領域:
本公開總體涉及計算機,更具體而言,涉及用於受控運行時環境的利用鎖膨脹(lock inflation)進行線程同步的方法和裝置。
背景技術:
支持多線程應用的軟體環境,例如,JAVA和歐洲計算機製造商協會(ECMA)通用語言架構(CLI),通常包括用於在一個或多個線程都可以訪問對象時進行協調的同步機制。正如本領域普通技術人員所理解的那樣,線程指被組織成單個執行控制流以處理一個或多個對象的一系列處理器指令。對象是類的實例,其中,類是數據和對這樣的數據進行操作的方法的集合。在執行多線程的情形中,一定要注意避免多個線程同時對同一個對象進行修改從而使得該對象可能處於錯誤狀態。特別是,線程可具有臨界區,該臨界區對有可能同時被另一線程訪問的對象進行操作。從而,多線程系統通常提供專門的聲明,以免線程臨界區的操作在臨界區執行期間被訪問該共享對象的一個或多個其他線程破壞。
例如,JAVA原始碼可包括synchronized(同步)聲明,以免對象同時被不同線程所訪問。使用該synchronized聲明能夠獲取由該synchronized聲明所標識出的對象的排他鎖。從而,可防止線程執行代碼的臨界區,直至該線程能夠獲得由synchronized聲明所標識的特定對象上的排他鎖為止。此外,一旦獲得這樣的鎖,任何其他線程都不能訪問被鎖定的對象,從而防止在執行代碼的臨界區期間因正在執行的處理所帶來的無意的破壞。這樣的鎖定過程可用於確保多個線程不會以導致在同一時間代碼的臨界區的執行發生衝突的方式對共享對象進行訪問。當然,synchronized聲明的應用通常用於如下情形,即,特定程序創建多個線程來共享對象和/或方法。如果任何時候都僅有一個線程訪問特定對象和/或方法,則無需通過synchronized聲明對其進行保護。
在JAVA原始碼中的synchronized聲明通常被轉換成JAVA虛擬機(JVM)指令,這是因為,如本領域所公知的那樣,在JAVA原始碼被JVM執行前,首先將其編譯成字節碼(即,JVM語言)。例如,可將synchronized聲明轉換成monitorenter(監視器進入)JVM指令,以得到/獲得對象上的排他鎖。與monitorenter指令相呼應,還提供monitorexit(監視器退出)JVM指令,用於解鎖/釋放對象上的排他鎖。因此,如果線程對對象成功地執行了monitorenter指令,則該線程得到該對象的臨時排他鎖擁有權(即,它已經獲得了該對象上的鎖,以避免其他線程訪問該代碼的臨界區)。如果當第一線程具有對象的臨時排他鎖擁有權時,另一線程,或第二線程試圖對同一對象執行monitorenter指令,則第二線程必須等待(例如,休眠或旋轉(spin)),直至第一線程(即,當前鎖擁有者)執行monitorexit指令而釋放其對於該對象的排他鎖為止。
通常使用兩個狀態變量來描述對象的鎖狀態。第一狀態變量為鎖擁有者,其與當前擁有該鎖的線程的線程標識符相對應。對於鎖未被任何線程所擁有的情形,可將鎖擁有者設置為NULL(空)值或NULL線程。第二狀態變量為鎖遞歸計數器,其可用於指示鎖擁有者已經獲取該鎖的次數(以支持遞歸鎖定)。一般而言,將對象的鎖狀態初始化為鎖擁有者等於NULL值(相當於未鎖定狀態)和鎖遞歸計數器等於零。
通常來講,鎖定字(lockword)用於表示對象的鎖狀態。Bacon等人在「Thin LockFeatherweight Synchronization for JAVA」(Conference on Programming Languages Design andImplementation,1998年,第258-268頁)中定義出一種用於對象鎖定/同步的通用技術。Bacon等人定義的基於鎖定字的技術中,鎖定字可具有兩種形式,即,瘦形和胖(inflated)形。瘦鎖可僅包括線程標識符和鎖遞歸計數器狀態變量,由於其尺寸相對較小,可將其存儲在對象的頭部(header)內。胖鎖可包括多個附加數據結構,以便支持在對於其中瘦鎖不足以勝任的情形中(例如,在鎖競爭的情形中,可能需要等待獲取該對象鎖的線程的列表)的對象鎖定/同步。一般而言,將對象初始化成具有瘦鎖。然後,例如當鎖變得太大以至於不適於放在對象頭部中時(例如,如果存在鎖競爭以及需要等待線程的列表,如果鎖遞歸計數器超過瘦鎖可表示的最大值,等等),鎖定/同步過程將使得該鎖膨脹。在大多數實現方式中,鎖定/同步過程不會將胖鎖收縮回瘦鎖(即,一旦將對象鎖轉換成胖鎖,對於程序執行的其餘部分,它將保持為胖鎖)。
在許多現有對象鎖定技術(例如,JVM monitorenter和monitorexit指令的現有實現方式)中,鎖釋放功能(例如,相當於monitorexit指令)確定試圖釋放該鎖的線程實際上是否為該鎖的鎖擁有者。另外,鎖釋放功能檢查鎖遞歸計數器,以確定是應將該鎖解鎖還是保持原樣(例如,由於多個遞歸鎖獲取而保持在鎖定狀態中)。然而,使用高級語言(例如,JAVA)編寫的、隨後編譯成字節碼的大多數格式良好的應用程式都包括鎖獲取和釋放操作的匹配對(例如,monitorenter和monitorexit JVM指令的匹配對),因此,表現出平衡的同步特性(即,包括通過同一線程執行的平衡的鎖獲取和釋放對的鎖定序列)。在表現出平衡的同步特性的代碼中,用於檢查鎖擁有者和鎖遞歸計數器狀態變量的額外開銷可能不是必需的,因此,這可能降低執行應用程式的整體效率。


圖1的框圖表示其中可採用此處所述示例性的方法、裝置和製品的示例性受控運行時環境;圖2的框圖表示可用於圖1的受控運行時環境中的示例性鎖管理器;圖3A表示可由示例性的現有鎖管理器採用的用於圖1的受控運行時環境中的示例性鎖定字;圖3B表示可由圖2的示例性鎖管理器採用的示例性鎖定字;
圖4A-4B的流程圖表示,可由機器執行以實現可用於圖1的受控運行時環境中的示例性現有鎖管理器的示例性機器可讀指令;圖5的流程圖表示可由機器執行以實現圖2的示例性鎖管理器的示例性機器可讀指令;圖6的流程圖表示可由機器執行以實現圖2的示例性樂觀平衡鎖同步單元的示例性機器可讀指令;圖7的流程圖表示可由機器執行以實現圖2的示例性不平衡鎖獲取單元的示例性機器可讀指令;圖8的流程圖表示可由機器執行以實現圖2的示例性不平衡鎖釋放單元的示例性機器可讀指令;圖9的流程圖表示可由機器執行以修改未決平衡釋放的狀態以便由圖6和7所示處理使用的示例性機器可讀指令;圖10A-10C表示圖2的鎖管理器的示例性操作;以及圖11表示可執行如圖4-9所示處理以實現圖2的鎖管理器的示例性處理器系統。
具體實施例方式
圖1示出了可使用此處所述示例性方法、裝置和製品的示例性使用環境100的框圖。示例性使用環境100可通過例如一個或多個處理器系統(例如,以下所述的圖11中的示例性處理器系統1100)來實現。儘管圖1所示的示例相當於基於JAVA的受控運行時環境(MRTE),本領域普通技術人員應該理解,可將此處所述示例性的方法、裝置和製品應用到任何類似的MRTE使用環境中,例如,CLI和相關的C#語言。
示例性使用環境100包括在圖1中表示為JAVA虛擬機(JVM)110的MRTE。示例性JVM110動態地將由機器無關指令或字節碼114所表示的程序轉換成機器相關的或本機的指令,然後在一個或多個處理器120(例如,以下所述的處理器1112)上執行該本機指令。JVM 110可通過對於一個或多個處理器120專用的作業系統(OS)130(例如,Microsoft Windows OS,UNIX OS,Linux OS等)執行該本機指令。
在圖1的示例中,JVM110對存儲在多個類文件114中的字節碼114進行處理。一般而言,類文件114存儲與單個JAVA類相對應的字節碼114,該字節代碼包括用於定義該類的接口、欄位和方法。JAVA編譯器134可根據由例如軟體開發者編寫的JAVA程序原始碼創建類文件114。JAVA編譯器134、相關的JAVA原始碼138和最終類文件114(或字節碼114)在本領域中是公知的,在此不再對其進行更多描述。
為了對類文件114進行處理,示例性的JVM110包括類加載器142,其用於定位與一個或多個專用類相對應的一個或多個專用類文件114,以便通過將所加載的類文件114的本地映像存儲到本地存儲器146中,而將這樣的類文件114加載到JVM110的執行引擎144。在將所加載的類文件114存儲到存儲器146之前,類加載器142可調用字節碼檢驗器150,以檢驗所加載的類文件114的結構是否正確,以及是否符合JAVA語言的結構。然後,在上述兩者中任一的情形中,JVM110的執行引擎144使用例如解釋器154和/或一個或多個即時(JIT)編譯器158,將所加載的機器無關的字節碼轉換成機器相關指令。
解釋器154將字節碼114轉換成用於在目標處理器120上實現字節碼114的功能的一組機器相關指令。換而言之,解釋器154提供仿真層,以允許字節碼114在目標處理器120上執行,就好像處理器120直接支持JAVA指令集。另一方面,JIT編譯器158將一組字節碼114編譯成用於在目標處理器120上執行的一組機器相關指令。單個字節碼114的具體功能可能不會準確地被轉換成機器相關指令,但是最終得到的一組機器相關指令的總體功能將等效於原始的一組字節碼114。從而,JIT編譯器158可比解釋器154產生出更優的代碼。然而,解釋器154可比JIT編譯器158更容易實現。
為執行解釋器154和/或一個或多個JIT編譯器158提供的程序代碼,JVM110的執行引擎144可在本地存儲器146中定義一個或多個存儲區。例如,為支持多個線程的同時執行,JVM110可為存儲器146中的每個線程分配獨立的虛擬程序計數器(pc)寄存器和獨立的JVM堆棧幀。JVM堆棧幀可用於存儲例如對應於相關執行線程的局部變量和部分結果。此外,JVM110可定義在本地存儲器146中對所有線程共用的存儲區。例如,這樣的存儲區可包括用於存儲在程序執行期間創建的對象的堆、用於存儲例如用於實現特定類的方法的數據和代碼的方法區,和用於存儲與特定類相關的常量的運行時常量池。為了有效管理存儲器146的運行時部分,JVM110可包括例如用於自動對堆中對象進行解除分配以便為隨後程序執行而騰空存儲器的垃圾收集器162。
為了支持多線程的同時執行,JVM110的執行引擎144包括線程支持模塊166。線程支持模塊166支持通過創建線程對象的線程的創建,以及通過調用線程的啟動方法的線程執行。此外,線程支持模塊166可通過使用多個優先級別來支持對線程的優先執行。在本發明中特別值得注意的是,JVM110的執行引擎144還包括鎖管理器170,其用於解決當兩個或多個線程試圖訪問同一共享對象時可能發生的衝突。
對應於示例性JVM110的工業標準規範(以及用於其他受控運行時環境的規範)定義了用於支持多線程之間對象同步的過程。JVM110為每個對象提供同步鎖。線程可通過獲得與對象相關的鎖的擁有權來獲得該對象的擁有權。同樣,線程可通過釋放與該對象相關的鎖的擁有權來釋放該對象的擁有權。在JAVA程式語言中,通過synchronized聲明來實現對象和方法的同步。JVM110的規範定義了分別通過monitorenter和monitorexit字節碼來實現鎖獲取和釋放操作。然而,並沒有定義出monitorenter和monitorexit字節碼的實現。
圖2示出了可用於實現如圖1所示的示例性鎖管理器170的示例性鎖管理器200的框圖。示例性鎖管理器200基於大多數鎖獲取和鎖釋放將是平衡的或樂觀(optimistically)平衡的假設而獲取和釋放對於一個線程的對象的鎖。例如,如果對於鎖的一組獲取和釋放操作出現在同一嵌套級,以及處在這樣的操作之間的代碼的臨界區不包含同步操作,或僅包含對該鎖的其他平衡同步操作(例如,線程獲取對象的鎖,執行程序代碼的臨界區,然後釋放該對象的鎖),則鎖管理器200可確定該組獲取和釋放操作是平衡的。同樣,如果對鎖的一組獲取和釋放操作出現在同一嵌套級,但鎖管理器200不能十分確定所有操作是平衡的(例如,在代碼的臨界區包含方法調用的情形中),則鎖管理器200確定該組獲取和釋放操作是樂觀平衡的。使用高級語言(例如,JAVA)編寫的、然後編譯成字節碼(例如,字節碼114)的多數格式良好的程序表現出平衡的同步特性(即,包含如前所述平衡的獲取和釋放對的同步)。然而,在很少情形中,鎖獲取或釋放可能是不平衡的(例如,可能是使用人工編寫的字節碼實現程序的情形)。因此,除平衡和樂觀平衡鎖處理過程外,鎖管理器200可採用不平衡的獲取和釋放過程分別獲取和釋放對象的鎖。
如圖2所示,鎖管理器200包括鎖同步控制器204,鎖同步控制器204從正在執行的線程接受對象標識符輸入208和線程上下文輸入212。對象標識符輸入208用於標識將要同步的對象,並可包括惟一的對象實例標識符、對象的鎖定字等。線程上下文輸入212用來指示尋求對由對象標識符輸入208所標識的對象進行鎖定或解鎖的線程的身份、該線程的操作狀態和用於對該對象的鎖執行的相關操作(例如,用於獲取鎖或釋放鎖,獲取和/或釋放為平衡的、樂觀平衡的還是不平衡的)。鎖同步控制器204提供對象鎖狀態輸出216,以指示對象的鎖的狀態(例如,初次獲得、遞歸獲得、釋放/解鎖、拋出異常等)。
另外,鎖同步控制器204基於將要對由對象標識符輸入208所標識的對象的鎖進行的鎖定操作的類型,調用特定的鎖定操作單元。示例性類型的鎖定操作包括樂觀平衡鎖同步(對應於對象鎖的平衡的同步或樂觀平衡的同步)、不平衡鎖獲取和不平衡鎖釋放。鎖同步控制器204可基於通過線程上下文輸入212提供的信息確定鎖定操作的類型。該信息可例如通過圖1所示的解釋器154和/或JIT編譯器158確定,作為從字節碼114到由線程上下文輸入212所標識的線程執行的機器相關指令集的轉換的一部分。
為了執行對象的平衡鎖同步(或在對象的樂觀平衡同步的情形中試圖執行平衡同步),示例性的鎖管理器200包括樂觀平衡鎖同步單元220。如果鎖同步控制器204確定應對對象執行平衡(或樂觀平衡)同步(例如,基於對象標識符輸入208和線程上下文輸入212),則樂觀平衡鎖同步單元220可確定與對象相關的鎖的當前形式是否支持樂觀平衡同步。例如,僅當相關的對象鎖處在瘦模式中時,可將樂觀平衡同步單元220配置成執行對象的樂觀平衡同步。相反,如果鎖處在胖模式中(例如,由於對象鎖的先前競爭,先前對鎖執行的不平衡鎖定操作等),樂觀平衡鎖同步單元220可被配置成回退到已知的鎖定技術(例如,以上所述由Bacon等人描述的技術)。
例如,如果瘦鎖與要鎖定的對象相關,則樂觀平衡同步單元220確定是否已有線程獲取了該對象的鎖。如果預期對象的鎖可用(或已被請求線程擁有),則樂觀平衡鎖同步單元220存儲該鎖的當前狀態,並獲取該線程的鎖。如果該鎖不可用,或例如,胖鎖與該對象相關,則樂觀平衡鎖同步單元220調用已知的鎖膨脹/競爭過程,以便在該鎖變得可用之後為該線程獲得該鎖。在以上兩種情形任意之一中,樂觀平衡鎖同步單元220然後可使得鎖同步控制器204更新鎖狀態輸出216,以指示已獲取該對象鎖。
線程執行完要求鎖定對象的代碼(例如,如線程上下文輸入212所指示的)之後,可向樂觀平衡鎖同步單元220發送信號,以便如果瘦鎖仍與該對象相關聯,則通過將鎖恢復到其先前狀態來釋放該對象的鎖,或者在胖鎖的情形中,通過執行已知的胖鎖釋放過程來釋放該對象的鎖。釋放了該對象鎖之後,樂觀平衡同步單元220可導致/發送信號至鎖同步控制器204來相應地更新對象鎖狀態輸出216。為了支持由單個線程進行的遞歸鎖獲取,樂觀平衡鎖同步單元220包括同步映射,以便跟蹤與給定對象的所有樂觀平衡同步相對應的所有活動樂觀平衡鎖獲取的狀態。同步映射可用於代替鎖遞歸計數器來跟蹤線程已獲取特定對象的次數。
為了執行不平衡鎖獲取或不平衡鎖釋放,鎖管理器200分別包括不平衡鎖獲取單元224和不平衡鎖釋放單元228。如果鎖同步控制器204確定應對對象執行不平衡鎖獲取(例如,基於線程上下文輸入212),那麼,若該鎖可用(或已被該線程所擁有),不平衡鎖獲取單元224獲取用於該線程的對象的鎖,或者,若鎖不可用,則調用已知的鎖競爭過程。如果鎖同步控制器204確定應對對象執行不平衡釋放,那麼,如果該對象的鎖當前被該線程所擁有,則不平衡鎖釋放單元228釋放/解鎖該鎖。如果該鎖不為該線程所擁有,那麼不平衡鎖釋放單元228拋出異常以指示試圖進行無效的鎖釋放。從而,根據是執行鎖獲取還是鎖釋放,不平衡鎖獲取單元224或不平衡鎖釋放單元228分別可使得鎖同步控制器204更新鎖狀態輸出216,以指示對象鎖的正確狀態。另外,如果瘦鎖當前與該對象相關,則不平衡鎖獲取單元224或不平衡鎖釋放單元228可分別使得該對象鎖膨脹。
不平衡鎖獲取單元224和不平衡鎖釋放單元228可能需要修改由樂觀平衡鎖同步單元220所存儲的活動樂觀平衡鎖獲取狀態的同步映射。例如,不平衡鎖獲取或不平衡鎖釋放可能需要將對象鎖從瘦鎖膨脹到胖鎖。為執行該鎖膨脹,可基於在同步映射中的表項確定鎖遞歸計數器狀態變量。另外,對於在同步映射中的每個未決平衡釋放,可能需要修改鎖形式標誌。從而,為了更新樂觀平衡鎖同步單元220所保持的同步映射,示例性鎖管理器200包括平衡同步狀態跟蹤器/修改器236。平衡同步狀態跟蹤器/修改器236可用於確定與特定對象相對應的活動樂觀平衡獲取的數量,以及用於修改與特定的活動樂觀平衡鎖獲取相對應的鎖形式。不平衡鎖獲取單元224或不平衡鎖釋放單元228可根據正在執行的鎖操作(即,分別為不平衡獲取或平衡釋放),調用平衡同步狀態跟蹤器/修改器236。
圖3A示出可由圖1的鎖管理器170的現有實現使用的示例性鎖定字的格式。相對照地,圖3B示出可由例如圖1的鎖管理器170和/或鎖管理器200的所披露的實現使用的示例性鎖定字的格式。參看圖3A,該圖示出支持瘦和胖鎖的示例性的現有鎖定字格式。示例性的現有鎖定字格式300具有32位,支持瘦和胖鎖。鎖定字的形式(例如,瘦還是胖)由1位的鎖形式304表示。例如,0值可表示瘦鎖,而有值或1值可表示胖鎖。對於瘦鎖(例如,鎖形式304等於0),鎖定字格式300包括15位的鎖擁有者標識符(ID)308和8位的遞歸計數312。鎖形式位304和鎖擁有者ID308合在一起表示鎖擁有者欄位316。其餘8位的其他欄位320可以例如用於存儲其他的對象相關信息,例如,對象哈希代碼,用於垃圾收集器162的標誌等。
對於胖鎖(例如,鎖形式304等於1),鎖定字格式300包括23位的監視器ID324。例如,監視器ID324可存儲胖鎖高速緩存索引,該索引指向與對象鎖相對應的、存儲在胖鎖高速緩存中的一組數據結構。如前所述,諸如由Bacon等人所述的現有對象鎖定/同步技術,在瘦鎖變得過大以至於不適合瘦鎖格式時,可使得瘦鎖膨脹。這可能會發生在例如當出現鎖競爭時且等待該鎖的一列線程需與該對象相關聯(例如,單個鎖擁有者ID308不夠)的情況下,遞歸計數溢出(例如,不適合於8位的遞歸計數欄位312)的情況下,等等。
參看圖3B,該圖示出了具有16位(圖3A的示例性的現有鎖定字格式所需位數的三分之二)且支持瘦和胖鎖的示例性的披露的鎖定字格式350。鎖定字的形式(例如,瘦或胖)由1位的鎖形式354表示。例如,0值可表示瘦鎖,而有值或1值可表示胖鎖。對於瘦鎖(例如,鎖形式354等於0),鎖定字格式350包括15位的鎖擁有者標識符(ID)358。鎖形式位354和鎖擁有者ID358合在一起表示鎖擁有者欄位362。與示例性的現有鎖定字格式300相對照,示例性的披露的鎖定字格式350不包括遞歸計數,這是因為,如先前所述,對對象執行的鎖獲取的數量可通過同步映射進行隱式跟蹤。
對於胖鎖(例如,鎖形式354等於1),鎖定字格式350包括15位的監視器ID366。至於在示例性的現有鎖定字格式300中的監視器ID324,監視器ID324可存儲胖鎖高速緩存索引,該索引指向與對象鎖相對應的、且存儲在胖鎖高速緩存中的一組數據結構。如先前結合以上圖2所述,當對該對象的鎖執行不平衡鎖定操作時,該示例性的披露的鎖定技術(例如,示例性的鎖管理器200)可將瘦鎖膨脹。例如,不平衡鎖獲取或不平衡鎖釋放可導致將瘦鎖轉換成胖鎖。
圖4A-4B示出表示用於實現圖1的鎖管理器170的已知的機器可讀指令的流程圖。圖5-9示出表示用於實現圖1的鎖管理器170和/或圖2的鎖管理器200的示例性的披露的機器可讀指令的流程圖。在圖5-9的示例中,每個流程圖所表示的處理過程可通過一組機器可讀指令來實現,該組機器可讀指令可以包含由微處理器(例如,以下結合圖11所述的示例性計算機1100中所示的處理器1112)執行的一個或多個程序。所述一個或多個程序可包含在存儲在有形介質(如,CD-ROM、軟盤、硬碟驅動器、DVD、或與處理器1112相關的存儲器)上的軟體中。然而,本領域普通技術人員應該易於理解,全部程序和/或其部分也可由除處理器1112之外的設備執行,和/或按照公知的方式包含在固件或專用硬體中。例如,鎖管理器170和/或鎖管理器200可通過軟體、硬體,和/或固件實現。此外,儘管參照圖5-9所示流程圖描述了示例性程序,本領域普通技術人員應該易於想到,也可替換地使用實現此處所述示例性方法和裝置的許多其他方法。例如,參照圖5-9所示的流程圖,可改變方框的執行順序,和/或可將某些所述方框改變、去除、組合和/或劃分成多個方框。
為了更好地理解圖2的示例性鎖管理器200的特性和特徵,以及更好地理解以下如圖5-9的流程圖所示的各種處理操作,在圖4A-4B中顯示出用於實現圖1的鎖管理器170的示例性的現有處理。具體而言,圖4A表示出用於獲取對象的鎖的示例性現有處理400,圖4B表示出用於釋放該對象的鎖的示例性現有處理450。儘管未示出,但可使用一控制處理來基於執行的程序線程的狀態確定應調用鎖獲取過程還是鎖釋放過程。
參照圖4A,示例性的現有鎖獲取處理400開始於將與待鎖定對象相關聯的鎖的先前鎖擁有者相對應的變量/寄存器設置成等於用於表示該鎖的鎖定字中的瘦鎖擁有者欄位(例如,圖3A的瘦鎖擁有者欄位316)的目前值(方框402)。然後,處理400通過首先確定任何線程是否己擁有該待鎖定對象的鎖和/或胖鎖是否與該對象相關聯(即,是否將瘦鎖擁有者欄位316設置成NULL值),而試圖鎖定當前線程(即,請求該鎖的線程)的對象(方框404)。如果處理400確定不存在任何線程擁有者,以及瘦鎖與該對象相關聯(即,瘦鎖擁有者欄位316為NULL值)(方框404),以及由此該對象的鎖己被解鎖,那麼,處理400通過將鎖擁有者ID(如鎖擁有者ID308)設置成表示該線程的值(例如,惟一的線程標識符值),而獲取該線程的鎖(方框408)。然而,如果處理400確定鎖擁有者已存在或者胖鎖與該對象相關聯(即,瘦鎖擁有者欄位316並非為NULL值)(方框404),則處理400保持鎖擁有者ID308不變。在第一線程己處在成為鎖擁有者的期間,為防止第二線程試圖獲取該鎖,通常使用單個原子操作(例如,在屬於英特爾安騰處理器家族的處理器上的cmpxchg指令)實現方框402,404和408。原子操作使線程(和/或在多處理器系統中的處理器)在原子操作的執行期間對共享存儲器進行排他性訪問。從而,沒有任何其他線程能夠在原子操作執行期間修改由該原子操作所訪問的存儲單元。
在確定瘦鎖擁有者欄位316為非NULL(方框404)或鎖擁有者ID308被定義成當前線程之後(方框408),處理400確定該對象的先前鎖擁有者是否為NULL值(與方框408處當前線程已獲得鎖的情形相對應)(方框412)。如果先前鎖擁有者為NULL值(方框412),則示例性處理400結束。然而,如果處理400確定先前鎖擁有者並非為NULL值(方框412),則該處理確定先前鎖擁有者是否為當前線程(對應於當前線程先前已獲得過該對象的瘦鎖的情形)(方框414)。如果先前鎖擁有者為當前線程(方框414),則處理400例如可將與該鎖相關聯的鎖遞歸計數器加一,以指示當前線程已多次獲得該對象的瘦鎖(方框416)。然後,示例性處理400結束。
然而,如果處理400確定先前鎖擁有者並非為當前線程(方框414),且由此另一線程已擁有該對象的瘦鎖或者胖鎖已與該對象相關聯,那麼,處理400調用已知的鎖膨脹/競爭過程,以允許當前線程在目前鎖擁有者(若有的話)釋放該鎖之後獲取該對象的胖鎖(方框420)。例如,處理400可使得當前線程在執行循環中旋轉或暫停執行,直至目前鎖擁有者(如果有的話)釋放/解鎖該對象的鎖為止。當該對象的鎖變得可用之後,處理400則可為當前線程而膨脹和獲取該鎖,然後,示例性處理400結束。
參看圖4B,示例性的現有鎖釋放處理450開始於通過首先確定與對象相關聯的鎖的形式,而試圖釋放當前線程(即,請求釋放的線程)的對象(方框452)。如果胖鎖與該對象相關聯(例如,基於圖3A的鎖形式位304),則處理450調用已知的胖鎖釋放過程來釋放該對象的胖鎖(方框454)。然後,示例性處理450結束。然而,如果瘦鎖與該對象相關聯(方框452),則處理450確定與該對象相關聯的瘦鎖的鎖擁有者ID(例如,鎖擁有者ID308)是否與當前線程相對應(方框456)。如果鎖擁有者ID308不是當前線程,且由此另一線程目前擁有該鎖(方框456),則處理450拋出異常(方框458)。在方框458處,處理450可使用任何已知的異常處理技術拋出異常以指示執行了無效的釋放嘗試(由於不擁有該鎖的線程試圖對相關聯的對象解鎖)。然後,示例性處理450結束。
然而,如果鎖擁有者ID308是當前線程(方框456),則處理450確定與該鎖相關聯的鎖遞歸計數器(例如,遞歸計數312)是否等於零(或等效而言,指示該鎖僅具有一個當前活動的獲取)(方框462)。如果鎖遞歸計數312等於零(方框462),則處理450例如通過將鎖擁有者ID308設置成NULL值將該對象的鎖解鎖(方框466)。然而,如果鎖遞歸計數312不等於零(方框462),則處理450將鎖遞歸計數312減一(例如,以指示與一個活動的鎖獲取相對的目前的鎖釋放)(方框470)。在方框466或470處的處理完成後,示例性處理450隨即結束。
基於由圖4A-4B的示例性的現有處理400和450所提供的理解,圖5示出了可用於實現圖2的示例性鎖管理器200的示例性鎖管理器處理500。當一個或多個線程對同步對象進行操作時,可在該一個或多個線程的不同執行階段期間調用示例性鎖管理器處理500。例如,可調用示例性處理500以獲取或釋放對象的鎖。
示例性鎖管理器處理500開始於確定當前線程對該對象的鎖要執行哪種類型的鎖定操作(方框504)。有效的鎖定操作可包括樂觀平衡鎖同步(包括樂觀平衡鎖獲取和釋放對)、不平衡鎖獲取和不平衡鎖釋放。例如,JIT編譯器,諸如圖1的JIT編譯器158,可使用控制流圖表和/或數據流分析來確定在程序執行期間的適當點處對對象的鎖執行的鎖定操作的類型。然後,JIT編譯器158可輸出可被鎖管理器200或鎖管理器處理500使用的編譯代碼,以便在方框504處做出正確的鎖操作確定。示例性處理500可採用用於確定鎖定操作是平衡的(或至少樂觀平衡的)還是不平衡的任何已知技術,從而,在此不再進一步描述這些技術。
基於在方框504做出的鎖定過程確定,控制繼而進行到方框508、512和516的其中之一。在方框508處,鎖管理器200對該對象的鎖執行樂觀平衡同步操作。在方框512處,鎖管理器200對該對象的鎖執行不平衡鎖獲取操作。在步驟516處,鎖管理器200對該對象的鎖執行不平衡鎖釋放操作。後面將提供分別通過圖6、7和8的說明而更詳細地描述的在方框508、512和516處執行的處理。
方框508、512和516處的處理完成之後,處理500確定是否至少一個鎖定對象仍處未決狀態,而將在將來的線程執行點處需要隨後的釋放(方框520)。如果有任何鎖定對象處在未決狀態(方框520),則控制返回到方框504及其隨後方框,以允許對這樣對象的鎖進行處理(以及對任何附加對象的鎖進行鎖定)。然而,如果沒有任何鎖定對象處在未決狀態(方框520),則處理500確定是否有要鎖定的任何附加對象(方框524)。如果有要鎖定的附加對象(方框524),則控制返回到方框504及其隨後方框,以允許對這樣對象的鎖進行處理。然而,如果沒有要鎖定的附加對象(方框524),則示例性處理500結束。本領域普通技術人員應該理解,可通過例如對於程序(或程序的任何線程)是否仍在執行作出顯式或隱式的確定,來替換在方框520和/或524處執行的條件操作。如果程序500仍在執行,則控制將返回到方框504及隨後的方框508、512和516。這樣的循環一直重複到處理500(或所有線程執行)結束。
圖6示出可用於執行在圖5的方框508處的處理和/或實現圖2的樂觀平衡鎖同步單元220的示例性樂觀平衡鎖同步處理600。示例性樂觀平衡鎖同步處理600開始於將胖鎖標誌初始化為FALSE(假)(方框602)。胖鎖標誌用於表示與該鎖相關的鎖的當前形式(例如,瘦或胖)。接著,處理600將與該鎖的先前鎖擁有者相對應的變量/寄存器設置成等於與該對象的鎖相關聯的瘦鎖擁有者欄位(例如,圖3B的瘦鎖擁有者欄位362)的目前值(方框604)。然後,處理600確定是否有線程已經擁有要鎖定的對象的鎖和/或胖鎖是否與該對象相關聯(即,是否存在該對象的鎖擁有者,或是否鎖擁有者被設置成NULL值)(方框612)。如果不存在線程擁有者且瘦鎖與該對象相關聯(即,瘦鎖擁有者欄位362為NULL值)(方框612),以及由此該對象的鎖是被解鎖的,則處理600通過將該鎖的瘦鎖擁有者ID(例如,瘦鎖擁有者ID358)設置成表示該線程的值(例如,惟一的線程標識符值),而為該線程獲取該對象的瘦鎖(方框616)。然而,如果處理600確定已存在鎖擁有者和/或胖鎖與該對象相關聯(即,瘦鎖擁有者欄位362並非為NULL值)(方框612),則處理600保持瘦鎖擁有者ID358不變。
當第一線程已處在變為鎖擁有者的期間時,為防止第二線程試圖獲取該鎖,通常使用單個原子操作(例如,在屬於英特爾安騰處理器家族的處理器上的cmpxchg指令)實現方框604、612和616。如上所述,原子操作使線程(和/或在多處理器系統中的處理器)在原子操作執行期間對共享存儲器進行排他性訪問。從而,沒有其他線程能夠在原子操作期間修改由該原子操作所訪問的存儲單元。例如,可基於以下指令序列,在屬於英特爾安騰處理器家族的處理器上實現在方框604、612和616處執行的處理ar.ccv=mov0r1=cmpxch2.acq[r3],r2在以前的指令中,寄存器r1可用於表示先前鎖擁有者,寄存器r2可用於表示當前線程,寄存器r3可保持與目前瘦鎖擁有者欄位362相對應的地址。第一個指令(ar.ccv=mov0)將ar.ccv寄存器設置成零(即,NULL值)。第二個指令(r1=cmpxchg2.acq[r3],r2)為可用於實現以下操作的原子指令1)將先前鎖擁有者設置成等於目前瘦鎖擁有者欄位362(即,r1=[r3]);2)檢查目前瘦鎖擁有者欄位362是否為NULL值(即,[r3]是否等於ar.ccv);3)如果目前瘦鎖擁有者欄位362為NULL值(即,如果[r3]等於ar.ccv),將瘦鎖擁有者ID358設置成表示當前線程的值(即,[r3]=r2);以及4)如果目前瘦鎖擁有者欄位362並非為NULL值(即,如果[r3]不等於ar.ccv),則保持瘦鎖擁有者ID358不變(即,保持[r3]不變)。
返回圖6,在確定了瘦鎖擁有者欄位362並非為NULL(方框612)或瘦鎖擁有者ID358被設置成當前線程(方框616)之後,處理600確定該對象的先前鎖擁有者是否為NULL值(對應於在方框616處當前線程已獲取瘦鎖的情形)(方框620)。如果先前鎖擁有者為NULL值(方框620),則控制進行到方框624。然而,如果處理600確定先前鎖擁有者並非為NULL值(方框620),則該處理確定先前鎖擁有者是否為當前線程(對應於當前線程先前已獲取該對象的瘦鎖的情形)(方框626)。如果先前鎖擁有者為當前線程(方框626),那麼,控制進行到方框624。然而,如果處理600確定先前鎖擁有者並非為當前線程(方框626),且由此確定另一線程已擁有該鎖或胖鎖與該對象相關聯,則處理600將胖鎖標誌設置成TRUE(真),以指示胖鎖與、或者將與該對象相關聯(方框628)。然後,處理600調用已知的鎖膨脹/競爭過程,以允許在目前鎖擁有者(若有的話)釋放該鎖之後,當前線程獲取該對象的胖鎖(方框630)。處理600可導致當前線程在執行循環中旋轉,或暫停執行直至目前鎖擁有者(若有的話)釋放/解鎖該對象的鎖。在該對象的鎖變為可用之後,處理600則可為當前線程獲取胖鎖。另外,由於方框630的鎖膨脹/競爭過程完成之後將不存在先前鎖擁有者,處理600可將先前鎖擁有者重置成NULL值(方框632)。然後,控制進行到方框624。
在方框624處,當前線程執行與被鎖定對象相對應的代碼的臨界區。在代碼的該臨界區的執行完成後,處理600確定胖鎖是否與該對象相關聯(例如,胖鎖標誌是否為TRUE)(方框636)。如果瘦鎖與該對象相關聯(即,胖鎖標誌為FALSE),則處理600將該鎖的瘦鎖擁有者ID358重置成先前鎖擁有者(方框640)。通過將瘦鎖擁有者ID358重置成等於先前鎖擁有者,處理600在先前擁有者為NULL值時對該鎖進行解鎖,或者在先前鎖擁有者為當前線程時為當前線程保持該鎖。然而,如果胖鎖與該對象相關聯(即,胖鎖標誌為TRUE),則處理600調用已知的胖鎖釋放過程來釋放該對象的胖鎖(方框644)。當在方框640或644處的處理完成之後,示例性處理600結束。
為支持遞歸的樂觀平衡鎖同步(以及以下所述的不平衡鎖獲取和釋放過程),鎖管理器200和/或鎖管理器處理500利用一個或多個同步映射來存儲/跟蹤調用樂觀平衡鎖同步的方法(例如,JAVA方法)的每個實例的任何或所有的活動樂觀平衡獲取操作的狀態。用於表示活動樂觀平衡獲取操作的狀態的示例性同步映射表項包括鎖地址、先前鎖擁有者值和胖鎖標誌。同步映射的每個表項可被存儲在調用堆棧中與調用樂觀平衡鎖同步的方法的特定實例相對應的調用幀內(從而支持由嵌套調用同一方法導致的遞歸鎖獲取)。如以下更詳細描述的,不平衡鎖獲取和釋放操作可遍歷該同步映射,以確定在調用堆棧上活動的樂觀平衡獲取操作的數量,並按照需要對這樣的操作進行修改。
圖7示出可用於執行在圖5的方框512處的處理和/或實現圖2的不平衡鎖獲取單元224的示例性不平衡鎖獲取處理700。示例性不平衡鎖獲取處理700開始於將與鎖的先前鎖擁有者相對應的變量/寄存器設置成等於與該對象鎖相關聯的目前瘦鎖擁有者欄位(例如,圖3B的瘦鎖擁有者欄位362)(方框708)。然後,處理700確定是否有線程已擁有待鎖定對象的鎖和/或胖鎖是否與該對象相關聯(即,是否將瘦鎖擁有者欄位362設置成NULL值)(方框712)。如果線程擁有者不存在以及瘦鎖與該對象相關聯(即,瘦鎖擁有者欄位362被設置成NULL值)(方框712),且由此該對象的鎖是被解鎖的,那麼處理700通過將該鎖的瘦鎖擁有者ID(例如,瘦鎖擁有者ID358)設置成表示該線程的值(例如,惟一的線程標識符值)來為該線程獲取該對象的瘦鎖(方框716)。然而,如果處理700確定鎖擁有者已存在和/或胖鎖與對象相關聯(即,瘦鎖擁有者欄位362未被設置為NULL值)(方框712),則處理700保持瘦鎖擁有者ID358不變。
如先前所述,當在第一線程已處在成為鎖擁有者的處理期間,為防止第二線程試圖獲取該鎖,通常使用單個原子操作(例如,在屬於英特爾處理器家族的處理器上的cmpxchg指令)實現方框708、712和716。原子操作使得線程(和/或在多處理器系統中的處理器)在原子操作執行期間可對共享存儲器進行排他性訪問。從而,不會有任何其他線程能夠在原子操作執行期間修改由該原子操作訪問的存儲單元。
返回圖7,在確定出瘦鎖擁有者欄位362並非為NULL(方框712)或瘦鎖擁有者ID358被定義成當前線程(方框716)之後,處理700確定該對象的先前鎖擁有者是否為NULL值(對應於當前線程已在方框716處獲取瘦鎖的情形)(方框720)。如果先前鎖擁有者為NULL值(方框720),則處理700將鎖遞歸計數器設置成等於零來為膨脹該對象的鎖做準備(方框724)。將鎖遞歸計數器設置成零以指示正在執行該對象的第一次鎖獲取。然後,基於比鎖遞歸計數器值多一的該對象鎖的遞歸鎖獲取的數量,處理700調用已知的鎖膨脹過程(方框728)。對於該情形,鎖遞歸計數器為零,並由此鎖膨脹過程是基於該鎖的一個獲取。然後,示例性處理700結束。
然而,如果處理700確定先前鎖擁有者並非為NULL值(方框720),則該處理確定先前鎖擁有者是否為當前線程(相當於當前線程先前已獲取該對象的瘦鎖的情形)(方框732)。如果先前鎖擁有者為當前線程(方框732),則處理700調用一過程來修改存儲在與待鎖定對象相對應的同步映射中的活動樂觀平衡獲取操作的狀態,來為膨脹該對象的鎖做準備(方框736)。該修改活動獲取過程可對同步映射進行處理,以便確定與該對象相對應的遞歸樂觀平衡鎖獲取的數量,以及將相應的胖鎖標誌變為TRUE,以指示胖鎖將與該對象相關聯(由於不平衡鎖獲取正由處理700執行)。用於實現在方框736處執行的處理的示例性過程如圖9所示,並在以後進行更詳細的討論。
當修改活動獲取過程完成後(方框736),處理700將與該對象的鎖相對應的鎖遞歸計數器設置成等於由修改活動獲取過程所確定的活動樂觀平衡鎖獲取的數量(方框740)。然後,處理700基於比鎖遞歸計數器值多一的該對象鎖的遞歸鎖獲取的數量,調用已知的鎖膨脹過程(方框728)。對於該情形,鎖膨脹過程是基於活動樂觀平衡鎖獲取加一個非平衡鎖獲取的數量的(相當於比在方框740處確定的鎖遞歸計數器的值多一)。然後,示例性處理700結束。
然而,如果處理700確定先前鎖擁有者並非為當前線程(方框732),且由此另一線程已經擁有該鎖或胖鎖已與該對象相關聯,則處理700調用已知的鎖膨脹/競爭過程,以允許在目前鎖擁有者(如果有的話)釋放該鎖之後,當前線程獲取該對象的胖鎖(方框744)。處理700可導致當前線程在執行循環中旋轉或暫停執行,直至目前鎖擁有者(若有的話)釋放/解鎖該對象的鎖。在該對象的鎖變得可用後,處理700則可為當前線程獲取該胖鎖。另外,由於在方框744的鎖競爭過程完成之後不會再有先前鎖擁有者,處理700可將先前鎖擁有者重置成NULL值(方框748)。然後,示例性處理700結束。
圖8示出可用於執行在圖5的方框516處的處理和/或用於實現圖2的不平衡鎖釋放單元228的示例性不平衡鎖釋放處理800。示例性不平衡鎖釋放處理800開始於將與鎖的先前鎖擁有者相對應的變量/寄存器設置成等於與該對象鎖相關聯的目前瘦鎖擁有者欄位(例如,圖3B的瘦鎖擁有者欄位362)(方框804)。然後,示例性處理800確定先前鎖擁有者是否與試圖釋放該對象鎖的當前線程相對應(方框808)。如果先前鎖擁有者與當前線程相對應(方框808),且由此當前線程擁有該對象的瘦鎖,那麼處理800調用一過程以修改存儲在與待鎖定對象相對應的同步映射中的活動樂觀平衡獲取操作的狀態,來為膨脹該對象的鎖做準備(方框812)。該修改活動獲取過程可對同步映射進行處理,以確定與該對象相對應的遞歸樂觀平衡鎖獲取的數量,以及將相應的胖鎖標誌變為TRUE,以指示胖鎖將與該對象相關聯(由於不平衡鎖釋放正在由處理800執行)。用於實現在方框812處執行的處理的示例性過程如圖9所示,並在以後進行更詳細的討論。
當修改活動獲取過程完成後(方框812),處理800將與該對象的鎖相對應的鎖遞歸計數器設置成等於由修改活動獲取過程所確定的將要存儲在同步映射中的活動樂觀平衡鎖獲取的數量(方框816)。然後,處理800基於等於在方框816處所確定的鎖遞歸計數器的值的該對象鎖的遞歸鎖獲取的數量,調用已知的鎖膨脹過程(方框820)。鎖膨脹過程完成後(方框820),處理800調用已知的胖鎖釋放過程,以釋放該對象的胖鎖(方框822)。然後,示例性處理800結束。
然而,如果先前鎖擁有者不與試圖釋放該鎖的當前線程相對應(方框808),則處理800確定瘦鎖是否與該對象相關聯(方框824)。例如,處理800可基於與該對象的瘦鎖相關聯的鎖形式位,例如圖3B的鎖形式位354,來進行這一確定。如果瘦鎖與該對象相關聯(方框824),且由此不擁有該瘦鎖的線程正試圖釋放該對象鎖(基於在方框808作出的確定),處理800使用已知的異常處理技術來拋出一個異常,以指示當前線程不正確地試圖釋放其不擁有的鎖(方框828)。然而,如果瘦鎖不與該對象相關聯(方框824),且由此胖鎖與對象相關聯,那麼,處理800調用已知的胖鎖釋放過程以釋放該對象的胖鎖(方框822)。在方框822或方框828處的處理完成之後,示例性處理800則結束。
圖9中示出了用於修改在同步映射(例如,由圖6的樂觀平衡鎖同步處理600或圖2的樂觀平衡鎖同步單元220所保持的同步映射)中的活動樂觀平衡獲取的狀態的處理900。示例性處理900可用於修改與一組活動樂觀平衡鎖獲取相關聯的鎖形式標誌,為膨脹與特定對象相關聯的鎖做準備。示例性處理900例如可由分別如圖7和8所示的示例性不平衡鎖獲取處理700和/或不平衡鎖釋放處理800使用。具體而言,示例性處理900可被示例性處理700和/或800所調用,以實現圖7的方框736和/或圖8的方框812所執行的處理。示例性處理900還可用於實現圖2的平衡釋放跟蹤器/修改器236。
參看圖9,示例性處理900開始於例如,通過獲得與正在處理的對象相關聯的鎖定字的地址,來獲得與該對象相對應的鎖(方框904)。然後,處理900將與活動樂觀平衡獲取的數量相對應的計數器初始化為零(方框908)。該初始化完成之後,處理900開始對調用堆棧中的每個調用幀進行迭代,以確定與在方框904處所選的對象鎖相對應的活動樂觀平衡獲取的存在性。
處理900通過獲得在調用堆棧上的下一調用幀,開始對調用堆棧的調用幀進行迭代(方框912)。處理900然後獲得存儲在正在處理的調用幀中的下一鎖定對象的同步映射表項(方框916)。接著,處理900確定該同步映射表項是否與正在處理的對象鎖相對應(方框920)。如果該同步映射表項不與正在處理的對象鎖相對應(方框920),則處理900將與該對象鎖的活動樂觀平衡獲取的數量相對應的計數器加一(方框924)。處理900還將在同步映射表項中的胖鎖標誌設置成TRUE,以指示胖鎖將與該對象相關聯(方框928)。
在方框928處的處理完成後,或如果該同步映射表項不與正在處理的對象鎖相對應(方框920),則處理900確定正在處理的同步映射表項是否為正在處理的調用幀中最後的同步映射表項(方框932)。如果該同步映射表項不是最後的同步映射表項(方框932),則控制返回到方框916,在此,處理900獲得存儲在正在處理的調用幀中的下一個鎖定對象的同步映射表項。然而,如果該同步映射表項為最後的同步映射表項(方框932),則處理900確定正在處理的調用幀是否為在調用堆棧中的最後的調用幀(以及從而確定是否到達同步映射的末端)(方框936)。如果調用幀不是最後的調用幀(方框936),則控制返回到方框912,在此,處理900繼續處理下一個調用幀。然而,如果正在處理的調用幀是調用堆幀中的最後的調用幀(方框936),則處理900返回與正在處理的鎖定對象相對應的活動樂觀平衡獲取的數量(方框944)。然後,示例性處理900結束。
為了有助於理解此處所述的方法、裝置和製品,在圖10A-10C中分別示出圖2的示例性鎖管理器和圖5、6、7、8和9的示例性處理500、600、700、800和900的示例性操作。圖10A-10C的示例性操作對應於由單個線程對兩個對象的鎖執行的鎖獲取和釋放的序列。鎖定序列由調用的各種方法A至C產生,這些方法需要將對象鎖定,以便於執行這些方法。圖10A示出示例性程序序列。圖10B示出對於在該程序序列中兩個點的示例性同步映射的表項。圖10C示出在執行圖10A的不平衡鎖釋放之前和之後與每個同步映射表項相關聯的胖鎖標誌的狀態。
參看圖10A,示例性程序序列開始於方法A執行對於第一對象(obj1)的鎖的第一樂觀平衡獲取(指令A1)。根據圖6的處理600,與第一樂觀平衡獲取相關聯的是包括第一胖鎖標誌(inflated1)和第一先前鎖擁有者(threadID1)的第一同步映射表項。然後,方法A調用方法B(指令C1),這導致將圖10B的相應同步映射表項C1存儲在同步映射高速緩存區中。同步映射表項C1包括指向鎖定對象obj1的堆棧單元或寄存器以及指向胖鎖標誌inflated1的堆棧單元或寄存器。
接著,方法B執行對於第一對象obj1的鎖的第二樂觀平衡獲取(指令A2)和對於第二對象obj2的鎖的第三樂觀平衡獲取(指令A3)。根據處理600,與第二樂觀平衡獲取相關聯的是包括第二胖鎖標誌(inflated2)和第二先前鎖擁有者(threadID2)的第二同步映射表項。同樣,與第三樂觀平衡獲取相關聯的是包括第三胖鎖標誌(inflated3)和第三先前鎖擁有者(threadID3)的第三同步映射表項。然後,方法B調用方法C(指令C2),這導致將圖10B的相應同步映射表項C2存儲在同步映射高速緩存區中。同步映射表項C2包括與第一對象obj1相關聯的第一組數據和與第二對象obj2相關聯的第二組數據。第一組數據包括指向鎖定對象obj1的堆棧單元或寄存器和指向胖鎖標誌inflated2的堆棧單元或寄存器。第二組數據包括指向鎖定對象obj2的堆棧單元或寄存器和指向胖鎖標誌inflated3的堆棧單元或寄存器。
接下來,方法C對第一對象obj1執行不平衡鎖釋放。根據圖8的處理800,不平衡釋放調用修改活動獲取過程,該修改活動獲取過程修改與第一對象obj1相對應的活動樂觀平衡獲取,為膨脹與obj1相關聯的鎖做準備。圖10C示出在執行不平衡鎖釋放(指令R3)之前和之後存儲在同步映射中的胖鎖標誌的狀態。如所預期的,在不平衡鎖釋放之前,與第一對象obj1相關聯的胖鎖標誌(inflated1和inflated2)和與第二對象obj2相關聯的胖鎖標誌(inflated3)全為FALSE,從而指示瘦鎖與對象obi1和obj2相關聯。當不平衡鎖釋放之後,將與第一對象obj1相關聯的胖鎖標誌(inflated1和inflated2)設置成TRUE,以指示由於不平衡釋放,胖鎖將會與obj1相關聯。然後,方法B對第二對象obj2和第一對象obj1執行樂觀平衡釋放(分別為指令R2和R3),方法A對第一對象obj1執行樂觀平衡釋放,示例性程序結束。
圖11所示框圖表示能夠實現此處所披露的裝置和方法的示例性計算機或處理器系統1100。計算機1100例如可為伺服器、個人計算機、個人數字助理(PDA)、網際網路裝置、或任何其他類型的計算設備。
即時示例的系統1100包括處理器1112。例如,處理器1112可通過來自於奔騰_家族、安騰_家族或XScale_家族的一個或多個英特爾_微處理器實現。當然,也適於使用其他家族的其他處理器。包括一個或多個微處理器的處理器1112可用於實現圖1的示例性應用環境100、圖2的示例性鎖管理器200和/或分別如圖5、6、7、8和9所示的示例性處理500、600、700、800和900。
處理器1112通過總線1118與包括易失性存儲器1114和非易失性存儲器1116的主存儲器進行通信。易失性存儲器1114可通過靜態隨機存取存儲器(SRAM)、同步動態隨機存取存儲器(SDRAM)、動態隨機存取存儲器(DRAM)、RAMBUS動態隨機存取存儲器(RDRAM)和/或任何其他類型的隨機存取存儲器設備實現。非易失性存儲器116可通過閃速存儲器和/或任何其他所需類型的存儲設備實現。對於主存儲器1114、1116的訪問通常按傳統方式通過存儲器控制器(未示出)進行控制。
計算機1100還包括傳統接口電路1120。接口電路1120可通過眾所周知的任何類型接口標準(例如,乙太網接口、通用串行總線(USB)、和/或第三代輸入/輸出(3GIO)接口)實現。
一個或多個輸入設備1122與接口電路1120相連。輸入設備1122允許用戶對處理器1112輸入數據和命令。輸入設備可通過例如鍵盤、滑鼠、觸控螢幕、跟蹤板、跟蹤球、isopoint和/或語音識別系統來實現。
一個或多個輸出設備1124也與接口電路1120相連接。輸出設備1124例如可通過顯示設備(例如液晶顯示器、陰極射線管顯示器(CRT))、印表機和/或揚聲器實現。因此,接口電路1120通常包括圖形驅動器卡。
接口電路1120還包括諸如數據機或網絡接口卡之類的通信設備,以便於通過網絡1126(例如,乙太網連接、數字用戶線(DSL)、電話線、同軸電纜、蜂窩電話系統等)與外部計算機進行數據交換。
計算機1100還包括用於存儲軟體和數據的一個或多個大容量存儲設備1128。這樣的大容量存儲設備1128的示例包括軟盤驅動器、硬碟驅動器、光碟驅動器和數字通用盤(DVD)驅動器。大容量存儲設備1128和/或易失性存儲器1114可用於存儲例如分別由圖6、7、8和9所示的處理600、700、800和900所保持和修改的同步映射。
作為在諸如圖11所示設備的系統中實現此處所述的方法和/或裝置的可選實施例,此處所述方法和/或裝置可替換地嵌入在諸如處理器和/或ASIC(專用集成電路)之類的結構中。
從以上可知,本領域普通技術人員應該理解,以上所披露的方法和裝置可實現在靜態編譯器、受控運行時環境即時(JIT)編譯器中,和/或直接實現在微處理器的硬體中,以實現在執行多個程序中的性能優化。
儘管此處描述了特定的示例性方法、裝置和製品,但本專利的覆蓋範圍並不限於此。相反,本專利覆蓋所有在字面上或者在等同方式下清楚地處於所附權利要求範圍之內的方法、裝置和製品。
權利要求
1.一種用於在受控運行時環境中鎖定線程對象的方法,包括確定用於對與所述對象相對應的鎖執行的鎖定操作;如果所述鎖定操作不是不平衡的,則對所述鎖執行樂觀平衡同步;以及如果所述鎖定操作是不平衡的,則修改所述鎖的鎖形式。
2.如權利要求1所述的方法,還包括如果所述鎖定操作是不平衡的,則執行所述鎖的不平衡鎖獲取和所述鎖的不平衡釋放中至少之一。
3.如權利要求1所述的方法,其中,所述鎖形式與第一鎖形式和第二鎖形式中至少之一相對應,且其中,如果所述鎖形式與所述第一鎖形式相對應,則修改所述鎖形式包括將所述鎖轉換成與所述第二鎖形式相對應。
4.如權利要求3所述的方法,其中,所述第一鎖形式與瘦鎖相對應,所述第二鎖形式與胖鎖相對應。
5.如權利要求1所述的方法,其中,所述樂觀平衡同步包括設置鎖形式標誌以指示在所述樂觀平衡同步期間所述鎖的鎖形式。
6.如權利要求1所述的方法,其中,所述樂觀平衡同步包括所述鎖的樂觀平衡鎖獲取和所述鎖的樂觀平衡鎖釋放,且其中,基於所述鎖的鎖形式,執行所述樂觀平衡鎖獲取和所述樂觀平衡鎖釋放中至少之一。
7.如權利要求6所述的方法,其中,所述樂觀平衡鎖獲取包括如果所述鎖形式與第一鎖形式相對應,則將先前鎖擁有者設置成等於與所述鎖相關聯的鎖擁有者欄位。
8.如權利要求6所述的方法,其中,所述樂觀平衡鎖釋放包括如果所述鎖形式與第一鎖形式相對應,則將與所述鎖相關聯的鎖擁有者欄位設置成先前鎖擁有者。
9.如權利要求8所述的方法,其中,如果所述鎖形式與所述第一鎖形式相對應,若所述先前鎖擁有者為空線程,則將所述鎖解鎖,若所述先前鎖擁有者為所述線程,則保持所述鎖。
10.如權利要求1所述的方法,其中,所述樂觀平衡同步包括保持同步映射,該同步映射用於存儲與對所述對象的鎖執行的一組樂觀平衡同步相關聯的一組活動樂觀平衡獲取狀態。
11.如權利要求10所述的方法,還包括如果所述鎖定操作是不平衡的,則執行所述鎖的不平衡獲取和所述鎖的不平衡釋放中至少之一,且其中,執行所述不平衡獲取和所述不平衡釋放中至少之一包括確定存儲在所述同步映射中的活動樂觀平衡獲取狀態的數量。
12.如權利要求11所述的方法,其中,修改所述鎖的鎖形式包括確定與存儲在所述同步映射中的活動樂觀平衡獲取狀態的數量相對應的鎖遞歸計數值。
13.如權利要求10所述的方法,其中,所述同步映射包括與所述一組活動樂觀平衡獲取狀態相對應的一組同步映射表項,且其中,在所述一組同步映射表項中的同步映射表項包括所述鎖的先前鎖擁有者和與所述鎖的鎖形式相對應的鎖形式標誌中至少之一。
14.如權利要求13所述的方法,其中,修改所述鎖的鎖形式包括修改所述同步映射表項中的所述鎖形式標誌。
15.如權利要求1所述的方法,其中,確定對所述鎖執行的鎖定操作包括確定所述鎖定操作是否為所述鎖的樂觀平衡同步、所述鎖的平衡同步、所述鎖的不平衡獲取以及所述鎖的不平衡釋放中之一。
16.一種存儲機器可讀指令的製品,所述指令當被執行時,使得機器確定對與所述對象相對應的鎖執行的鎖定操作;如果所述鎖定操作不是不平衡的,則執行所述鎖的樂觀平衡同步;以及如果所述鎖定操作是不平衡的,修改所述鎖的鎖形式。
17.如權利要求16所述的製品,其中,所述鎖形式與第一鎖形式和第二鎖形式中至少之一相對應,且其中,對於修改所述鎖形式,如果所述鎖形式與所述第一鎖形式相對應,則所述機器可讀指令使得所述機器將所述鎖轉換成與所述第二鎖形式相對應。
18.如權利要求16所述的製品,其中,所述機器可讀指令使得所述機器保持同步映射,該同步映射用於存儲與一組活動樂觀平衡獲取狀態相對應的一組同步映射表項,其中該組活動樂觀平衡獲取狀態與對所述對象的鎖執行的一組樂觀平衡同步相關聯,且其中,在該組同步映射表項中的同步映射表項包括所述鎖的先前鎖擁有者和與所述鎖的鎖形式相對應的鎖形式標誌中至少之一。
19.如權利要求18所述的製品,其中,如果對所述鎖的鎖定操作是不平衡的,則所述機器可讀指令使得所述機器執行所述鎖的不平衡獲取和所述鎖的不平衡釋放中至少之一,且其中,對於執行所述不平衡獲取和所述不平衡釋放中至少之一,所述機器可讀指令使得所述機器執行以下至少之一確定在所述同步映射中存儲的活動樂觀平衡獲取狀態的數量,和修改在所述同步映射的至少一個同步映射表項中的至少一個鎖形式標誌。
20.一種用於在受控運行時環境中鎖定線程對象的裝置,包括樂觀平衡鎖定同步單元,用於執行與所述對象相對應的鎖的樂觀平衡同步;以及平衡同步狀態跟蹤器/修改器,用於基於所述鎖的不平衡鎖獲取和所述鎖的不平衡鎖釋放中至少之一的出現,執行對所述樂觀平衡同步單元的狀態的確定和修改中至少之一。
21.如權利要求20所述的裝置,其中,所述樂觀平衡鎖同步單元用於如果所述鎖形式為第一鎖形式,則通過將所述鎖的先前鎖擁有者設置成等於所述鎖的鎖擁有者欄位,而獲取所述鎖;以及如果所述鎖形式為所述第一鎖形式,則通過將所述鎖擁有者欄位重新設置成等於所述先前鎖擁有者,而釋放所述鎖。
22.如權利要求20所述的裝置,其中,所述樂觀平衡鎖同步單元用於設置鎖形式標誌以指示在對所述鎖執行樂觀平衡同步操作期間所述鎖的鎖形式。
23.如權利要求20所述的裝置,其中,所述樂觀平衡鎖同步單元包括同步映射,該同步映射用於存儲與對所述對象的鎖執行的一組樂觀平衡同步相對應的一組活動樂觀平衡獲取狀態。
24.如權利要求23所述的裝置,其中,所述同步映射包括與所述一組活動樂觀平衡獲取狀態相對應的一組同步映射表項,且其中,在所述一組同步映射表項中的同步映射表項包括所述鎖的先前鎖擁有者和與所述鎖的鎖形式相對應的鎖形式標誌中至少之一。
25.如權利要求24所述的裝置,其中,所述平衡同步狀態跟蹤器/修改器用於實現以下至少之一通過確定存儲在所述同步映射中的活動樂觀平衡獲取狀態的數量來確定所述樂觀平衡同步的狀態;和通過修改在所述同步映射的至少一個同步映射表項中的至少一個鎖形式標誌來修改所述樂觀平衡同步單元的狀態。
26.如權利要求20所述的裝置,其中,所述樂觀平衡同步包括所述鎖的樂觀平衡獲取和所述鎖的樂觀平衡釋放,且其中,所述樂觀平衡同步單元用於基於所述鎖的鎖形式執行所述樂觀平衡獲取和所述樂觀平衡釋放中至少之一。
27.如權利要求20所述的裝置,還包括用於執行所述鎖的不平衡獲取的不平衡鎖獲取單元和用於執行所述鎖的不平衡釋放的不平衡鎖釋放單元中至少之一,且其中,所述不平衡鎖獲取單元和所述不平衡鎖釋放單元中的所述至少之一用於修改所述鎖的鎖形式。
28.一種用於在受控運行時環境中鎖定線程對象的系統,包括處理器,用於確定用於對與所述對象相對應的鎖執行的鎖定操作;如果所述鎖定操作不是不平衡的,則執行所述鎖的樂觀平衡同步;以及如果所述鎖定操作是不平衡的,則修改所述鎖的鎖形式;和存儲器,用於存儲所述鎖的鎖擁有者欄位、所述鎖的先前鎖擁有者和與所述鎖的鎖形式相對應的鎖形式標誌中至少之一。
29.如權利要求28所述的系統,其中,所述處理器用於在所述存儲器中存儲同步映射,該同步映射包括與一組活動樂觀平衡獲取狀態相對應的一組同步映射表項,其中該組活動樂觀平衡獲取狀態與對所述對象的鎖執行的一組樂觀平衡同步相關聯,且其中,在該組同步映射表項中的同步映射表項包括所述鎖的先前鎖擁有者和與所述鎖的鎖形式相對應的鎖形式標誌中至少之一。
30.如權利要求29所述的系統,其中,如果對所述鎖的鎖定操作是不平衡的,則所述處理器用於執行所述鎖的不平衡獲取和所述鎖的不平衡釋放中至少之一,且其中,對於執行所述不平衡獲取和所述不平衡釋放中至少之一,所述處理器用於實現以下至少之一確定存儲在所述同步映射中的活動樂觀平衡獲取狀態的數量,和修改在所述同步映射的至少一個同步映射表項中的至少一個鎖形式標誌。
全文摘要
本發明披露了用於受控運行時環境的利用鎖膨脹進行線程同步的方法和裝置。此處所披露的示例性方法包括確定用於對與所述對象相對應的鎖執行的鎖定操作;如果所述鎖定操作不是不平衡的,則執行所述鎖的樂觀平衡同步,如果所述鎖定操作是不平衡的,則修改所述鎖的鎖形式。
文檔編號G06F9/45GK1997968SQ200580017334
公開日2007年7月11日 申請日期2005年6月10日 優先權日2004年6月28日
發明者塔蒂亞娜·施佩斯曼, 阿里-列扎·阿德-塔巴塔巴伊, 布賴恩·墨菲 申請人:英特爾公司(德拉瓦公司)

同类文章

一種新型多功能組合攝影箱的製作方法

一種新型多功能組合攝影箱的製作方法【專利摘要】本實用新型公開了一種新型多功能組合攝影箱,包括敞開式箱體和前攝影蓋,在箱體頂部設有移動式光源盒,在箱體底部設有LED脫影板,LED脫影板放置在底板上;移動式光源盒包括上蓋,上蓋內設有光源,上蓋部設有磨沙透光片,磨沙透光片將光源封閉在上蓋內;所述LED脫影

壓縮模式圖樣重疊檢測方法與裝置與流程

本發明涉及通信領域,特別涉及一種壓縮模式圖樣重疊檢測方法與裝置。背景技術:在寬帶碼分多址(WCDMA,WidebandCodeDivisionMultipleAccess)系統頻分復用(FDD,FrequencyDivisionDuplex)模式下,為了進行異頻硬切換、FDD到時分復用(TDD,Ti

個性化檯曆的製作方法

專利名稱::個性化檯曆的製作方法技術領域::本實用新型涉及一種檯曆,尤其涉及一種既顯示月曆、又能插入照片的個性化檯曆,屬於生活文化藝術用品領域。背景技術::公知的立式檯曆每頁皆由月曆和畫面兩部分構成,這兩部分都是事先印刷好,固定而不能更換的。畫面或為風景,或為模特、明星。功能單一局限性較大。特別是畫

一種實現縮放的視頻解碼方法

專利名稱:一種實現縮放的視頻解碼方法技術領域:本發明涉及視頻信號處理領域,特別是一種實現縮放的視頻解碼方法。背景技術: Mpeg標準是由運動圖像專家組(Moving Picture Expert Group,MPEG)開發的用於視頻和音頻壓縮的一系列演進的標準。按照Mpeg標準,視頻圖像壓縮編碼後包

基於加熱模壓的纖維增強PBT複合材料成型工藝的製作方法

本發明涉及一種基於加熱模壓的纖維增強pbt複合材料成型工藝。背景技術:熱塑性複合材料與傳統熱固性複合材料相比其具有較好的韌性和抗衝擊性能,此外其還具有可回收利用等優點。熱塑性塑料在液態時流動能力差,使得其與纖維結合浸潤困難。環狀對苯二甲酸丁二醇酯(cbt)是一種環狀預聚物,該材料力學性能差不適合做纖

一種pe滾塑儲槽的製作方法

專利名稱:一種pe滾塑儲槽的製作方法技術領域:一種PE滾塑儲槽一、 技術領域 本實用新型涉及一種PE滾塑儲槽,主要用於化工、染料、醫藥、農藥、冶金、稀土、機械、電子、電力、環保、紡織、釀造、釀造、食品、給水、排水等行業儲存液體使用。二、 背景技術 目前,化工液體耐腐蝕貯運設備,普遍使用傳統的玻璃鋼容

釘的製作方法

專利名稱:釘的製作方法技術領域:本實用新型涉及一種釘,尤其涉及一種可提供方便拔除的鐵(鋼)釘。背景技術:考慮到廢木材回收後再加工利用作業的方便性與安全性,根據環保規定,廢木材的回收是必須將釘於廢木材上的鐵(鋼)釘拔除。如圖1、圖2所示,目前用以釘入木材的鐵(鋼)釘10主要是在一釘體11的一端形成一尖

直流氧噴裝置的製作方法

專利名稱:直流氧噴裝置的製作方法技術領域:本實用新型涉及ー種醫療器械,具體地說是ー種直流氧噴裝置。背景技術:臨床上的放療過程極易造成患者的局部皮膚損傷和炎症,被稱為「放射性皮炎」。目前對於放射性皮炎的主要治療措施是塗抹藥膏,而放射性皮炎患者多伴有局部疼痛,對於止痛,多是通過ロ服或靜脈注射進行止痛治療

新型熱網閥門操作手輪的製作方法

專利名稱:新型熱網閥門操作手輪的製作方法技術領域:新型熱網閥門操作手輪技術領域:本實用新型涉及一種新型熱網閥門操作手輪,屬於機械領域。背景技術::閥門作為流體控制裝置應用廣泛,手輪傳動的閥門使用比例佔90%以上。國家標準中提及手輪所起作用為傳動功能,不作為閥門的運輸、起吊裝置,不承受軸向力。現有閥門

用來自動讀取管狀容器所載識別碼的裝置的製作方法

專利名稱:用來自動讀取管狀容器所載識別碼的裝置的製作方法背景技術:1-本發明所屬領域本發明涉及一種用來自動讀取管狀容器所載識別碼的裝置,其中的管狀容器被放在循環於配送鏈上的文檔匣或託架裝置中。本發明特別適用於,然而並非僅僅專用於,對引入自動分析系統的血液樣本試管之類的自動識別。本發明還涉及專為實現讀