国产精品1024永久观看,大尺度欧美暖暖视频在线观看,亚洲宅男精品一区在线观看,欧美日韩一区二区三区视频,2021中文字幕在线观看

  • <option id="fbvk0"></option>
    1. <rt id="fbvk0"><tr id="fbvk0"></tr></rt>
      <center id="fbvk0"><optgroup id="fbvk0"></optgroup></center>
      <center id="fbvk0"></center>

      <li id="fbvk0"><abbr id="fbvk0"><dl id="fbvk0"></dl></abbr></li>

      用于在受控運行時環(huán)境中使面向?qū)ο蟮能浖?yīng)用去同步的裝置和方法

      文檔序號:6487337閱讀:201來源:國知局

      專利名稱::用于在受控運行時環(huán)境中使面向?qū)ο蟮能浖?yīng)用去同步的裝置和方法
      技術(shù)領(lǐng)域
      :本公開一般地涉及受控運行時環(huán)境,更具體地,涉及用于在受控運行時環(huán)境中使面向?qū)ο蟮能浖?yīng)用去同步的裝置和方法。
      背景技術(shù)
      :對日益增加的軟件應(yīng)用可移植性的需要(即,在具有不同的硬件、操作系統(tǒng)等的多種平臺上執(zhí)行給定的軟件應(yīng)用的能力)以及為獨立軟件開發(fā)商(ISV)減少上市時間的需要已經(jīng)導(dǎo)致越來越多的受控運行時環(huán)境的開發(fā)和使用。受控運行時環(huán)境一般使用動態(tài)程序設(shè)計語言,例如Java、C#等來實現(xiàn)。通常被稱為運行時環(huán)境的軟件引擎(例如Java虛擬機(JVM)、公共語言運行時(CLR)等)執(zhí)行動態(tài)程序語言指令。運行時環(huán)境插入在將被執(zhí)行的動態(tài)程序語言指令(例如,Java程序或源代碼)和目標(biāo)執(zhí)行平臺(即,執(zhí)行動態(tài)程序的計算機的硬件和操作系統(tǒng))之間,或者說在兩者之間起到接口的作用,使得動態(tài)程序可以以與平臺無關(guān)的方式來執(zhí)行。動態(tài)程序語言指令(例如Java指令)不是被靜態(tài)編譯并直接鏈接到本機碼或機器碼以供目標(biāo)平臺(即,目標(biāo)處理系統(tǒng)或平臺的操作系統(tǒng)和硬件)執(zhí)行的。相反,動態(tài)程序語言指令被靜態(tài)編譯為中間語言(例如,字節(jié)碼),而中間語言可以被即時(just-in-time,orJIT)編譯器解釋或者接著編譯為可由目標(biāo)處理系統(tǒng)或平臺執(zhí)行的本機碼或機器碼。一般地,JIT編譯器是由容留在目標(biāo)處理平臺(例如計算機系統(tǒng))的操作系統(tǒng)中的運行時環(huán)境來提供的。因此,運行時環(huán)境,具體地說是JIT編譯器將與平臺無關(guān)的程序指令(例如,Java字節(jié)碼、公共中間語言或CIL等)翻譯成本機碼(即,可由底層的目標(biāo)處理系統(tǒng)或平臺執(zhí)行的機器碼)。為了提高整體性能,很多動態(tài)程序設(shè)計語言以及它們支持的受控運行時環(huán)境都提供能夠利用并發(fā)編程技術(shù)(例如,多線程技術(shù))的基礎(chǔ)結(jié)構(gòu)。具體地說,很多動態(tài)程序設(shè)計語言都利用同步關(guān)鍵字來提供語言級的并發(fā)編程支持,并利用同步原語提供運行時級的并發(fā)編程支持。軟件設(shè)計者一般在軟件對象內(nèi)使用同步,使得多個并發(fā)線程的執(zhí)行可以共享或訪問該對象及其變量,而不會引發(fā)沖突或爭用。例如,在全局可訪問對象(即,公共對象)的情形中,軟件設(shè)計者一般假定在運行時期間會發(fā)生沖突或爭用,并且在對象內(nèi)包括適當(dāng)?shù)耐讲僮?,以防止這樣的沖突或爭用。按照這種方式,軟件設(shè)計者可以保證全局可訪問對象是“線程安全的”(即,可以沒有沖突或爭用地被用于多線程運行時環(huán)境中)。此外,很多動態(tài)程序設(shè)計語言都為軟件設(shè)計者提供了一個或多個線程安全軟件對象庫,這些對象可以用在多線程運行時環(huán)境中,而沒有爭用或沖突之憂。不幸的是,與對象同步相關(guān)聯(lián)的處理開銷導(dǎo)致執(zhí)行時間的大幅減少。例如,在一些公知的Java應(yīng)用和基準(zhǔn)程序(benchmark)的情形中,同步開銷可能會占用整個執(zhí)行時間的10%到20%。此外,不管在運行時期間是否真的需要這種同步,同步通常都被用作在運行時期間防止發(fā)生爭用(特別是在對象庫的情形中)的防護措施。圖1是可被用來實現(xiàn)這里描述的去同步裝置和方法的示例性體系結(jié)構(gòu)的框圖。圖2圖示了一個示例性的高級同步代碼塊。圖3圖示了圖2中所示的同步代碼塊的一種示例性的低級形式。圖4圖示了一種示例性的高級同步方法。圖5圖示了圖4中所示的同步方法的一種示例性的低級形式。圖6是圖1中所示的即時編譯器可被配置來從面向?qū)ο蟮膽?yīng)用去除同步的示例性方式的流程圖。圖7是圖1中所示的即時編譯器可被配置來從面向?qū)ο蟮膽?yīng)用去除同步的示例性方式的更詳細(xì)流程圖。圖8是圖1中所示的即時編譯器可被配置來修改虛擬分派(dispatch)表的一種方式的更詳細(xì)實施例。圖9和10圖示了一種示例性的多態(tài)方法實現(xiàn)。圖11圖示了可與圖9和10中所示的示例性多態(tài)方法一同使用的示例性的虛擬分派表。圖12是圖9中所示的Derived2方法的進一步變體的示例性代碼。圖13是可以使用這里所描述的表切分技術(shù)來生成,以支持圖12中所示代碼的示例性虛擬分派表。圖14是可被用來實現(xiàn)這里所描述的裝置和方法的示例性的處理器系統(tǒng)。具體實施例方式圖1是可被用來實現(xiàn)這里描述的去同步裝置和方法的示例性體系結(jié)構(gòu)100的框圖。對于示例性的體系結(jié)構(gòu)100,由一種或多種動態(tài)程序設(shè)計語言和/或指令組成的一個或多個軟件應(yīng)用102被提供給語言編譯器104。應(yīng)用102可以使用與平臺無關(guān)的語言來編寫,例如Java或C#。然而,也可以使用其他動態(tài)的或與平臺無關(guān)的計算機語言或指令。另外,應(yīng)用102中的一些或全部可被存儲在將要執(zhí)行該應(yīng)用的系統(tǒng)內(nèi)。附加地或替換地,應(yīng)用中的一些或全部可被存儲在與將要執(zhí)行應(yīng)用102的系統(tǒng)相互分離(并且可能位于遠(yuǎn)端)的系統(tǒng)上。語言編譯器104靜態(tài)編譯應(yīng)用102中的一個或多個,以生成編譯后的代碼106。編譯后代碼106是以二進制格式存儲在存儲器(未示出)中的中間語言代碼或指令(例如,當(dāng)編譯后的應(yīng)用是用Java寫的時,是字節(jié)碼)。對于應(yīng)用102,編譯后代碼106可被本地存儲在將要在其上執(zhí)行編譯后代碼106的目標(biāo)系統(tǒng)108上。目標(biāo)系統(tǒng)108可以是下面參考圖114更詳細(xì)描述的計算機系統(tǒng)等。目標(biāo)系統(tǒng)108可以與一個或多個終端用戶等相關(guān)聯(lián)。附加地或替換地,編譯后代碼106可以經(jīng)由一條或多條通信鏈路被傳遞到目標(biāo)系統(tǒng)108,所述通信鏈路例如是局域網(wǎng)、因特網(wǎng)、蜂窩系統(tǒng)或其他無線通信系統(tǒng)等。編譯后代碼106的一個或多個部分(例如一個或多個軟件應(yīng)用)可以由目標(biāo)系統(tǒng)108來執(zhí)行。具體地說,操作系統(tǒng)110,例如Windows、Linux等容留可執(zhí)行編譯后代碼106的一個或多個部分的運行時環(huán)境112。例如,如果編譯后的代碼106包括Java字節(jié)碼,那么運行時環(huán)境112就是建立在執(zhí)行Java字節(jié)碼的Java虛擬機(JVM)等之上。運行時環(huán)境112將編譯后代碼106的一個或多個部分(即,中間語言指令或代碼)加載到運行時環(huán)境112可以訪問的存儲器(未示出)中。優(yōu)選地,運行時環(huán)境112將整個應(yīng)用(或者有可能是多個應(yīng)用)加載到所述存儲器中,并驗證編譯后的或中間語言代碼106的類型安全性。在應(yīng)用或者多個應(yīng)用被運行時環(huán)境112加載到存儲器中之后,與正在執(zhí)行的應(yīng)用所調(diào)用的、或者為執(zhí)行該應(yīng)用所需的方法或?qū)ο笙嚓P(guān)聯(lián)的中間語言指令可以由即時(JIT)編譯器114來處理。JIT編譯器114編譯中間語言指令,以生成由計算機系統(tǒng)108內(nèi)的一個或多個處理器(例如,圖14中所示的處理器1422)執(zhí)行的本機碼或機器碼。JIT編譯器114可以將本機碼(即,與計算機系統(tǒng)108兼容的,因而可由計算機系統(tǒng)108執(zhí)行的機器碼)存儲在JIT內(nèi)存緩存(JITIMC)116中。按照這種方式,運行時環(huán)境112可以重復(fù)使用被調(diào)用(invoke或call)一次以上的、與先前編譯的方法相關(guān)聯(lián)的本機碼。換言之,被編譯為本機碼并被存儲在JITIMC116中的中間語言指令可以被運行時環(huán)境112重復(fù)使用并執(zhí)行多次。雖然JITIMC116被描繪為運行時環(huán)境112內(nèi)的JIT編譯器114的一部分,但是JITIMC116的其他配置也是可能的。例如,JITIMC116可以是操作系統(tǒng)110所容留的其他運行時模塊、會話或環(huán)境(未示出)內(nèi)的另一個數(shù)據(jù)結(jié)構(gòu)的一部分。在其他實施例中,特別是涉及虛擬調(diào)用的實施例中,可以實現(xiàn)JITIMC116,使得與將被調(diào)用的方法相關(guān)聯(lián)的本機碼被存儲在公知的數(shù)據(jù)結(jié)構(gòu)中,例如虛擬分派表??偟膩碚f,動態(tài)程序設(shè)計語言例如Java提供兩種類型的使軟件設(shè)計者能夠生成線程安全碼或軟件對象的同步。如上所述,同步后的軟件對象一次僅可以由一個執(zhí)行線程來訪問,從而防止與該對象所使用的參數(shù)或變量相關(guān)的沖突或爭用的發(fā)生。換言之,全局對象以及可由一個以上的執(zhí)行線程訪問的其他對象可以通過引入軟件鎖定和解鎖機制而成為線程安全的,上述機制防止一個以上的線程訪問對象。一種這樣類型的同步使得代碼塊(即,一條或多條語句)被同步。另一種這樣類型的同步使得方法(即,對代碼塊的調(diào)用)被同步。動態(tài)程序設(shè)計語言為了同步代碼塊和方法,一般既提供高級或語言級同步語句,又提供低級或受控運行時級原語。例如,在Java的情況下,關(guān)鍵字“synchronized(已同步)”在語言級(即,高級)被用來宣告一個塊或方法將受到同步保護。另外,在Java的情況下,對應(yīng)于語言級關(guān)鍵字“synchronized”的低級或受控運行時原語是“monitorenter”和“monitorexit”。然而,為了簡化以下的討論,低級同步原語將被稱為“l(fā)ock(鎖定)”和“unlock(解鎖)”,而高級或語言級同步語句將使用關(guān)鍵字“synchronized”來表示。圖2圖示了一個示例性的高級同步代碼塊,而圖3圖示了圖2中所示的同步代碼塊的一種示例性的低級形式。從圖3中可以看出,圖2的關(guān)鍵字“synchronized”已被替換為“l(fā)ock”和“unlock”原語,這些原語封裝需要同步保護的代碼塊。圖4圖示了一種示例性的高級同步方法,而圖5圖示了圖4中所示的同步方法的一種示例性的低級形式。和前面一樣,關(guān)鍵字“synchronized”被替換為“l(fā)ock”和“unlock”原語,這些原語封裝需要同步保護的方法主體。圖6是圖1中所示的JIT編譯器114可被配置來從面向?qū)ο蟮膽?yīng)用去除同步的示例性方式的流程圖。圖6中所示的方法包括多個公知的JIT編譯階段,這些階段通常被稱為JIT編譯器114(圖1)的前端處理。具體地說,在JIT編譯處理的預(yù)通過(pre-pass)階段(框600)中,由JIT編譯器114(圖1)遍歷或掃描字節(jié)碼(例如,編譯后的代碼106),并收集諸如塊邊界、操作數(shù)堆棧深度等信息。在中間表示(IR)建立或構(gòu)造階段(框602)中,JIT編譯器114使用在預(yù)通過階段(框600)中收集的信息為每個基本代碼塊建立控制流圖和IR指令序列。另外,JIT編譯器114還可以在擴展基礎(chǔ)塊上執(zhí)行局部公共子表達(dá)式消元。在IR構(gòu)建(框602)之后,JIT編譯器114(圖1)執(zhí)行內(nèi)聯(lián)操作(inlining)(框604),其識別作為內(nèi)聯(lián)候選的調(diào)用地點(即,對象、方法等)。在執(zhí)行內(nèi)聯(lián)(框604)時,JIT編譯器114可以重復(fù)預(yù)通過和IR構(gòu)建階段(分別是框600和602),以混合將被內(nèi)聯(lián)的方法的中間表示和調(diào)用將被內(nèi)聯(lián)的方法的代碼的中間表示。與已知的JIT編譯器前端處理相反,JIT編譯器114(圖1)從已同步的代碼塊和/或方法調(diào)用中去除同步。下面結(jié)合圖7將更詳細(xì)地描述,JIT編譯器114判斷是否可以去除同步(框606),如果可以,則基于將被去除同步的代碼的特性,以不同的方式去除組成編譯后代碼106(圖1)的每個已同步的語句、語句塊和/或方法調(diào)用的同步,或者說使它們?nèi)ネ健@?,可以基于代碼是否與一個塊、方法調(diào)用等相關(guān)聯(lián),以不同的方式來執(zhí)行去同步??梢曰谝阎募夹g(shù)來判斷是否可以從編譯后的代碼中去除同步。例如,逸出(escape)技術(shù)是一種公知的完整程序分析,它可以用來識別可從中安全地去除同步(即,不會引發(fā)運行時爭用或沖突)的沒有爭用的非全局對象和/或全局對象。然而,用于判斷是否可從編譯后的動態(tài)代碼去除同步的逸出分析和其他技術(shù)的細(xì)節(jié)對本領(lǐng)域的技術(shù)人員來說是公知的,因而這里不再進一步描述。在確定無法去除同步(框606)之后或者在去除了同步(框608)之后,JIT編譯器114(圖1)確定是否有更多的語句或方法調(diào)用要被處理以去除同步(框610)。如果還有更多的語句或方法調(diào)用需要處理,則JIT編譯器114返回控制到框606。另一方面,如果已沒有多余的語句或方法調(diào)用需要處理(框610),則JIT編譯器114執(zhí)行全局優(yōu)化(框612)。如本領(lǐng)域的技術(shù)人員所公知的,當(dāng)執(zhí)行全局優(yōu)化時,JIT編譯器114執(zhí)行拷貝傳播、常數(shù)折疊、死碼消除和空指針校驗消除(nullpointercheckelimination)功能或活動。雖然未在圖6中示出,但是JIT編譯器114可以在完成全局優(yōu)化(框612)之后,使用多種公知的后端JIT編譯處理來繼續(xù)處理。圖7是圖1中所示的JIT編譯器114可被配置來從面向?qū)ο蟮膽?yīng)用或代碼中去除同步的示例性方式的更詳細(xì)流程圖。一開始,JIT編譯器114確定或檢測正被處理的代碼是否包括同步(框700)??偟膩碚f,例如通過判斷正被處理的代碼是否包含“l(fā)ock”或“unlock”原語,就可以檢測出同步。如果正被處理的代碼是基于Java的,則JIT編譯器114可以通過判斷是否存在原語“monitorenter”和“monitorexit”來做出這樣的判斷。如果JIT編譯器114在框700沒有檢測到同步,那么JIT編譯器114就在框700處等待。另一方面,如果JIT編譯器114在框700處檢測到同步,則JIT編譯器114判斷已同步的代碼是不是一個塊(即,一條或多條語句)。如果JIT編譯器114確定已同步的代碼是一個塊,則JIT編譯器114從正被處理的代碼中去除與“l(fā)ock”和“unlock”原語相關(guān)聯(lián)的操作(框704),從而消除該代碼的同步。在去除與“l(fā)ock”和“unlock”原語相關(guān)聯(lián)的操作后,JIT編譯器114可以在正被處理的塊之前和/或之后插入存儲器壁壘(框706)(即,填充物(filler)),以保持與正被處理的代碼類型相關(guān)聯(lián)的存儲器模型(例如,如果正在處理的是基于Java的代碼,就是Java存儲器模型)所需的存儲器一致性。在某些情形中,有效的同步消除可能隨后又變成無效的(例如,在使用動態(tài)類加載的情形中)。在這些情形中,可以在正被處理的塊之前和/或之后插入某種填充間隔,從而使得該填充間隔可被修補回(patchedback)與“l(fā)ock”和“unlock”原語相關(guān)聯(lián)的操作。在JIT編譯器114確定正在處理的代碼不是已同步的塊(框702)的情況下,已同步的方法調(diào)用正在被處理,并且JIT編譯器114接著確定該已同步的方法調(diào)用是否被分類為虛擬(即,后期綁定)調(diào)用(框708)。眾所公知,在后期綁定調(diào)用的情況下,與正被調(diào)用的代碼相關(guān)聯(lián)的地址在JIT編譯器114進行編譯時是未知的。對于基于Java的代碼,包括語言,“invokevirtual”或“invokeinterface”是使用虛擬分派表來調(diào)用的虛擬調(diào)用。虛擬分派表使得JIT編譯器能夠索引到在運行時與虛擬方法調(diào)用相關(guān)聯(lián)的適當(dāng)?shù)目蓤?zhí)行代碼部分。另一方面,包括語言“invokestatic”或“invokespecial”的基于Java的代碼不是虛擬調(diào)用,因而在編譯時包括地址信息。如果JIT編譯器114(圖1)在框708(圖7)處確定所述方法調(diào)用不是后期綁定,則該方法調(diào)用是早期綁定的(即,與被調(diào)用的代碼或目標(biāo)代碼相關(guān)聯(lián)的地址在語言編譯時是已知的),并且JIT編譯器114克隆該方法而無需同步語句(框710)。在克隆所述方法時,JIT編譯器114可以拷貝該方法,但省掉同步語句。可替換地,假如該方法不包括同步語言,則JIT編譯器114可以只是重新編譯該方法。無論如何,在克隆了所述方法(框710)之后,JIT編譯器114就用所克隆方法的代碼地址來替換調(diào)用目標(biāo)地址(即,去同步的方法的地址)(框712)。如果JIT編譯器114在框708處確定正在處理的代碼是后期綁定的(例如,包括虛擬方法調(diào)用),則JIT編譯器114修改與該方法相關(guān)聯(lián)的虛擬分派表(框714),并且使方法調(diào)用地址發(fā)生偏移(框716),后面將進一步地描述。然而,在討論JIT編譯器114修改虛擬分派表(框714)并且使方法調(diào)用發(fā)生偏移(框716)的方式之前,下面將簡要討論后期綁定方法或虛擬調(diào)用。虛擬分派表通常被稱為vtable,它是每個類對象的頭部中的結(jié)構(gòu),其包含與實現(xiàn)在接口中的屬性和方法相關(guān)聯(lián)的實際代碼的存儲器地址。vtable可以以圖表形式表示為一列用于構(gòu)成軟件對象的代碼(例如,一個方法或一個集合的代碼語句)的索引地址。用于調(diào)用虛擬調(diào)用的代碼一般使用語言“call[vtable+offset]”來表示,其中“vtable”是接收方(即,正被調(diào)用的對象)的地址,而“offset”是vtable內(nèi)用于正被調(diào)用的具體方法的對象的索引?;谠谶\行時完成調(diào)用的方式,虛擬調(diào)用是多態(tài)的(即,可以具有超出行為、響應(yīng)或?qū)崿F(xiàn)的東西)。結(jié)果,根據(jù)接收方的運行時類型,虛擬調(diào)用可具有多個目標(biāo)。圖8是描繪JIT編譯器114(圖1)可被配置來完成與圖7的框714相關(guān)聯(lián)的虛擬分派表(vtable)修改的示例性方式的更詳細(xì)的流程圖。一開始,JIT編譯器114(圖1)獲得與正被處理的虛擬調(diào)用相關(guān)聯(lián)的vtable(框800)。在獲得要處理的vtable后,JIT編譯器114創(chuàng)建與該vtable相關(guān)聯(lián)的代碼的非同步版本(框802)。通過以與圖7的框710相似或相同的方式在無同步的情況下克隆方法,可以生成所述非同步版本。在生成了非同步代碼后,JIT編譯器114判斷在框800處獲得的vtable中的條目數(shù)(N)是否大于在JIT編譯處理前所確定的、在與當(dāng)前正被處理的方法相關(guān)聯(lián)的任何vtable中所能找到的最大條目數(shù)(M)(框804)。如果N小于或等于M,則JIT編譯器114將正被處理的vtable擴展M個條目(即,向代表vtable的一列索引條目添加或附加M行)(框806)。在擴展了正被處理的vtable(框806)后,JIT編譯器114將非同步代碼的地址存儲在vtable的最后N個條目中(框808),從而造成中間的M-N個條目未被使用。然后,JIT編譯器114判斷是否還存在其他的與正被處理的方法相關(guān)聯(lián)的vtable(框810)。如果至少還有一個剩余的vtable,則JIT編譯器114返回到框800。否則,JIT編譯器114將控制返回到圖7的框716。如果JIT編譯器114在框804處確定與正被處理的vtable相關(guān)聯(lián)的條目數(shù)(N)大于M(它是在語言編譯時確定的),則JIT編譯器114將vtable切割成具有M個條目的多段(框812)。當(dāng)然,如果條目的總數(shù)(即N)不是M的整數(shù)倍,那么這些段之一的條目數(shù)將少于M。實際上,如果正被處理的代碼支持動態(tài)類加載,那么N可以超過M。在動態(tài)類加載的環(huán)境中,用于新加載的類(即,對象)的vtable可以超過值M,M是在語言編譯時(即,在新的類被加載的時間之前)確定的。無論如何,在JIT編譯器114(圖1)將正被處理的vtable切割成M大小的多段(框812)后,每一段都被擴展M個條目(框814),并且非同步代碼的地址被存儲在每個vtable段的最后M個條目中(框816)。然后,JIT編譯器114將擴展后的vtable段級聯(lián)成單個vtable(框818),并且檢查是否還有另一個vtable要處理(框810)。為了更好地理解在圖7和8中描繪并且在上面描述的示例性方法使虛擬方法調(diào)用(即,后期綁定調(diào)用)去同步的方式,下面參考圖9-13來描述示例性的方法代碼及相關(guān)的vtable布局。圖9和10描繪了一種示例性的多態(tài)方法,圖11描繪了當(dāng)使圖9和10的示例性代碼去同步時,由圖8中所示的示例性方法生成的修改后的vtable。為了圖9-11的示例性目的,不支持動態(tài)類加載,因而圖11中所示的每個vtable的值N不可能大于在語言編譯時確定的vtable條目的最大數(shù)目(M)。參考圖9和10,第一或父對象900定義了一個類“Base”,被稱為“Derived”的第一子類對象902覆蓋在“Base”之上,被稱為“Derived2”的第二子類對象904覆蓋在“Base”之上。在圖9的實施例中,“Base”和“Derived”實現(xiàn)方法“foo”的同步版本,“Derived2”實現(xiàn)方法“foo”的非同步版本。因而,當(dāng)JIT編譯器114(圖1)編譯圖10中所示的代碼時,語句“b.foo()”被編譯為“invokevirtualBase.foo”,它可以調(diào)用(invoke或call)三個可能的目標(biāo)(即,“Base.foo”、“Derived.foo”和“Derived2.foo”)。圖11中所示的對應(yīng)于各個目標(biāo)“Base.foo”、“Derived.foo”和“Derived2”的原始vtable部分1100、1102和1104(下面會更詳細(xì)地討論)使得虛擬調(diào)用“invokevirtualBase.foo”能夠以多態(tài)的方式來進行。具體地說,因為對于每種實現(xiàn)(即,“Base.foo”、“Derived.foo”和“Derived2.foo”)而言,方法“foo”被放在各自的vtable中的相同索引(即,“i”)處,所以實現(xiàn)了多態(tài)性。因而,如果JIT編譯器114(圖1)從虛擬調(diào)用或多態(tài)方法(例如圖9和10中所示的實施例)中去除同步,那么該去除過程在不同實現(xiàn)的各自vtable之間保持了與這些不同實現(xiàn)相關(guān)聯(lián)的代碼的關(guān)系。換言之,多態(tài)方法的不同實現(xiàn)位于各個vtable內(nèi)的相同索引位置處。此外,用來從虛擬方法調(diào)用中去除同步的同步去除過程必須確保在運行時調(diào)用的所有實現(xiàn)不被同步。為了保持vtable關(guān)系并且確保在運行時調(diào)用的所有實現(xiàn)不被同步,JIT編譯器114修改與虛擬方法的(多種)實現(xiàn)相關(guān)聯(lián)的vtable的布局(圖7的框714)。如參考圖8所述,vtable修改包括與正在處理的方法調(diào)用相關(guān)聯(lián)的一個或多個vtable的擴展以及某些情況下的切割。繼續(xù)圖9-11中的實施例,JIT編譯器114將擴展部分1106、1108和1110附加到各自的原始vtable部分1100-1104后面。具體地說,對vtable進行擴展,使得如果原始部分包括N個條目,則附加的M個條目被附到表的后面,以形成總共N+M個條目。值M通常被選擇得足夠大,以適用于所有可能的對象類型。換言之,因為值N(即,原始vtable部分中的條目數(shù))可以隨vtable而不同,所以值M(對所有的vtable都相同)可被選擇為總是大于最大的N??商鎿Q地,M可被選擇為使未使用的空間最小化(與單純最大化相反)。例如,設(shè)置M=1將產(chǎn)生這樣一種vtable布局,其中原始代碼和非同步代碼在表內(nèi)是鄰接的(即,在原始代碼和非同步代碼之間沒有未使用的空間)。對于圖11中所示的每個vtable,最初的N個條目與原始部分(即,1100-1104部分)相關(guān)聯(lián),最后的N個條目包含與原始部分定址到的方法的非同步版本相關(guān)聯(lián)的地址,而中間的M-N個條目未被使用。因而,在每個vtable內(nèi),由原始部分定址到的方法的非同步版本總是位于索引i+M處,其中“i”是與原始部分相關(guān)聯(lián)的方法地址的索引位置。按上述方式修改vtable(圖7的框714)的結(jié)果就是,通過經(jīng)由附加的偏移(offset)將虛擬調(diào)用變換成“call[vtable+offset+M]”,從而保證無論在運行時期間調(diào)用什么樣的方法實現(xiàn),所調(diào)用方法的非同步版本或?qū)崿F(xiàn)都將被調(diào)用,JIT編譯器114(圖1)可以有效地從已同步的虛擬方法調(diào)用中去除同步。圖12和13提供了示例性的代碼,如果支持動態(tài)類加載,則該代碼將導(dǎo)致在圖8的框804處N大于M,從而致使JIT編譯器114(圖1)執(zhí)行與圖8的框812-816相關(guān)聯(lián)的功能。具體地說,如果在圖9和10中所示的代碼已被編譯后加入類“Derived3”,則與用于“Derived3”的原始vtable相關(guān)聯(lián)的條目數(shù)N將超過為圖11中所示的vtable計算出的值M。結(jié)果,當(dāng)JIT編譯器114使圖12中所示的代碼去同步時,它通過執(zhí)行與圖8的框812-818相關(guān)聯(lián)的功能,生成圖13中所示的vtable。這里描述的去同步技術(shù)可以通過恢復(fù)所有在先的同步語義而被輕松地逆轉(zhuǎn)。例如,在支持動態(tài)類加載的情況下,新類的加載可以使先前生成的同步去除分析(例如,逸出分析)結(jié)果(這些結(jié)果需要去同步代碼的重新同步)無效。在去同步塊的情形中,同步語句可被重新插入到它們被從中去除的代碼區(qū)域中。在早期綁定調(diào)用的情形中,目標(biāo)代碼地址可以被修補回原始目標(biāo)代碼地址。在后期綁定調(diào)用的情形中,“call[vtable+offset+M]”可以被修補成“call[vtable+offset]”。圖14是可用來實現(xiàn)這里所描述的裝置和方法的示例性處理器系統(tǒng)1420的框圖。如圖14所示,處理器系統(tǒng)1420包括被耦合到互連總線或網(wǎng)絡(luò)1424的處理器1422。處理器1422可以是任何適當(dāng)?shù)奶幚砥?、處理單元或微處理器,例如IntelItanium系列、IntelX-Scale系列、IntelPentium系列等當(dāng)中的處理器。雖然未在圖14中示出,但是系統(tǒng)1420可以是一個多處理器系統(tǒng),因而可以包括一個或多個與處理器1422相同或相似的附加處理器,這些處理器可被耦合到互連總線或網(wǎng)絡(luò)1424。圖14的處理器1422被耦合到芯片組1428,該芯片組包括存儲器控制器1430和輸入/輸出(I/O)控制器1432。眾所公知,芯片組一般提供I/O和存儲器管理功能以及多種通用和/或?qū)S眉拇嫫?、定時器等,這些器件由耦合到該芯片組的一個或多個處理器來訪問或使用。存儲器控制器1430實現(xiàn)的功能是使處理器1422(如果有多個處理器則是使多個處理器)能夠訪問系統(tǒng)存儲器1434,系統(tǒng)存儲器1434可以包括任何需要類型的易失性存儲器,例如靜態(tài)隨機訪問存儲器(SRAM)、動態(tài)隨機訪問存儲器(DRAM)等。I/O控制器1432實現(xiàn)的功能是使處理器1422能夠經(jīng)由I/O總線1440與外圍輸入/輸出(I/O)設(shè)備1436和1438通信。I/O設(shè)備1436和1438可以是任何需要類型的I/O設(shè)備,例如鍵盤、視頻顯示器或監(jiān)視器、鼠標(biāo)等。雖然在圖14中存儲器控制器1430和I/O控制器1432被描繪為芯片組1428內(nèi)的獨立功能塊,但是這些功能塊所完成的功能可以被集成在一個半導(dǎo)體電路內(nèi),或者可以使用兩個或更多個獨立的集成電路來實現(xiàn)。雖然這里已描述了某些方法、裝置和制品,但是本發(fā)明的覆蓋范圍不限于此。相反,本發(fā)明覆蓋按字面意義或等同原則落入所附權(quán)利要求書的范圍內(nèi)的所有方法、裝置和制品。權(quán)利要求1.一種使程序代碼去同步的方法,所述方法包括在所述程序代碼的即時編譯期間,確定所述程序代碼的類型;以及基于所述程序代碼的類型,在所述程序代碼的即時編譯期間修改所述程序代碼,以使所述程序代碼去同步。2.如權(quán)利要求1所述的方法,其中所述程序代碼的類型是塊和方法之一。3.如權(quán)利要求1所述的方法,其中所述程序代碼的類型是早期綁定方法調(diào)用和后期綁定方法調(diào)用之一。4.如權(quán)利要求1所述的方法,其中所述程序代碼包括同步關(guān)鍵字、同步語句和同步原語中的至少一個。5.如權(quán)利要求1所述的方法,其中所述程序代碼與動態(tài)程序設(shè)計語言相關(guān)聯(lián)。6.如權(quán)利要求5所述的方法,其中所述動態(tài)程序設(shè)計語言是基于Java的。7.如權(quán)利要求1所述的方法,其中修改所述程序代碼的操作包括從所述程序代碼中去除鎖定函數(shù)和解鎖函數(shù)的至少一個。8.如權(quán)利要求7所述的方法,還包括在從所述程序代碼中去除鎖定函數(shù)和解鎖函數(shù)的所述至少一個后,在所述程序代碼中插入至少一個存儲器壁壘。9.如權(quán)利要求1所述的方法,其中修改所述程序代碼的操作包括不帶同步地克隆所述程序代碼,以形成去同步的程序代碼。10.如權(quán)利要求9所述的方法,還包括用與所述去同步的程序代碼相關(guān)聯(lián)的地址來替換所述程序代碼的調(diào)用目標(biāo)地址。11.如權(quán)利要求1所述的方法,其中修改所述程序代碼的操作包括修改虛擬分派表。12.如權(quán)利要求11所述的方法,還包括使與所述程序代碼相關(guān)聯(lián)的虛擬分派表調(diào)用發(fā)生偏移,以引用所述虛擬分派表的修改部分。13.如權(quán)利要求11所述的方法,其中修改所述虛擬分派表的操作包括將所述虛擬分派表擴展預(yù)定數(shù)量的條目,以形成擴展虛擬分派表。14.如權(quán)利要求13所述的方法,還包括在所述擴展虛擬分派表內(nèi)的最后一組條目中存儲與所述程序代碼的去同步版本相關(guān)聯(lián)的地址。15.如權(quán)利要求11所述的方法,其中修改所述虛擬分派表的操作包括將所述虛擬分派表切割成多段,并且將每一段擴展預(yù)定數(shù)量的條目,以形成多個擴展虛擬分派表段。16.如權(quán)利要求15所述的方法,還包括在每一個所述擴展虛擬分派表段中存儲與所述程序代碼的去同步部分相關(guān)聯(lián)的地址。17.如權(quán)利要求16所述的方法,還包括級聯(lián)所述多個擴展虛擬分派表段,以形成擴展虛擬分派表。18.一種計算機系統(tǒng),包括存儲器;以及耦合到所述存儲器并且能夠執(zhí)行包括即時編譯器的受控運行時環(huán)境的處理器,其中所述即時編譯器被配置為在程序代碼的即時編譯期間,確定所述程序代碼的類型;以及基于所述程序代碼的類型,在所述程序代碼的即時編譯期間修改所述程序代碼,以使所述程序代碼去同步。19.如權(quán)利要求18所述的計算機系統(tǒng),其中所述程序代碼的類型是塊和方法之一。20.如權(quán)利要求18所述的計算機系統(tǒng),其中所述程序代碼的類型是早期綁定方法調(diào)用和后期綁定方法調(diào)用之一。21.如權(quán)利要求18所述的計算機系統(tǒng),其中所述程序代碼包括同步關(guān)鍵字、同步語句和同步原語中的至少一個。22.如權(quán)利要求18所述的計算機系統(tǒng),其中所述程序代碼與動態(tài)程序設(shè)計語言相關(guān)聯(lián)。23.如權(quán)利要求22所述的計算機系統(tǒng),其中所述動態(tài)程序設(shè)計語言是基于Java的。24.如權(quán)利要求18所述的計算機系統(tǒng),其中所述即時編譯器被配置為通過從所述程序代碼中去除鎖定函數(shù)和解鎖函數(shù)的至少一個來修改所述程序代碼。25.如權(quán)利要求24所述的計算機系統(tǒng),其中所述即時編譯器被配置為在從所述程序代碼中去除鎖定函數(shù)和解鎖函數(shù)的所述至少一個后,在所述程序代碼中插入至少一個存儲器壁壘。26.如權(quán)利要求18所述的計算機系統(tǒng),其中所述即時編譯器被配置為通過不帶同步地克隆所述程序代碼以形成去同步的程序代碼,來修改所述程序代碼。27.如權(quán)利要求26所述的計算機系統(tǒng),其中所述即時編譯器被配置為用與所述去同步的程序代碼相關(guān)聯(lián)的地址來替換所述程序代碼的調(diào)用目標(biāo)地址。28.如權(quán)利要求18所述的計算機系統(tǒng),其中所述即時編譯器被配置為通過修改虛擬分派表來修改所述程序代碼。29.如權(quán)利要求28所述的計算機系統(tǒng),其中所述即時編譯器被配置為使與所述程序代碼相關(guān)聯(lián)的虛擬分派表調(diào)用發(fā)生偏移,以引用所述虛擬分派表的修改部分。30.如權(quán)利要求28所述的計算機系統(tǒng),其中所述即時編譯器被配置為通過將所述虛擬分派表擴展預(yù)定數(shù)量的條目以形成擴展虛擬分派表,來修改所述虛擬分派表。31.如權(quán)利要求30所述的計算機系統(tǒng),其中所述即時編譯器被配置為在所述擴展虛擬分派表內(nèi)的最后一組條目中存儲與所述程序代碼的去同步版本相關(guān)聯(lián)的地址。32.如權(quán)利要求28所述的計算機系統(tǒng),其中所述即時編譯器被配置為通過將所述虛擬分派表切割成多段,并且將每一段擴展預(yù)定數(shù)量的條目,以形成多個擴展虛擬分派表段,來修改所述虛擬分派表。33.如權(quán)利要求32所述的計算機系統(tǒng),其中所述即時編譯器被配置為在每一個所述擴展虛擬分派表段中存儲與所述程序代碼的去同步部分相關(guān)聯(lián)的地址。34.如權(quán)利要求33所述的計算機系統(tǒng),其中所述即時編譯器被配置為級聯(lián)所述多個擴展虛擬分派表段,以形成擴展虛擬分派表。35.一種其上存儲有指令的機器可訪問介質(zhì),所述指令在被執(zhí)行時致使機器在程序代碼的即時編譯期間,確定所述程序代碼的類型;以及基于所述程序代碼的類型,在所述程序代碼的即時編譯期間修改所述程序代碼,以使所述程序代碼去同步。36.如權(quán)利要求35所述的機器可訪問介質(zhì),其中同步的程序代碼與動態(tài)程序設(shè)計語言相關(guān)聯(lián)。37.如權(quán)利要求36所述的機器可訪問介質(zhì),其中所述動態(tài)程序設(shè)計語言是基于Java的。38.如權(quán)利要求35所述的其上存儲有指令的機器可訪問介質(zhì),所述指令在被執(zhí)行時致使所述機器通過從所述程序代碼中去除鎖定函數(shù)和解鎖函數(shù)的至少一個來修改所述程序代碼。39.如權(quán)利要求35所述的其上存儲有指令的機器可訪問介質(zhì),所述指令在被執(zhí)行時致使所述機器通過不帶同步地克隆所述程序代碼以形成去同步的程序代碼,來修改所述程序代碼。40.如權(quán)利要求35所述的其上存儲有指令的機器可訪問介質(zhì),所述指令在被執(zhí)行時致使所述機器通過修改虛擬分派表來修改所述程序代碼。41.如權(quán)利要求40所述的其上存儲有指令的機器可訪問介質(zhì),所述指令在被執(zhí)行時,使與所述程序代碼相關(guān)聯(lián)的虛擬分派表調(diào)用發(fā)生偏移,以引用所述虛擬分派表的修改部分。42.如權(quán)利要求40所述的其上存儲有指令的機器可訪問介質(zhì),所述指令在被執(zhí)行時,通過將所述虛擬分派表擴展預(yù)定數(shù)量的條目以形成擴展虛擬分派表,來修改所述虛擬分派表。43.如權(quán)利要求42所述的其上存儲有指令的機器可訪問介質(zhì),所述指令在被執(zhí)行時,在所述擴展虛擬分派表內(nèi)的最后一組條目中存儲與所述程序代碼的去同步版本相關(guān)聯(lián)的地址。44.如權(quán)利要求40所述的其上存儲有指令的機器可訪問介質(zhì),所述指令在被執(zhí)行時,通過將所述虛擬分派表切割成多段,并且將每一段擴展預(yù)定數(shù)量的條目,以形成多個擴展虛擬分派表段,來修改所述虛擬分派表。45.如權(quán)利要求44所述的其上存儲有指令的機器可訪問介質(zhì),所述指令在被執(zhí)行時,在每一個所述擴展虛擬分派表段中存儲與所述程序代碼的去同步部分相關(guān)聯(lián)的地址。46.如權(quán)利要求45所述的其上存儲有指令的機器可訪問介質(zhì),所述指令在被執(zhí)行時致使所述機器級聯(lián)所述多個擴展虛擬分派表段,以形成擴展虛擬分派表。全文摘要公開了用于在受控運行時環(huán)境中使面向?qū)ο蟮能浖?yīng)用去同步的裝置和方法。用于使同步的程序代碼去同步的裝置和方法在所述程序代碼的即時編譯期間確定所述程序代碼的類型,并且基于所述程序代碼的類型,在所述程序代碼的即時編譯期間修改所述程序代碼,以使所述程序代碼去同步。文檔編號G06F9/46GK1813243SQ200480018456公開日2006年8月2日申請日期2004年3月19日優(yōu)先權(quán)日2003年4月30日發(fā)明者吳甘沙,路奎元,石小華申請人:英特爾公司
      網(wǎng)友詢問留言 已有0條留言
      • 還沒有人留言評論。精彩留言會獲得點贊!
      1