專利名稱::二進制翻譯器中線程共享目標(biāo)本地碼緩存替換方法及系統(tǒng)的制作方法
技術(shù)領(lǐng)域:
:本發(fā)明涉及二進制翻譯器,尤其涉及二進制翻譯器中線程共享codecache(目標(biāo)本地碼緩存)的替換方法及系統(tǒng)。
背景技術(shù):
:二進制翻譯是解決軟件移植問題中的一種重要技術(shù),它可以將一種指令集體系結(jié)構(gòu)(ISA)上的可執(zhí)行程序翻譯到另一種指令集體系結(jié)構(gòu)的計算機上執(zhí)行,并且具備很高的執(zhí)行效率。二進制翻譯現(xiàn)也經(jīng)常用來將一種ISA上的可執(zhí)行程序翻譯到同種ISA的較高版本上執(zhí)行,以在同一個系列的計算機中使用高檔次的機器高效地運行低檔次機器上開發(fā)的軟件。特別是隨著虛擬機技術(shù)的普及,二進制翻譯技術(shù)的重要性也越來越大,很多虛擬機軟件中都不同程度的運用了二進制翻譯技術(shù)以保障虛擬機的運行效率。許多多線程應(yīng)用屬于大型應(yīng)用,由于二進制翻譯過程會帶來一定程度的代碼膨脹,普通大小的codecache己經(jīng)無法滿足多線程程序的需要,如果不限制codecache的大小并采取一定的替換策略,將會造成內(nèi)存空間大量占用,由操作系統(tǒng)進行虛存管理的過程將對虛擬機的性能產(chǎn)生極大的影響。所以針對多線程程序codecache的管理策略進行研究成為支持多線程程序以及提高程序性能的關(guān)鍵。針對多線程程序的codecache管理主要有兩種方法線程獨立和線程共享。線程獨立的codecache實現(xiàn)較簡單,codecache管理帶來的競爭相對較小,而且能帶來較好的程序局部性,但是線程獨立的codecache卻會增大翻譯的開銷,因為即使不同的線程執(zhí)行同樣的x86代碼,由于每個線程的codecache是獨立的,我們也需要重新翻譯并為每個線程生成本地碼。同樣它也會帶來更大的代碼膨脹。線程共享的cache管理則較容易將帶來線程間同步和競爭的開銷,這個開銷來源于分配本地碼空間,以及翻譯出來的本地碼達到cache容量的上限時需要清除本地碼所帶來的線程掛起的開銷。而且直觀的來看由于不同的線程都同時使用了一塊codecache,代碼的排列的局部性將會受到影響。但是線程共享的codecache卻可以最大地減少翻譯的開銷。因為一個線程翻譯出來的本地碼也可以被另一個線程訪問到。這樣代碼膨脹率較線程獨立的codecache小。那么選擇線程獨立還是線程共享的管理策略的關(guān)鍵還是取決于我們所翻譯的目標(biāo)應(yīng)用程序的特征。如果各個線程之間共享代碼的比例不高,那么采用線程獨立的codecache就可以了,例如各種桌面應(yīng)用。如果各個線程之間共享代碼的比例較高,那么采用線程共享的codecache較好。例如大型的Server應(yīng)用。對于Server類的應(yīng)用程序來說,線程共享的codecache對性能尤為關(guān)鍵。因為這樣的程序往往基于multi-threaded的結(jié)構(gòu)。線程數(shù)目多,線程之間共享的比例較高。如果采用線程獨立的codecache將會造成大量的性能下降。因此線程共享的codecache替換算法將使二進制翻譯器適應(yīng)大多數(shù)的大型多線程應(yīng)用。
發(fā)明內(nèi)容為了解決上述的技術(shù)問題,提供了二進制翻譯器中線程共享codecache的替換方法及系統(tǒng),其目的在于,針對多線程共享的codecache,當(dāng)其容量達到上限的時候?qū)ζ溥M行替換,并通過高效地管理本地碼的手段來提高翻譯多線程程序的性能,在保持線程并發(fā)的基礎(chǔ)上保證了較低的codecache管理開銷,同時達到較低的失效率以及較高的代碼局部性。本發(fā)明提供了二進制翻譯器中線程共享codecache的替換方法,包括步驟10,將本地碼空間劃分成N個相同大小的可替換單元和一個永不替換單元,N為自然數(shù);可替換單元用于進行普通本地碼的分配以及實施替換策略,永不替換單元用來保存與線程同步相關(guān)的本地碼;步驟20,從當(dāng)前可替換單元中分配本地碼,直到當(dāng)前可替換單元的容量達到上限時再從下一個可替換單元開始分配本地碼;步驟30,當(dāng)本地碼空間達到容量的上限時,以可替換單元為單位按照先進先出策略進行本地碼替換。步驟10中,本地碼空間是二進制翻譯器事先分配好的一段內(nèi)存空間。可替換單元中含有多個基本塊的本地碼。步驟20中,在可替換單元內(nèi)和可替換單元間都對每個基本塊進行本地碼鏈接。步驟30中,在進行本地碼替換時,將N個可替換單元組成循環(huán)鏈表,按照先進先出的順序,每次替換一個可替換單元的本地碼。與線程同步相關(guān)的本地碼為含有系統(tǒng)調(diào)用或者同步指令的基本塊生成的本地碼。步驟30中,在替換本地碼空間時,需要保證沒有線程正在將要被替換的可替換單元中執(zhí)行。在替換本地碼空間時,保證沒有線程正在將要被替換的可替換單元中執(zhí)行的步驟包括步驟301,阻止線程進入將要被替換的可替換單元;步驟302,根據(jù)每個線程的當(dāng)前執(zhí)行指令地址,等待線程從將要被替換的可替換單元中退出;步驟303,清空將要被替換的可替換單元。步驟301包括步驟3011,將本地碼在本可替換單元中的基本塊的本地碼地址在哈希表中失效,使得二進制翻譯器不能從哈希表中訪問到本可替換單元中的所有基本塊;步驟3012,如果跳轉(zhuǎn)指令的目標(biāo)指令地址在將要替換的可替換單元中,則要斷開跳轉(zhuǎn)指令所在基本塊跟將要替換的可替換單元的本地碼鏈接。步驟302包括步驟3021,斷開將要替換的可替換單元中本地碼鏈接的回邊鏈接,使將要替換的可替換單元中的循環(huán)盡快退出;步驟3022,等待至將要替換的可替換單元中的線程全部退出。本發(fā)明提供了二進制翻譯器中線程共享codecache的替換系統(tǒng),包括替換單元劃分模塊,用于將本地碼空間劃分成N個相同大小的可替換單元和一個永不替換單元,N為自然數(shù);可替換單元用于進行普通本地碼的分配以及實施替換策略,永不替換單元用來保存與線程同步相關(guān)的本地碼;本地碼分配模塊,用于從當(dāng)前可替換單元中分配本地碼,直到當(dāng)前可替換單元的容量達到上限時再從下一個可替換單元開始分配本地碼;本地碼替換模塊,當(dāng)本地碼空間達到容量的上限時,以可替換單元為單位按照先進先出策略進行本地碼替換。本地碼空間是二進制翻譯器事先分配好的一段內(nèi)存空間??商鎿Q單元中含有多個基本塊的本地碼。本地碼分配模塊,還用于在可替換單元內(nèi)和可替換單元間都對每個基本塊進行本地碼鏈接。本地碼替換模塊,還用于在進行本地碼替換時,將N個可替換單元組成循環(huán)鏈表,按照先進先出的順序,每次替換一個可替換單元的本地碼。與線程同步相關(guān)的本地碼為含有系統(tǒng)調(diào)用或者同步指令的基本塊生成的本地碼。本地碼替換模塊,還用于保證沒有線程正在將要被替換的可替換單元中執(zhí)行。本地碼替換模塊,還用于阻止線程進入將要被替換的可替換單元,根據(jù)每個線程的當(dāng)前執(zhí)行指令地址等待線程從將要被替換的可替換單元中退出,清空將要被替換的可替換單元,以保證沒有線程正在將要被替換的可替換單元中執(zhí)行。本地碼替換模塊,還用于將本地碼在本可替換單元中的基本塊的本地碼地址在哈希表中失效,使得二進制翻譯器不能從哈希表中訪問到本可替換單元中的所有基本塊;如果跳轉(zhuǎn)指令的目標(biāo)指令地址在將要替換的可替換單元中,則要斷開跳轉(zhuǎn)指令所在基本塊跟將要替換的可替換單元的本地碼鏈接。本地碼替換模塊,還用于斷開將要替換的可替換單元中本地碼鏈接的回邊鏈接,使將要替換的可替換單元中的循環(huán)盡快退出;等待至將要替換的可替換單元中的線程全部退出。本發(fā)明提出并實現(xiàn)了多線程codecache的替換方案。這種替換方案可廣泛適用于各種體系結(jié)構(gòu)之上的二進制翻譯器中。通過在跨越Unit的時候更新當(dāng)前執(zhí)行指令地址的信息并在替換的時候等待目標(biāo)Unit中的線程退出,不在目標(biāo)Unit中的線程可以并發(fā)執(zhí)行。這種方法在開銷較小的同時保證了線程的并發(fā)性。采用無鎖哈希表和全局鎖的粒度控制等手段保證了在二進制翻譯系統(tǒng)中進行高效率的同步。圖1是本發(fā)明的包含codecache管理的二進制翻譯器的控制流程圖;圖2是本發(fā)明的按照Unit劃分的codecache的示意圖;圖3是本發(fā)明的作為基本塊結(jié)束的本地碼指令序列的示意圖;圖4是本發(fā)明的checkstub中更新當(dāng)前本地碼指令地址信息并檢查跳轉(zhuǎn)的目標(biāo)Unit的有效性的示意圖5是本發(fā)明的二進制翻譯系統(tǒng)中使用鎖的有向無環(huán)圖的示意圖。具體實施例方式本發(fā)明提供了一種基于分Unit(單元)的FIFO(先進先出)替換策略的codecache替換方法,包括步驟1),將本地碼空間劃分成N個相同大小的Unit和一個永不替換的Unito步驟2),每次從當(dāng)前Unit中分配本地碼,直到當(dāng)前Unit的容量達到上限時再從下一個Unit開始分配本地碼。步驟3),當(dāng)本地碼空間達到容量的上限時,以Unit為單位按照FIFO策略進行本地碼替換。所述的步驟l)中,本地碼空間是二進制翻譯器事先分配好的一段內(nèi)存空間。所述的步驟2)中,每次只為從一個基本塊翻譯出來的本地碼分配本地碼空間,因此一個Unit中含有許多個基本塊的本地碼。所述的步驟2)中,為了減小本地碼和運行時系統(tǒng)間的上下文切換開銷,在Unit內(nèi)和Unit間都對每個基本塊進行本地碼鏈接。所述的步驟3)中,在進行本地碼替換時,將N個Unit組成循環(huán)鏈表,按照先進先出的順序,每次替換一個Unit的本地碼。下面結(jié)合附圖對本發(fā)明做進一步描述。圖1包括了動態(tài)二進制翻譯器中與codecache的一些關(guān)鍵操作。動態(tài)二進制翻譯器啟動的時候用源平臺的指令地址查詢哈希表,當(dāng)哈希表不命中時,翻譯器從源平臺的指令地址開始翻譯,并且查詢是否有足夠的空間來分配目標(biāo)9本地碼。如果空間不足,那么CodeCache管理器將進行本地碼替換,直至釋放出足夠的空間。然后翻譯器將生成目標(biāo)本地碼,并將源平臺指令地址和目標(biāo)本地碼指令地址的映射關(guān)系更新到哈希表。接著翻譯器將控制轉(zhuǎn)移至目標(biāo)本地碼,進行本地碼執(zhí)行。當(dāng)某個基本塊的目標(biāo)的本地碼不在CodeCache中時,控制將退出本地碼,轉(zhuǎn)移至運行時系統(tǒng)。繼續(xù)哈希表查找,翻譯等一系列的動作。在一個實施例中,以IA-32作為源體系結(jié)構(gòu),以MIPS作為目標(biāo)體系結(jié)構(gòu),即將IA-32可執(zhí)行程序翻譯到MIPS指令集計算機上執(zhí)行。本方法適用的目標(biāo)體系結(jié)構(gòu)可以推廣到ALPHA、Itanium、IA-32、X86-64等體系結(jié)構(gòu)上。如圖所示,本發(fā)明的二進制翻譯中codecache替換的方法包括步驟l、將本地碼空間劃分成N個相同大小的Unit和一個永不替換的Unit。可替換單元和永不替換單元的大小不必相同。在本步驟中,N個相同大小的Unit用來進行普通本地碼(普通本地碼就是除了系統(tǒng)調(diào)用以及同步操作的本地碼)的分配,以及實施替換策略,一個永不替換的Unit用來保存和線程同步相關(guān)的本地碼,例如含有系統(tǒng)調(diào)用或者同步指令的基本塊生成的本地碼。如圖2所示,一個本地碼空間被劃分成N個相同大小的Unit和一個永不替換的Unit。每個Unit中含有多個基本塊生成的本地碼(基本塊特指源平臺上面的指令序列,一般把一段以控制轉(zhuǎn)移指令為結(jié)尾的指令序列稱作基本塊)。歩驟2、每次從當(dāng)前Unit中分配本地碼,直到當(dāng)前Unit的容量達到上限時再從下一個Unit開始分配本地碼。在本步驟中,將所有的可替換Unit組成一個循環(huán)鏈表,并標(biāo)明當(dāng)前可用的Unit,每個Unit中都有本Unit的容量信息及使用情況。對于普通基本塊生成的本地碼,按照步驟2放入當(dāng)前Unit,對于含系統(tǒng)調(diào)用或者同步指令的基本塊生成的本地碼,需要將其放入永不替換的Unit中。步驟3、當(dāng)本地碼空間達到容量的上限時,以Unit為單位按照FIFO策略進行本地碼替換。當(dāng)本地碼空間達到容量的上限時,必須進行本地碼替換來獲得可用的空間來進行本地碼分配。在多線程的環(huán)境下,在替換一塊本地碼空間的時候要保證沒有線程正在這塊空間中執(zhí)行。具體步驟如下3-1、阻止線程進入將要被替換的目標(biāo)Unit。具體如下3-1-1、將本地碼在本Unit中的基本塊的本地碼地址在哈希表中失效,使得二進制翻譯器不能從哈希表中訪問到本Unit中的所有基本塊。為了減少使用全局鎖的競爭而采用鏈?zhǔn)焦1恚⑹褂肐A-32指令地址的最后20位作為哈希函數(shù),哈希表中的內(nèi)容是基本塊,由指針相鏈接。對于哈希表的關(guān)鍵操作包括査找本地碼,添加基本塊和刪除基本塊。查找本地碼可以通過32位load原子操作指令保證讀取的原子性。添加基本塊可以先填寫基本塊中的其他域,再通過下面算法所描述的手段將其加入到哈希表中。除了保證原子性,我們還必須保證在同一個哈希表中沒有同一個關(guān)鍵字的冗余基本塊數(shù)據(jù)結(jié)構(gòu)。新的基本塊加入到一個哈希鏈表的頭部。首先在查找的時刻讀取哈希鏈表的第一個結(jié)點。在插入的時刻需要檢查哈希鏈表的第一個結(jié)點沒有改變。如果哈希鏈表的第一個結(jié)點沒有改變,就可以用CAS同步原語來插入一個新的結(jié)點,否則就認(rèn)為插入失敗。然后再處理插入失敗的情況。先檢査插入失敗是否由于已經(jīng)插入了以相同IA-32指令地址為關(guān)鍵字的基本塊,如果是的話就放棄插入,否則失敗的原因就是插入的原子指令引起的硬件沖突,或者是由于插入了以不同IA-32指令地址為關(guān)鍵字的基本塊。這時需要重新執(zhí)行插入的操作。刪除基本塊可以先將基本塊結(jié)點設(shè)上無效標(biāo)志,然后在一個延遲的時間點來統(tǒng)一刪除這些基本塊。x86_pc—ttb_phys—hash—fonc(x86_pc)returnx86_pc&(CODE—GEN—PHYS—HASH—SIZE-1);TranslationBlock*Lookup(x86_pc){h二tb_phys—hash—f\mc(x86_pc);head—addr=&hashtable[h];thread—local—stomge-〉hash—tmp_ptr=*head—addr;tb=thread—local—storage-〉hash—tmp_ptr;while(true){if(!tb)returnNULL;if(tb-〉pc.-—pc)returntb;head—addr=&tb->phys—hash—next;tb=*head—addr;voidInsert(tb){h=tb_phys—hash—fUnc(x86_pc);head—addr=&tb_phys—hash[h];while(true){hash—tmp_ptr=thread—local—storage->hash—tmp_ptr;tb隱〉phys—hash—next=thread—local—storage->hash—tmp_ptr;if(CAS(head—addr,&thread—local—storage->hash—tmp_ptr,tb)){return;else{tmptb=*head—addr;while(tmptb!=hash—tmp_ptr){if(tmptb-〉pc==tb->pc)return;tmptb=tmptb-〉phys—hash—next;TranslationBlock*Lookup—And—Insert(x86_pc){TranslationBlock*tb=Lookup(x86_pc);if(!tb){tb=tb一alloc(pc);12Insert(tb);elsereturn;3-1-2、如果跳轉(zhuǎn)指令的目標(biāo)指令地址在目標(biāo)Unit中,則要斷開跳轉(zhuǎn)指令所在基本塊跟目標(biāo)Unit的本地碼鏈接。上述實施例以MIPS的本地碼為例說明鏈接和斷鏈的過程,本方法同樣適用于其他目標(biāo)體系結(jié)構(gòu)。如圖3所示,為了保證多線程在本地碼中執(zhí)行時進行鏈接和斷鏈的正確性,將跳轉(zhuǎn)指令的結(jié)束翻譯為返回控制器部分和本地碼鏈接部分。本地碼返回控制器部分排列在的鏈接部分前面。當(dāng)一個基本塊在翻譯時,如果它要跳轉(zhuǎn)的目標(biāo)基本塊還沒有被翻譯,那么這個基本塊在翻譯控制轉(zhuǎn)移指令時要將其翻譯成返回控制器的一串指令。包括將源目標(biāo)指令地址放入一個固定寄存器并從本地碼中跳轉(zhuǎn)回控制器。本地碼鏈接部分由空指令組成。這個狀態(tài)稱為初始狀態(tài)。在需要本地碼鏈接的時候,加上將目標(biāo)本地碼指令地址放入一個臨時寄存器并跳轉(zhuǎn)到目標(biāo)寄存器的指令序列,那么初始狀態(tài)就轉(zhuǎn)變?yōu)閿噫湢顟B(tài)。最后將跳轉(zhuǎn)回控制器的跳轉(zhuǎn)指令改成空指令,斷鏈狀態(tài)可轉(zhuǎn)變?yōu)楸镜卮a鏈接狀態(tài)。在需要斷鏈的時候,只需把跳轉(zhuǎn)回控制器的跳轉(zhuǎn)指令寫入本地碼,鏈接狀態(tài)可轉(zhuǎn)變?yōu)閿噫湢顟B(tài)。3-2、根據(jù)每個線程的當(dāng)前執(zhí)行指令地址,等待線程從將要被替換的Unit中退出。具體如下3-2-1、斷開目標(biāo)Unit中本地碼鏈接的回邊鏈接,使目標(biāo)Unit中的循環(huán)盡快退出。3-2-2、等待至目標(biāo)Unit中的線程全部退出。如圖4所示,為了判斷目標(biāo)Unit中的線程執(zhí)行情況,需要記錄并更新下每個線程當(dāng)前正執(zhí)行指令地址的信息。在線程進入本地碼前記錄下將要執(zhí)行的本地碼地址至線程獨立的空間中。線程從本地碼返回控制器以后將當(dāng)前執(zhí)行指令地址信息清零。在翻譯的時候判斷出若線程的控制轉(zhuǎn)移指令從一個Unit跨越到另一個Unit,就必須更新器當(dāng)前執(zhí)行指令地址的信息。在這種情況下,需要讓控制轉(zhuǎn)移指令轉(zhuǎn)移到一塊單獨的本地碼空間中更新當(dāng)前執(zhí)行指令地址的信息,然后才能跳轉(zhuǎn)到目標(biāo)Unit執(zhí)行。這個用來更新當(dāng)前執(zhí)行指令地址的單獨的本地碼空間的checkstub分配在永不替換的Unit中。等待線程退出目標(biāo)Unit的過程即輪詢各個線程的當(dāng)前執(zhí)行指令地址信息直至當(dāng)前執(zhí)行指令地址均不在目標(biāo)Unit中。3-3、清空將要被替換的Unit。具體如下本Unit加入到待分配的Unit列表中,可以重新用來進行本地碼分配。如圖4所示,在checkingstub里更新當(dāng)前執(zhí)行指令地址信息以后檢查目標(biāo)Unit的有效性,可以保證線程在從一個Unit轉(zhuǎn)移到目標(biāo)Unit時,目標(biāo)Unit仍然是有效的。<table>tableseeoriginaldocumentpage14</column></row><table>表1二進制翻譯系統(tǒng)中的鎖如表1所示,在二進制翻譯系統(tǒng)中有許多線程共享的數(shù)據(jù)結(jié)構(gòu)在被訪問或者被修改時需要加上互斥鎖進行同步。圖5表明這些鎖之間的相互作用,沒有在其中標(biāo)明的鎖則表示其被持有的范圍沒有重疊。本領(lǐng)域的技術(shù)人員在不脫離權(quán)利要求書確定的本發(fā)明的精神和范圍的條件下,還可以對以上內(nèi)容進行各種各樣的修改。因此本發(fā)明的范圍并不僅限于以上的說明,而是由權(quán)利要求書的范圍來確定的。權(quán)利要求1.二進制翻譯器中線程共享codecache的替換方法,其特征在于,包括步驟10,將本地碼空間劃分成N個相同大小的可替換單元和一個永不替換單元,N為自然數(shù);可替換單元用于進行普通本地碼的分配以及實施替換策略,永不替換單元用來保存與線程同步相關(guān)的本地碼;步驟20,從當(dāng)前可替換單元中分配本地碼,直到當(dāng)前可替換單元的容量達到上限時再從下一個可替換單元開始分配本地碼;步驟30,當(dāng)本地碼空間達到容量的上限時,以可替換單元為單位按照先進先出策略進行本地碼替換。2.如權(quán)利要求1所述的二進制翻譯器中線程共享codecache的替換方法,其特征在于,步驟10中,本地碼空間是二進制翻譯器事先分配好的一段內(nèi)存空間。3.如權(quán)利要求1所述的二進制翻譯器中線程共享codecache的替換方法,其特征在于,可替換單元中含有多個基本塊的本地碼。4.如權(quán)利要求1所述的二進制翻譯器中線程共享codecache的替換方法,其特征在于,步驟20中,在可替換單元內(nèi)和可替換單元間都對每個基本塊進行本地碼鏈接。5.如權(quán)利要求1所述的二進制翻譯器中線程共享codecache的替換方法,其特征在于,步驟30中,在進行本地碼替換時,將N個可替換單元組成循環(huán)鏈表,按照先進先出的順序,每次替換一個可替換單元的本地碼。6.如權(quán)利要求1所述的二進制翻譯器中線程共享codecache的替換方法,其特征在于,與線程同步相關(guān)的本地碼為含有系統(tǒng)調(diào)用或者同步指令的基本塊生成的本地碼。7.如權(quán)利要求1所述的二進制翻譯器中線程共享codecache的替換方法,其特征在于,步驟30中,在替換本地碼空間時,需要保證沒有線程正在將要被替換的可替換單元中執(zhí)行。8.如權(quán)利要求7所述的二進制翻譯器中線程共享codecache的替換方法,其特征在于,在替換本地碼空間時,保證沒有線程正在將要被替換的可替換單元中執(zhí)行的步驟包括步驟301,阻止線程進入將要被替換的可替換單元;步驟302,根據(jù)每個線程的當(dāng)前執(zhí)行指令地址,等待線程從將要被替換的可替換單元中退出;步驟303,清空將要被替換的可替換單元。9.如權(quán)利要求8所述的二進制翻譯器中線程共享codecache的替換方法,其特征在于,步驟301包括步驟3011,將本地碼在本可替換單元中的基本塊的本地碼地址在哈希表中失效,使得二進制翻譯器不能從哈希表中訪問到本可替換單元中的所有基本塊;步驟3012,如果跳轉(zhuǎn)指令的目標(biāo)指令地址在將要替換的可替換單元中,則要斷開跳轉(zhuǎn)指令所在基本塊跟將要替換的可替換單元的本地碼鏈接。10.如權(quán)利要求9所述的二進制翻譯器中線程共享codecache的替換方法,其特征在于,步驟302包括步驟3021,斷開將要替換的可替換單元中本地碼鏈接的回邊鏈接,使將要替換的可替換單元中的循環(huán)盡快退出;步驟3022,等待至將要替換的可替換單元中的線程全部退出。11.二進制翻譯器中線程共享codecache的替換系統(tǒng),其特征在于,包括替換單元劃分模塊,用于將本地碼空間劃分成N個相同大小的可替換單元和一個永不替換單元,N為自然數(shù);可替換單元用于進行普通本地碼的分配以及實施替換策略,永不替換單元用來保存與線程同步相關(guān)的本地碼;本地碼分配模塊,用于從當(dāng)前可替換單元中分配本地碼,直到當(dāng)前可替換單元的容量達到上限時再從下一個可替換單元開始分配本地碼;本地碼替換模塊,當(dāng)本地碼空間達到容量的上限時,以可替換單元為單位按照先進先出策略進行本地碼替換。12.如權(quán)利要求11所述的二進制翻譯器中線程共享codecache的替換系統(tǒng),其特征在于,本地碼空間是二進制翻譯器事先分配好的一段內(nèi)存空間。13.如權(quán)利要求11所述的二進制翻譯器中線程共享codecache的替換系統(tǒng),其特征在于,可替換單元中含有多個基本塊的本地碼。14.如權(quán)利要求11所述的二進制翻譯器中線程共享codecache的替換系統(tǒng),其特征在于,本地碼分配模塊,還用于在可替換單元內(nèi)和可替換單元間都對每個基本塊進行本地碼鏈接。15.如權(quán)利要求11所述的二進制翻譯器中線程共享codecache的替換系統(tǒng),其特征在于,本地碼替換模塊,還用于在進行本地碼替換時,將N個可替換單元組成循環(huán)鏈表,按照先進先出的順序,每次替換一個可替換單元的本地碼。16.如權(quán)利要求11所述的二進制翻譯器中線程共享codecache的替換系統(tǒng),其特征在于,與線程同步相關(guān)的本地碼為含有系統(tǒng)調(diào)用或者同步指令的基本塊生成的本地碼。17.如權(quán)利要求11所述的二進制翻譯器中線程共享codecache的替換系統(tǒng),其特征在于,本地碼替換模塊,還用于保證沒有線程正在將要被替換的可替換單元中執(zhí)行。18.如權(quán)利要求17所述的二進制翻譯器中線程共享codecache的替換系統(tǒng),其特征在于,本地碼替換模塊,還用于阻止線程進入將要被替換的可替換單元,根據(jù)每個線程的當(dāng)前執(zhí)行指令地址等待線程從將要被替換的可替換單元中退出,清空將要被替換的可替換單元,以保證沒有線程正在將要被替換的可替換單元中執(zhí)行。19.如權(quán)利要求17所述的二進制翻譯器中線程共享codecache的替換系統(tǒng),其特征在于,本地碼替換模塊,還用于將本地碼在本可替換單元中的基本塊的本地碼地址在哈希表中失效,使得二進制翻譯器不能從哈希表中訪問到本可替換單元中的所有基本塊;如果跳轉(zhuǎn)指令的目標(biāo)指令地址在將要替換的可替換單元中,則要斷開跳轉(zhuǎn)指令所在基本塊跟將要替換的可替換單元的本地碼鏈接。20.如權(quán)利要求19所述的二進制翻譯器中線程共享codecache的替換系統(tǒng),其特征在于,本地碼替換模塊,還用于斷開將要替換的可替換單元中本地碼鏈接的回邊鏈接,使將要替換的可替換單元中的循環(huán)盡快退出;等待至將要替換的可替換單元中的線程全部退出。全文摘要本發(fā)明涉及二進制翻譯器中線程共享codecache的替換方法及系統(tǒng)。該方法包括步驟10,將本地碼空間劃分成N個相同大小的可替換單元和一個永不替換單元,N為自然數(shù);可替換單元用于進行普通本地碼的分配以及實施替換策略,永不替換單元用來保存與線程同步相關(guān)的本地碼;步驟20,從當(dāng)前可替換單元中分配本地碼,直到當(dāng)前可替換單元的容量達到上限時再從下一個可替換單元開始分配本地碼;步驟30,當(dāng)本地碼空間達到容量的上限時,以可替換單元為單位按照先進先出策略進行本地碼替換。本發(fā)明提出并實現(xiàn)了多線程codecache的替換方案,這種替換方案可廣泛適用于各種體系結(jié)構(gòu)之上的二進制翻譯器中,在開銷較小的同時保證了線程的并發(fā)性。文檔編號G06F12/12GK101482851SQ200810247438公開日2009年7月15日申請日期2008年12月31日優(yōu)先權(quán)日2008年12月31日發(fā)明者盈張,武成崗申請人:中國科學(xué)院計算技術(shù)研究所