欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

用于受控運(yùn)行時(shí)環(huán)境的利用鎖膨脹進(jìn)行線程同步的方法和裝置的制作方法

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


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