亚洲成年人黄色一级片,日本香港三级亚洲三级,黄色成人小视频,国产青草视频,国产一区二区久久精品,91在线免费公开视频,成年轻人网站色直接看

軟件原子化的制作方法

文檔序號:6412136閱讀:665來源:國知局
專利名稱:軟件原子化的制作方法
技術(shù)領(lǐng)域
計算機(jī)軟件通常被創(chuàng)建為直譯語言系統(tǒng)或編譯語言系統(tǒng)。直譯語言系統(tǒng)將高級程序語句翻譯成可執(zhí)行的形式,并一次執(zhí)行一條語句而不是在執(zhí)行之前全部翻譯完(即,編譯)這些高級語句。Basic、LISP和APL通常作為直譯語言來實(shí)現(xiàn)。編譯語言系統(tǒng)在執(zhí)行之前將高級程序語句翻譯成中間目標(biāo)代碼格式。在編譯語言系統(tǒng)中,程序語句以源代碼程序語言(例如,C、C++)來編寫。源代碼包含有以不能被計算機(jī)直接執(zhí)行的高級或編譯語言編寫的人可以讀的程序語句。源代碼由編譯器處理,編譯器通過遵循一組句法和語義規(guī)則將源代碼轉(zhuǎn)換成目標(biāo)代碼(例如,OBJ文件)。然后目標(biāo)代碼被使用鏈接程序鏈接在一起產(chǎn)生可執(zhí)行計算機(jī)程序(例如,.EXE文件)。
計算機(jī)可執(zhí)行程序當(dāng)存儲在盤以及裝入計算機(jī)內(nèi)存時可能很大。動態(tài)鏈接庫(DLL)提供了一種機(jī)制來存儲從主可執(zhí)行計算機(jī)程序中分離出的可執(zhí)行例程和數(shù)據(jù)。只有當(dāng)可執(zhí)行計算機(jī)程序需要時,可執(zhí)行例程才被裝入。DLL通過只有當(dāng)用到例程或數(shù)據(jù)時才使用內(nèi)存來節(jié)約空間。DLL還組織和管理與可執(zhí)行計算機(jī)程序分離和與其它DLL分離的計算機(jī)代碼和數(shù)據(jù)。這就允許程序設(shè)計員在DLL中可以只對某些例程進(jìn)行改正和改善而不會影響調(diào)用計算機(jī)程序或任何其它DLL的操作。此外,DLL可以在多個計算機(jī)程序之間共享。DLL自身可能是相當(dāng)大的,并且多個可執(zhí)行例程通常被組織成為在DLL內(nèi)的單個模塊,使得DLL在下載、更新和加載方面并不是很顆粒化。
存在最小化與更新較大DLL或其它代碼/數(shù)據(jù)相關(guān)的傳輸時間的技術(shù)。使用差別檢測算法(例如,rsync)的文件傳輸協(xié)議可以降低傳輸?shù)臅r間。這些算法可以將源和目標(biāo)文件配置成數(shù)據(jù)塊,分析這些塊,并只傳輸在源和目標(biāo)文件之間不同的塊。
還可以使用壓縮來降低在通信介質(zhì)上以及從盤到內(nèi)存的代碼和數(shù)據(jù)的傳輸時間。對可執(zhí)行代碼大小尤其敏感的嵌入式處理器系統(tǒng)已經(jīng)實(shí)現(xiàn)了對可執(zhí)行代碼實(shí)施壓縮??梢允褂么a的壓縮“線”表示,但是這些代碼必須在執(zhí)行之前被解壓縮。其它技術(shù)提供了直接執(zhí)行壓縮代碼(例如,“字節(jié)代碼RISC”或“BRISC”虛擬機(jī))。
CurlTM語言在一個集成的環(huán)境中組合了布局、腳本和程序設(shè)計的能力。通過客戶端的執(zhí)行來搭配這些全部特征化的語言,CurlTM技術(shù)可以在Web上傳送快速、有效、高功能的應(yīng)用程序,并能夠進(jìn)行客戶和服務(wù)器交互操作的交互Web業(yè)務(wù)能力。CurlTM內(nèi)容使用增加了CurlTM插件和CurlTM運(yùn)行時間環(huán)境的Web瀏覽器來顯示。CurlTM運(yùn)行時間環(huán)境在許多根據(jù)大約相等數(shù)量的代碼和數(shù)據(jù)編譯的運(yùn)行時間環(huán)境中是非典型的。CurlTM運(yùn)行時間環(huán)境是使用大量DLL來實(shí)現(xiàn)的。

發(fā)明內(nèi)容
使用傳統(tǒng)技術(shù)(例如,EXE和DLL)來實(shí)現(xiàn)計算機(jī)系統(tǒng)呈現(xiàn)出很多問題。這些計算機(jī)系統(tǒng)顯示了較長的起動時間,使用太多內(nèi)存,且由于它們使用了大顆?;目蓤?zhí)行例程和數(shù)據(jù)而導(dǎo)致更新很麻煩。因此,本發(fā)明提供一種使用軟件原子化建立和執(zhí)行軟件原子從而組織和管理可執(zhí)行計算機(jī)軟件的精細(xì)顆粒化方法。
原子是由原子id(識別符)唯一標(biāo)識的代碼片斷或數(shù)據(jù)單元。代碼原子典型地處于源語言(例如,C/C++)程序的級別上。數(shù)據(jù)原子是數(shù)據(jù)單元,并可以有任意大小。當(dāng)需要時,原子被拖入內(nèi)存,并且當(dāng)不再需要時可以被換出。
本發(fā)明提供了一種通過從原子數(shù)據(jù)庫將原子裝入內(nèi)存從而按需裝入原子化計算機(jī)程序代碼和數(shù)據(jù)的方法,所述原子以精確顆粒、分別可尋址的方式定義代碼或數(shù)據(jù)。原子包括原子識別符、計算機(jī)程序代碼或數(shù)據(jù)信息和計算機(jī)程序代碼或數(shù)據(jù)參考信息(referenceinformation)。該計算機(jī)程序代碼或數(shù)據(jù)信息的載入是通過將每個參考變換成合適的地址,并按合適的偏移將該地址插入原子的本體來完成的。
代碼的延遲(lazy),或按需加載載入是通過將基于參考的原子識別符轉(zhuǎn)換成分支例程的內(nèi)存地址來提供的。分支例程裝入被參考原子并跳轉(zhuǎn)到其上。原子加載類型可以通過修改計算機(jī)程序代碼或數(shù)據(jù)參考信息以影響渴望(eager)或延遲加載技術(shù)來改變。原子加載類型可以基于分析前一原子加載經(jīng)歷的運(yùn)行時間來確定。當(dāng)加載時,原子可以經(jīng)由只讀緩沖器在多個可執(zhí)行處理之間共享。
“回補(bǔ)(back-patching)”技術(shù)可以應(yīng)用于通過分支來參考目標(biāo)原子的所有原子。原子參考(atom reference)是由在執(zhí)行調(diào)用的調(diào)用例程內(nèi)的源偏移、被調(diào)用原子的目的地原子id和被調(diào)用原子之內(nèi)的目的地偏移來定義的。一旦分支例程加載其目標(biāo)原子,該分支例程的內(nèi)存地址就由被參考原子的內(nèi)存地址重寫。
數(shù)據(jù)的延遲,或按需加載的載入通過提供代碼的延遲加載來隱含地提供,以及通過編碼參考原子識別符以便被參考數(shù)據(jù)原子直到在運(yùn)行時間被實(shí)際訪問才被加載來明確地提供。由于參考數(shù)據(jù)的代碼的加載可以延遲到被調(diào)用為止,所以,代碼所參考的數(shù)據(jù)同樣被延遲一隱含地提供數(shù)據(jù)的遲緩加載。明確松散數(shù)據(jù)(lazy data)典型地需要程序設(shè)計員支持以便標(biāo)記數(shù)據(jù)被延遲加載(例如,使用編譯器命令)。在一個實(shí)施例中,明確松散數(shù)據(jù)使用特定編碼算法來參考,該算法將參考原子識別符乘以2并將參考原子識別符加1來產(chǎn)生松散數(shù)據(jù)原子識別符。
在本發(fā)明的另一個實(shí)施例中,由原子管理程序來提供優(yōu)化??梢曰趯υ谇霸蛹虞d經(jīng)歷的運(yùn)行時間模式的分析來重新排序基于盤的原子數(shù)據(jù)庫中的原子以便有效訪問。計算機(jī)程序代碼或數(shù)據(jù)信息可按壓縮格式存儲。壓縮可以減少原子的加載時間和減少存儲原子所需的盤空間??梢酝ㄟ^碎片收集來節(jié)約內(nèi)存,從而基于預(yù)定使用門限將加載原子從內(nèi)存移除。加載原子的執(zhí)行可以在加載由該加載原子參考的所有原子以便提供流執(zhí)行(streaming execution)環(huán)境之前開始。
可以通過代替計算機(jī)程序代碼或數(shù)據(jù)信息以及計算機(jī)程序代碼或數(shù)據(jù)參考信息來更新原子數(shù)據(jù)庫中的某些原子。
代碼和數(shù)據(jù)原子可以使用析取器從程序設(shè)計語言對象(例如,.obj文件)來建立。原子也可以使用產(chǎn)生能夠由原子管理程序處理的原子的任何其它處理來建立。在本發(fā)明的一個實(shí)施例中,原子化計算機(jī)程序代碼和數(shù)據(jù)的方法包括接收按照用于定義單獨(dú)可尋址代碼和數(shù)據(jù)的目標(biāo)代碼格式的計算機(jī)程序代碼和數(shù)據(jù),并從以目標(biāo)代碼格式存儲的計算機(jī)程序代碼和數(shù)據(jù)中提取計算機(jī)代碼和數(shù)據(jù)信息。計算機(jī)程序代碼和數(shù)據(jù)參考信息也從按目標(biāo)代碼格式存儲的計算機(jī)程序代碼和數(shù)據(jù)中提取。計算機(jī)程序代碼和數(shù)據(jù)參考信息被修改來使用原子識別符,并被存儲在一個原子中,該原子包括原子識別符、計算機(jī)程序代碼或數(shù)據(jù)信息、計算機(jī)程序代碼或數(shù)據(jù)參考信息。
在本發(fā)明的一個實(shí)施例中,定義了一種用來存儲由在數(shù)據(jù)處理系統(tǒng)上執(zhí)行的計算機(jī)程序訪問的數(shù)據(jù)的存儲器,該存儲器可以存儲由數(shù)據(jù)結(jié)構(gòu)定義的原子。該數(shù)據(jù)結(jié)構(gòu)包括頭部和原子映象(atom map)。所述原子映象包括原子映象頭部和原子映象陣列。該原子映象陣列包括原子偏移序列,該參考原子的原子偏移序列包括原子識別符,計算機(jī)程序代碼和/或數(shù)據(jù)信息;計算機(jī)程序代碼和/或數(shù)據(jù)參考信息。原子映象還可提供從原子識別符到符號名的映射。
本發(fā)明實(shí)施例提供了更快的計算機(jī)程序啟動時間,更小的可執(zhí)行代碼(例如,插件程序、運(yùn)行時間)下載,更小的盤占用空間,更小的內(nèi)存占用空間,以及當(dāng)代碼和數(shù)據(jù)被在原子化(可尋址)單元級別上處理時更小的更新文件。這種原子的精細(xì)顆?;椒ㄌ峁┯糜诖_切加載所需代碼和數(shù)據(jù),并且不用僅僅因為其位于可執(zhí)行文件的附近而加載其它代碼和數(shù)據(jù)。原子化用于基于原子所建立的精細(xì)顆?;为?dú)可尋址的單元優(yōu)化對代碼和數(shù)據(jù)的隨機(jī)訪問。由于代碼和數(shù)據(jù)被原子化成精細(xì)顆?;?、單獨(dú)可尋址的單元,因此它們變得更小,并且從而在需要更新時更易于以后修補(bǔ)。


通過下面對本發(fā)明優(yōu)選實(shí)施例的更具體描述,本發(fā)明的上述和其它目的、特點(diǎn)和優(yōu)點(diǎn)將顯而易見,如在附圖中說明的那樣,其中,在所有不同視圖中,相同的參考字符指代相同的部件。附圖不必按比例,而應(yīng)強(qiáng)調(diào)說明本發(fā)明的原理。
圖1是在其上實(shí)施本發(fā)明一個實(shí)施例的計算機(jī)系統(tǒng)的圖。
圖2是圖1計算機(jī)系統(tǒng)中的計算機(jī)的內(nèi)部結(jié)構(gòu)圖。
圖3說明了在運(yùn)行時間建立和加載計算機(jī)程序來顯示輸出的傳統(tǒng)過程。
圖4說明了在運(yùn)行時間建立和加載原子化計算機(jī)程序來顯示輸出的軟件原子化過程。
圖5說明了原子提取過程。
圖6是原子數(shù)據(jù)庫和原子的圖。
圖7是原子管理程序的圖。
圖8說明了原子管理過程。
圖9是原子數(shù)據(jù)庫數(shù)據(jù)結(jié)構(gòu)圖。
圖10是原子映射頭部數(shù)據(jù)結(jié)構(gòu)圖。
圖11是原子映射陣列數(shù)據(jù)結(jié)構(gòu)圖。
圖12是原子偏移序列數(shù)據(jù)結(jié)構(gòu)圖。
圖13是編碼原子數(shù)據(jù)結(jié)構(gòu)圖。
圖14是編碼原子參考數(shù)據(jù)結(jié)構(gòu)圖。
圖15是四個編碼程序和三個數(shù)據(jù)單元的示例系統(tǒng)圖。
圖16a是示例數(shù)據(jù)原子的圖。
圖16b是示例代碼原子的圖。
具體實(shí)施例方式
下面描述本發(fā)明的優(yōu)選實(shí)施例。該優(yōu)選實(shí)施例適于原子化實(shí)現(xiàn)CurlTM運(yùn)行時間環(huán)境的計算機(jī)程序,該環(huán)境執(zhí)行原子化的CurlTM運(yùn)行時間的適當(dāng)部分來處理以CurlTM語言、腳本或非Curl程序編寫的軟件。
圖1是在其上實(shí)施本發(fā)明實(shí)施例的計算機(jī)系統(tǒng)的圖??蛻粲嬎銠C(jī)50和服務(wù)器計算機(jī)60提供處理、存儲、和輸入/輸出設(shè)備用于原子化和執(zhí)行原子化計算機(jī)程序??蛻粲嬎銠C(jī)50還通過通信網(wǎng)絡(luò)70連接到包括其它客戶計算機(jī)50和服務(wù)器計算機(jī)60的其它計算設(shè)備。通信網(wǎng)絡(luò)70可以是因特網(wǎng)的一部分,因特網(wǎng)是當(dāng)前使用TCP/IP協(xié)議組進(jìn)行相互通信的計算機(jī)、網(wǎng)絡(luò)和網(wǎng)關(guān)的世界性集合。因特網(wǎng)提供了在主節(jié)點(diǎn)或主計算機(jī)之間高速數(shù)據(jù)通信鏈路的主干,其包括路由數(shù)據(jù)和消息的成千上萬的商業(yè)、政府、教育和其它計算機(jī)網(wǎng)絡(luò)。在本發(fā)明的另一個實(shí)施例中,用來原子化和執(zhí)行原子化計算機(jī)程序的處理、存儲、和輸入/輸出設(shè)備可以在獨(dú)立計算機(jī)上實(shí)現(xiàn)。
圖2是圖1計算機(jī)系統(tǒng)中的計算機(jī)(例如,50、60)的內(nèi)部結(jié)構(gòu)圖。每個計算機(jī)包括系統(tǒng)總線200,這里總線是一組用來在計算機(jī)元件之間傳輸數(shù)據(jù)的硬件連線??偩€200實(shí)質(zhì)上是連接能夠在各單元之間傳輸信息的計算機(jī)系統(tǒng)(例如,處理器、硬盤存儲器、內(nèi)存、輸入/輸出端口、網(wǎng)絡(luò)端口等)的不同單元的共享管道。連接于系統(tǒng)總線200的是用來將各種輸入輸出設(shè)備(例如,顯示器、打印機(jī)、揚(yáng)聲器等)連接于計算機(jī)的I/O設(shè)備接口202。網(wǎng)絡(luò)接口206允許計算機(jī)連接到附著于網(wǎng)絡(luò)(例如,網(wǎng)絡(luò)70)的各種其它設(shè)備上。內(nèi)存208是用于用來實(shí)施本發(fā)明一個實(shí)施例的計算機(jī)軟件指令(例如,原子析取器150和原子管理程序160)和數(shù)據(jù)結(jié)構(gòu)(例如,原子數(shù)據(jù)庫120)的易失性存儲器。盤存儲器210是用于用來實(shí)施本發(fā)明一個實(shí)施例的計算機(jī)軟件指令(例如,原子析取器150和原子管理程序160)和數(shù)據(jù)結(jié)構(gòu)(例如,原子數(shù)據(jù)庫120)的非易失性存儲器。
中央處理單元204也連接于系統(tǒng)總線700并用于執(zhí)行計算機(jī)指令(例如,原子析取器150和原子管理程序160),從而允許計算機(jī)原子化并執(zhí)行原子化計算機(jī)程序。
圖3說明了在運(yùn)行時間建立和加載計算機(jī)程序以顯示輸出的傳統(tǒng)過程。源代碼102是由計算機(jī)程序設(shè)計員使用源代碼程序設(shè)計語言(例如,C、C++)編制的。編譯器104處理該源代碼并產(chǎn)生目標(biāo)代碼106文件。一個或多個目標(biāo)代碼106文件被使用鏈接程序108鏈接來產(chǎn)生鏈接程序部分109。鏈接程序部分109被組合來產(chǎn)生可執(zhí)行代碼110??蓤?zhí)行代碼110可作為獨(dú)立的可執(zhí)行程序(例如,EXE文件)或作為代碼共享庫(例如,DLL文件)被鏈接。可執(zhí)行代碼110被加載程序112載入內(nèi)存來執(zhí)行,以便產(chǎn)生運(yùn)行時間顯示114。
圖4說明了在用于運(yùn)行時間建立和加載原子化計算機(jī)程序來顯示輸出的軟件原子化過程。與使用傳統(tǒng)處理一樣,源代碼102由計算機(jī)程序設(shè)計員使用源代碼程序設(shè)計語言(例如,C,C++)編制。編譯器104處理該源代碼并產(chǎn)生目標(biāo)代碼106文件。在源代碼102被以通常方式匯編成目標(biāo)代碼106文件之后,原子析取器150處理該目標(biāo)代碼106文件來識別原子130。精細(xì)顆粒化、單獨(dú)可尋址原子130被放入原子數(shù)據(jù)庫120,其中每個原子130接收一個唯一原子id 132。精細(xì)顆?;?30定義了任意整數(shù)個字節(jié)的代碼和數(shù)據(jù)。對于代碼和數(shù)據(jù)的參考被轉(zhuǎn)換成原子id參考。例如,在代碼內(nèi)的程序調(diào)用通過它們的原子id 132被轉(zhuǎn)換成其它原子130的調(diào)用。數(shù)據(jù)參考也通過它們的原子id 132被轉(zhuǎn)換成數(shù)據(jù)原子參考。
原子析取器150利用目標(biāo)代碼文件106并從該代碼產(chǎn)生原子130。根據(jù)傳統(tǒng)加載程序需要相同信息來加載和調(diào)用程序以及優(yōu)化只讀數(shù)據(jù)的事實(shí),從目標(biāo)代碼106提取原子130所需的信息已被嵌入到目標(biāo)文件中。從目標(biāo)代碼文件106中提取多個數(shù)據(jù)原子所需的信息需要各種數(shù)據(jù)量的分離。這種分離可以由某些傳統(tǒng)編譯器(例如,gcc)自動進(jìn)行,或由程序設(shè)計員在源代碼(例如編譯器指示)中直接標(biāo)記數(shù)據(jù)數(shù)量來明確地進(jìn)行。在運(yùn)行時間,原子管理程序160從原子數(shù)據(jù)庫120中訪問原子130并將它們加載到內(nèi)存中來執(zhí)行。所加載原子130然后產(chǎn)生運(yùn)行時間顯示114,或它們被編程為當(dāng)被執(zhí)行時產(chǎn)生的任何其它結(jié)果。原子管理程序160可以基于靜態(tài)代碼分析或動態(tài)剖析(dynamicprofiling)來確定加載原子130的最佳順序。通過依靠編譯器在目標(biāo)代碼文件106中建立分離部分,可以自動進(jìn)行原子化過程,這避免了需要手動分解和分析。編譯器的使用提供了建立代碼和數(shù)據(jù)分離部分的一種選擇,可選地,可以使用其它程序處理源文件來產(chǎn)生原子130。
圖5說明了原子提取過程。在步驟302,以目標(biāo)代碼格式接收計算機(jī)程序代碼和/或數(shù)據(jù)。在步驟304,以目標(biāo)代碼格式從計算機(jī)程序代碼和/或數(shù)據(jù)中提取計算機(jī)程序代碼和/或數(shù)據(jù)信息。在步驟306,以目標(biāo)代碼格式從計算機(jī)程序代碼和/或數(shù)據(jù)中提取計算機(jī)程序代碼和/或數(shù)據(jù)參考信息。在步驟308,修改計算機(jī)程序代碼和/或數(shù)據(jù)參考信息以使用原子識別符。最后,在步驟310,計算機(jī)程序代碼和/或數(shù)據(jù)信息和計算機(jī)程序代碼和/或數(shù)據(jù)參考信息被存儲于原子中,所述原子包括原子識別符;計算機(jī)程序代碼和/或數(shù)據(jù)信息;計算機(jī)程序代碼和/或數(shù)據(jù)參考信息。
圖6是原子數(shù)據(jù)庫和原子的圖。從概念上講,原子數(shù)據(jù)庫120可以被視為原子130的有向圖。原子字節(jié)134(節(jié)點(diǎn))由原子id 132(節(jié)點(diǎn)id)標(biāo)識并由原子參考136(邊緣)鏈接。原子數(shù)據(jù)庫120存儲原子130。每個原子130由一個唯一原子id 132標(biāo)識。每個原子130的代碼和/或數(shù)據(jù)被表示為原子字節(jié)134。原子130可以被壓縮,包括原子字節(jié)134內(nèi)的代碼和/或數(shù)據(jù)以及原子參考136。在某些環(huán)境中,解壓縮比讀盤的時間快,并且壓縮和解壓縮處理提供了明顯的性能改善以及減少的內(nèi)存和盤存儲器空間。
圖7是原子管理程序的圖。在運(yùn)行時間,本發(fā)明的一個實(shí)施例回避傳統(tǒng)的用于加載共享庫(即,DLL)的機(jī)制,而是使用更有效的原子機(jī)制,其以原子130的顆粒度而不是例如內(nèi)存的4K塊來加載。原子管理程序160根據(jù)需要從原子數(shù)據(jù)庫120中加載原子130。原子管理程序160分配主內(nèi)存并接著在緩沖器內(nèi)管理原子130。原子析取器150預(yù)先已修改程序調(diào)用以便間接地通過用于原子管理程序160的原子130,其將現(xiàn)有原子130放在內(nèi)存中,或者如果它們還沒被加載,就從原子數(shù)據(jù)庫120中加載它們。
緩沖器管理提供了多種好處,包括有界限的內(nèi)存使用、降低的主機(jī)交換和系統(tǒng)顛簸以及降低的啟動時間。有界限的內(nèi)存使用將內(nèi)存使用限制到任意具體大小。例如,可以為代碼原子130選擇精確的8MB內(nèi)存,并且當(dāng)需要一個更新的原子時,將舊原子130交換出來。本發(fā)明的實(shí)施例通過限制內(nèi)存的使用來降低主機(jī)交換和系統(tǒng)顛簸,因此,主機(jī)不需要使用其內(nèi)存管理機(jī)制來管理內(nèi)存的過渡使用。由于主機(jī)內(nèi)存管理是通用目的并且不必使其與具體需要一致,從而主機(jī)內(nèi)存管理的效率固有地較低。通過精確地加載所需的代碼,并且不必加載僅僅因為其處于共享庫“附近”的其它代碼,降低了內(nèi)存消耗。原子管理程序160降低了啟動時間。原子管理程序160將加載并執(zhí)行第一原子130。當(dāng)需要新原子130時,它們被加載并執(zhí)行。因此,代碼立刻執(zhí)行,而無需等待整個代碼組被載入內(nèi)存。本發(fā)明的實(shí)施例在下載完成之前開始執(zhí)行正在被下載的代碼原子130(受還未發(fā)送的原子130可用性的限制)。
原子管理程序160管理三個緩存器只讀代碼緩存器170、只讀數(shù)據(jù)緩存器180(例如,常量)和讀寫數(shù)據(jù)緩存器190(例如,全局?jǐn)?shù)據(jù))。由于讀寫數(shù)據(jù)可以是任意大小,并且不能從原子數(shù)據(jù)庫120重新加載,其大小不被限制,因此,可以使用主機(jī)的虛擬內(nèi)存系統(tǒng)來對其管理。
將原子130一次一個地裝入緩存器比如果可以確定它們是相關(guān)的(例如,它們都“很快”將被需要)則同時裝入原子130的一個工作組效率更低。工作組協(xié)調(diào)器(tuner)被用來確定哪些原子130形成“工作組”。該工作組協(xié)調(diào)器適用于收集用于原子化環(huán)境的信息。一旦收集到該信息,則使用一種機(jī)制來利用這些信息,例如原子數(shù)據(jù)庫120內(nèi)的表示原子130相互關(guān)系的指示。本發(fā)明的實(shí)施例提供了在盤上重新排序原子130來匹配具體加載序列的能力,從而提供更快的加載。
通過原子管理程序?qū)χ蛔x代碼緩存器170的管理提供了一定的加載優(yōu)化。當(dāng)一個原子130向另一個原子130作出一個程序調(diào)用時,通常使用分支經(jīng)由原子管理程序160來作出調(diào)用。當(dāng)調(diào)用程序代碼在內(nèi)存中的映象被修改以直接跳到(鏈接急變(link snapping))目標(biāo)原子130時,程序調(diào)用更快。然而,一旦鏈接被急變,原子管理程序160不使得該鏈接無效就不能移動或交換出目標(biāo)原子130。對于頻繁被調(diào)用的原子130,這可以是一個很值得的折中。原子管理程序160利用工具來確定哪些原子130有資格被直接調(diào)用,并將原子130鎖定到內(nèi)存中。對鏈接急變的分析可以在運(yùn)行時間通過將代碼/數(shù)據(jù)鎖入內(nèi)存中來作出,或者在編譯時通過標(biāo)記某些原子參考136以便在運(yùn)行時間不使用分支來作出。
多種程序可以訪問相同的原子數(shù)據(jù)庫120以共享代碼和/或數(shù)據(jù)。如果主處理器在主處理之間支持共享內(nèi)存,那么只讀代碼緩存器170和只讀數(shù)據(jù)緩存器180也可以在主處理之間共享。
圖8說明了原子管理過程。在步驟322,原子管理處理通過從原子數(shù)據(jù)庫中載入原子到內(nèi)存中來管理原子化的計算機(jī)程序代碼和/或數(shù)據(jù),所述原子包括原子識別符;計算機(jī)程序代碼和/或數(shù)據(jù)信息;和計算機(jī)程序代碼和/或數(shù)據(jù)參考信息。在步驟324,計算機(jī)程序代碼和/或數(shù)據(jù)參考信息接著被從使用原子識別符和偏移修改為使用內(nèi)存地址。
圖9是原子數(shù)據(jù)庫結(jié)構(gòu)圖。原子數(shù)據(jù)庫120存儲原子130。原子130相應(yīng)于單個數(shù)據(jù),例如,一個編譯的程序或串常數(shù)。原子130當(dāng)需要時被從原子數(shù)據(jù)庫120載入到內(nèi)存。這就降低了內(nèi)存的占用空間并減少盤I/O。原子數(shù)據(jù)庫120是從原子id 132值(整數(shù))到原子130的一個映射。原子id 132可以表示為標(biāo)識原子130的31-比特整數(shù)。原子130可以按任何順序加載。優(yōu)化原子數(shù)據(jù)庫120在盤上的表示以節(jié)約空間并減少將原子130載入內(nèi)存所需的I/O。原子數(shù)據(jù)庫120還提供從原子id 132值到與相關(guān)原子130相關(guān)的信息的映射,例如,符號和調(diào)試信息。原子數(shù)據(jù)庫120是一個由多個不同的部分構(gòu)成的文件,每個部分具有可變的大小,這些部分包括DB-頭部350和原子映象360。在不同的實(shí)施例中,原子映象360可以是主體原子映象、符號原子映象、范疇原子映象和/或描述原子映象。DB-頭部350必須首先出現(xiàn),但是其它映象部分的順序、位置和數(shù)量是任意的。DB-頭部350包含用于每個其它部分的文件偏移。每個部分,如果存在,必須確切地出現(xiàn)一次。
DB-頭部350在數(shù)據(jù)庫文件中正好處于第一位。它包含有關(guān)該文件和其它部分位置的某些全局信息,包括幻數(shù)(magic-number)、版本號、cpu類型、os類型、主體原子映象偏移、符號原子映象偏移、范疇原子映象偏移和描述原子映象偏移。
幻數(shù)將該文件識別為原子數(shù)據(jù)庫120,并且還定義在該文件中的所有其它多字節(jié)數(shù)的終止端(endianness)。如果數(shù)據(jù)庫被按小尾序(little endian)字節(jié)順序0xD7 0x150xFF 0x31存儲,那么幻數(shù)就包括這些四字節(jié)。對于一個大尾序(big endian)文件來說,字節(jié)被反轉(zhuǎn)0x31 0xFF 0x15 0xD7。該字節(jié)序列沒有特定的意義。數(shù)據(jù)庫文件將總是被存儲在包含其代碼的處理器的本地終止端(字節(jié)順序)。這就避免了在運(yùn)行時間對浪費(fèi)的字節(jié)交換的需要。然而,幻數(shù)清楚地規(guī)定了終止端以便交叉平臺工具可以操作原子數(shù)據(jù)庫120。
版本號表示數(shù)據(jù)庫所使用文件格式的版本。
CPU類型表示產(chǎn)生該數(shù)據(jù)庫的CPU的類型(例如,Pentium、PowerPC,等)。
OS類型是產(chǎn)生該數(shù)據(jù)庫的操作系統(tǒng)的類型(例如,Win32、Linux、MacOS X,等)。
主體原子映象偏移是相對于該文件的開始,主體原子映象部分開始處的文件偏移。
符號原子映象偏移是相對于文件的開始,符號原子映象部分開始處的文件偏移。
范疇原子映象偏移是相對于文件的開始,范疇原子映象部分開始處的文件偏移。
描述原子映象偏移是相對于文件的開始,描述原子映象部分開始處的文件偏移。
圖10是原子映象頭部數(shù)據(jù)的結(jié)構(gòu)圖。原子映象360包含原子映象頭部370和原子映象陣列380。原子映象360將原子id 132映射到可以發(fā)現(xiàn)與該原子id 132相關(guān)的某些信息處的文件偏移。原子映象360表示將為任意原子id 132組工作,但其為原子id 132的毗鄰范圍被最優(yōu)化,因此,例如,原子id 132{12,23,24,216}的原子映象360將比原子id 132{10,11,12,13}的原子映象占用更多空間。原子映象360部分開始于包括缺省原子序列增量(delta)372、原子偏移序列陣列大小374、原子偏移序列陣列偏移376和原子映象數(shù)據(jù)偏移378的原子映象頭部370。
缺省原子序列增量372字段可以被用在原子映象360中,該映象包含用于相應(yīng)于連續(xù)原子id 132的數(shù)據(jù)的文件偏移的序列。這些序列在原子映象360中被“增量編碼”以節(jié)省空間。增量編碼(delt coding)是將連續(xù)對之間的差別存儲作為序列數(shù)的技術(shù)。對于很多序列來說,增量很小,并且由于許多編碼方案可以更緊湊地存儲零附近的數(shù)字,所以增量序列通常占用比源序列更小的空間。例如,增量編碼版本{1000,1011,1012,1013,1015,1016}將看起來象{1000,1,1,1,2,1}。增量通常是小的正數(shù),但是它們可以通過從每一個中減去一個良好選擇的常數(shù),即,缺省原子序列增量372,而變得甚至更接近于零。例如,假設(shè)源數(shù)字序列是{1000,1050,1104,1165,1202}。增量編碼該序列產(chǎn)生{1000,50,54,61,37}。由于缺省原子序列增量372等于50,該序列將被進(jìn)一步調(diào)整為{1000,0,4,11,-13}。由于最終數(shù)字更靠近零,所以該序列可以被更緊湊地編碼。還可以使用霍夫曼(Huffman)編碼或算術(shù)編碼方案。
原子偏移序列陣列大小374是在原子映象360陣列序列中的條目的數(shù)量。
原子偏移序列陣列偏移376是相對于在數(shù)據(jù)庫文件中的原子映象360部分的開始,原子映象360陣列序列的文件偏移。
原子映象數(shù)據(jù)偏移378是相對于在原子數(shù)據(jù)庫120文件中的原子映象360部分的開始,在原子映象360數(shù)據(jù)開始處的文件偏移。
原子映象360(例如,主體原子映象,符號原子映象,范疇原子映象和描述原子映象)包含原子映象陣列380。每個原子映象陣列380單元是對文件偏移的壓縮序列(即,原子偏移序列390)的參考。每個原子偏移序列390包含用于屬于一組連續(xù)原子id 132的信息的壓縮的文件偏移。
圖11是原子映象陣列數(shù)據(jù)結(jié)構(gòu)圖。原子映象陣列380包括下列單元第一id 382,序列大小384和序列偏移386。第一id 382是序列中的第一原子130的原子id 132。序列大小384是在原子偏移序列390中的原子130的數(shù)量。在序列中的原子130具有開始于第一id 382的連續(xù)原子id 132。序列偏移386是相對于原子數(shù)據(jù)庫120的原子映象360部分的開始,至原子偏移序列390的開始的文件偏移。原子映象陣列380通過在每個序列中的第一原子130的原子id 132被排序。這就可以通過進(jìn)行對分查找來將原子id 132映射到其包含序列。掃描該包含序列將產(chǎn)生所需原子130的文件偏移。
圖12是原子偏移序列數(shù)據(jù)結(jié)構(gòu)圖。原子偏移序列390是文件偏移的增量編碼陣列,其包括第一原子文件偏移392和增量編碼文件偏移394陣列。每個文件偏移被加到原子映象數(shù)據(jù)偏移378,并相對于原子映象360部分的開始解釋該結(jié)果。由于緩沖了每一序列的固定開銷,所以一個長序列比兩個包含相同數(shù)量文件偏移的較小序列占用的空間少。然而,較長的序列需要更長的時間來搜索。因此,原子映象360典型地被分成更多序列而不必嚴(yán)格按照必需,來對其長度以及搜索時間進(jìn)行合理的限制。然而,對于序列大小并沒有固定限制。
第一原子文件偏移392是在序列中的第一原子130的文件偏移。序列的剩余部分是一串開始于該值的增量。
增量編碼文件偏移陣列394是編碼文件偏移序列的字節(jié)塊,在文件偏移處可以發(fā)現(xiàn)屬于連續(xù)原子id 132的數(shù)據(jù)。
為了編碼一個序列,編碼器從文件偏移序列開始。這些表示字節(jié)偏移被添加到原子映象數(shù)據(jù)偏移378。例如,假設(shè)源文件偏移序列是{1000,1050,1104,1165,1645,760}。注意,在文件中,原子130并不一定是按照順序的。首先,該序列被增量編碼為{1000,50,54,61,480,-885}。如果缺省原子序列增量372等于50,那么該序列將進(jìn)一步被調(diào)整為{1000,0,4,11,430,-935}。最后,該序列中的每個數(shù)字(在第一個之后,其被存儲在第一原子文件偏移392中)被編碼為大小可變的整數(shù)。編碼產(chǎn)生字節(jié)序列{0x00 0x04 0x0B 0x83 0x2E 0xF8 0x59}。某些整數(shù)使用對較小值占用較少字節(jié)的可變大小編碼方案來存儲。帶符號整數(shù)被編碼為7比特值的序列。不管數(shù)據(jù)庫的整體終止端如何,這些值被按大尾序字節(jié)順序(最高有效字節(jié)為先)存儲。每個字節(jié)的高位比特是表示后面是否還有字節(jié)的特定標(biāo)志。第一字節(jié)的第七個比特(數(shù)字?jǐn)?shù)據(jù)的最高有效位)是符號擴(kuò)展。無符號整數(shù)被編碼為7比特值的序列。不管數(shù)據(jù)庫的整體終止端如何,這些值被按大尾序字節(jié)順序(最高有效字節(jié)為先)存儲。每個比特的高位比特是表示后面是否還有字節(jié)的特定標(biāo)志。所產(chǎn)生的值被零擴(kuò)展。
原子映象360被用來使特定類型的信息與原子id 132相關(guān)。例如,原子映象360可以被用作代碼/數(shù)據(jù)主體信息、符號信息、范疇信息和描述信息。
主體原子映象將每個原子id132映射到加載該原子id 132所需的信息塊,該信息塊包括對于普通原子,包括有關(guān)可以被組合來形成最終普通原子主體的原子字節(jié)134和原子參考136的壓縮信息,對于特殊用途的原子,包括適合于特殊用途原子的每個子字節(jié)的信息。
所述塊的第一字節(jié)被用來編碼一組原子標(biāo)志396。如果原子標(biāo)志396的低三位的值不包含特殊用途識別符(例如,表示值“7”的三位比特),那么原子130是普通原子,否則,是特殊用途原子。為了加快加載普通原子主體,原子130的原子參考136和原子字節(jié)134在原子數(shù)據(jù)庫120文件中被連續(xù)存儲。為了使原子數(shù)據(jù)庫120的大小較小,從而提高其被加載的速度,普通原子主體的原子參考136和原子字節(jié)134被以多種方式壓縮。
圖13是編碼原子數(shù)據(jù)結(jié)構(gòu)的圖。用于普通原子的信息塊包括原子標(biāo)志396、原子數(shù)量信息397、編碼原子參考398、和編碼原始原子(raw atom)字節(jié)399。
原子標(biāo)志396使用標(biāo)志字節(jié)的不同比特來規(guī)定原子的壓縮類型。本發(fā)明的實(shí)施例支持多種壓縮類型。原子標(biāo)志396的其它比特規(guī)定了原子應(yīng)該被載入哪種緩存器(即,只讀代碼緩存器、只讀數(shù)據(jù)緩存器、讀寫數(shù)據(jù)緩存器)。其它比特還定義了原子130加載時所需調(diào)整的對數(shù)底數(shù)(log base)2(例如,存儲在這些比特中的值“3”將使得原子130在加載時使該原子130調(diào)整模8個字節(jié))。
原子數(shù)量信息397是包含有關(guān)有多少參考將出現(xiàn)在編碼原子參考398塊和有多少原始字節(jié)(raw byte)將從編碼原始字節(jié)399塊中提取出的信息的字節(jié)塊。該條目將確定將要提取的參考數(shù)量和原始字節(jié)數(shù)量。概念原子字節(jié)134和原子參考136被分別編碼為編碼原子參考398和編碼原子原始字節(jié)399。
圖14是編碼原子參考數(shù)據(jù)結(jié)構(gòu)圖。每個編碼原子參考398是描述從該原子130到其它原子130的參考的字節(jié)塊。例如,如果原子130表示調(diào)用由另一個原子130表示的另一個程序的程序,那么后一原子130將在編碼原子參考398中描述。該編碼原子參考398陣列被原子管理程序160用來在加載原子130時將它們鏈接在一起。
原子數(shù)量信息397是由編碼原子參考398編碼的原子參考的數(shù)量。
每個編碼原子參考398包含原子參考類型402、源偏移增量404、目的地(dest)偏移406和目的地原子-id 408。
原子參考類型402定義了從原子130到其它原子130的參考的不同類型。并非所有類型都被所有平臺使用。有效的原子參考類型402包括渴望絕對(eager-absolute)-32、渴望相對-32、延遲絕對(lazy-absolute)代碼-32、延遲相對代碼-32和延遲絕對-32。
渴望絕對-32使原子管理程序160立即加載參考原子130并存儲至它的一個絕對地址。
渴望相對-32與渴望絕對-32相似,但渴望相對-32存儲一個至參考原子130的相對偏移。相對偏移是從參考的開始測量的。
延遲絕對代碼-32定義了一個至包含代碼的原子130的絕對地址(例如,32比特)。它是“延遲”的,因為直到參考原子130被第一次調(diào)用它才被實(shí)際載入。原子管理程序160通過建立指向代碼分支的參考來管理延遲的加載,該代碼分支在第一次調(diào)用參考原子130時延遲加載它。
延遲相對代碼-32與延遲絕對代碼-32相似,但是延遲相對代碼-32存儲至參考的相對偏移。該相對偏移是從參考的開始測得的。
延遲,或按需加載,通過提供代碼的延遲加載來隱含地加載數(shù)據(jù),以及通過編碼參考原子識別符來明確地加載數(shù)據(jù),以便參考數(shù)據(jù)原子直到在運(yùn)行時間被實(shí)際訪問時才被加載。由于參考數(shù)據(jù)的代碼的加載可以被延遲直到被調(diào)用,所以代碼所參考的數(shù)據(jù)同樣被延遲-隱含地提供數(shù)據(jù)的延遲加載。明確的松散數(shù)據(jù)典型地需要程序設(shè)計員支持以便標(biāo)記該數(shù)據(jù)將被延遲加載(例如,使用編譯器命令)。在一個實(shí)施例中,明確的松散數(shù)據(jù)使用特定的編碼算法來參考,該編碼算法將參考原子識別符乘以2和將參考原子識別符增加1來產(chǎn)生松散數(shù)據(jù)原子識別符。
延遲絕對-32定義了至另一個原子130的絕對(例如,32-比特)地址。其是“延遲”的,因為參考原子130不能夠?qū)嶋H確切地被加載。相反,原子管理程序160通過存儲編碼地址(2*參考原子id)+1來鏈接該參考。注意,該編碼地址總是奇數(shù)。與可以使用跳轉(zhuǎn)分支的延遲代碼參考不同,松散數(shù)據(jù)參考需要與原子管理程序160正運(yùn)行的程序合作。它必須檢查奇數(shù)指針值并識別它們是否為松散數(shù)據(jù)參考。接著需要通過調(diào)回到原子管理程序160來加載所需的原子130,并典型地用最終地址重寫該參考。自然延遲加載的數(shù)據(jù)必須已知具有偶調(diào)整(even alignment),否則這種指針的奇數(shù)值將是模糊的。
源偏移增量404規(guī)定了在出現(xiàn)參考的原子130中有多少字節(jié)。該值被表示為從前一參考的末端的增量。第一參考被編碼為好像在源偏移0結(jié)束處存在前一參考。參考總是通過按它們的源偏移排序來存儲,因此,在該陣列中的增量總是非負(fù)的。例如,如果原子130在字節(jié)偏移0,4,8,12,20處具有四字節(jié)參考,那么用于那些參考的源偏移增量字段將被編碼為0,0,0,0,4。
目的地偏移406將多個字節(jié)的偏移編碼成該參考所指向的參考(目的地)原子130。
目的地原子-id 408是該參考所指向的原子130的原子id 132。
編碼原始原子字節(jié)399是表示用于原子130的原子字節(jié)134的字節(jié)塊,其中需要用來容納對其它原子130的任何參考的空間被“清空(spliced out)”,并且其中剩余原始字節(jié)被按原子壓縮類型規(guī)定的方式壓縮。由于編碼參考信息包含源偏移(識別進(jìn)行參考的位置)、目的地id(識別目標(biāo)原子)和目的地偏移(識別在該參考所指向的目標(biāo)原子中有多少字節(jié)),所以原子字節(jié)內(nèi)的參考可被移除來建立原始字節(jié)。例如,如果原子字節(jié)134表示C串常數(shù),該陣列可以具有字符串序列,可能是壓縮的。如果相反,原子字節(jié)134由四個數(shù)據(jù)字節(jié)構(gòu)成,其后是對另一個原子130的四字節(jié)參考,其后是八個另外的數(shù)據(jù)字節(jié),那么編碼原始原子字節(jié)399將只包含這十二字節(jié)的數(shù)據(jù),可以是壓縮的。四字節(jié)參考將在加載期間被“接合(spliced in)”入位,這使得完全加載的原子字節(jié)134占有16字節(jié)。
特殊用途原子由包含特殊用途識別符的原子標(biāo)志396定義(例如,其低三位設(shè)置為值“7”)。原子標(biāo)志396的剩余比特規(guī)定了特殊用途原子是dll參考原子還是dll原子。
Dll參考原子包括三個字段原子標(biāo)志、dll原子id和dll符號。Dll參考原子相應(yīng)于外部DLL(例如printf()庫函數(shù)的原子130)的符號。這些原子130表示為DLL和在該DLL中查找的符號的一對。Dll原子id規(guī)定了dll原子的id,其規(guī)定了在其中查找dll符號的DLL。Dll符號規(guī)定了哪個符號在DLL中查找。
Dll原子包括原子標(biāo)志字段和dll路徑名字段。Dll原子與dll參考原子相關(guān)并用來規(guī)定dll參考原子將在其中查找符號的DLL。Dll路徑名規(guī)定了適合傳遞到dlopen、LoadLibrary或等同函數(shù)的路徑名。其被作為C串存儲(以0結(jié)束的字節(jié)序列)。
符號原子映象將原子id 132映射到文本符號,通過此,相關(guān)原子130可以通過名字來訪問。符號對于以用戶友好的方式參考原子130是有用的。例如,當(dāng)利用原子識別符值57參考原子130時,對于程序設(shè)計人員來說通過名字(例如“printf”)參考原子130,比通過其原子識別符值(例如,“57”)參考該原子更容易。
范疇原子映象是從原子id 132到?jīng)]有固定語義的文本范疇的原子映象360。描述原子映象考慮到了開發(fā)者的特定原子種類。在另一個例子中,范疇可以用來標(biāo)記原子130以識別字符串原子130,識別用于國際化和許多其它目的的原子130。
描述原子映象是從原子id 132到?jīng)]有固定語義的文本描述的原子映象360。當(dāng)開發(fā)/調(diào)試基于原子的系統(tǒng)時,描述原子映象被用來存儲對于開發(fā)者有用的調(diào)試信息。
原子參考的參考類型可以基于對參考的利用做出概要來靜態(tài)或動態(tài)地改變。原子參考136一般缺省為“延遲”以便延遲加載實(shí)際原子字節(jié)134直到它在運(yùn)行時間實(shí)際被需要?!翱释眳⒖际沟卯?dāng)調(diào)用原子130被加載時加載被參考的數(shù)據(jù)代碼,而無論其是否實(shí)際被需要。通常在運(yùn)行時間于給定的原子130之內(nèi)執(zhí)行的運(yùn)行時間代碼路徑將不執(zhí)行原子130內(nèi)的所有指令。加載不被調(diào)用或不被參考的原子130是對內(nèi)存和處理資源的浪費(fèi)。
對用于代碼的延遲參考的分解包括指向當(dāng)參考原子130第一次被調(diào)用時延遲加載參考原子130的代碼分支。對用于數(shù)據(jù)的延遲參考的分解包括將參考原子id存儲為由(2*參考原子id)+1定義的修改的原子id。
一旦延遲代碼參考被執(zhí)行/訪問,可以進(jìn)行優(yōu)化以避免間接使用代碼分支。該優(yōu)化包括“回補(bǔ)”參考代碼以直接參考所加載的原子130。回補(bǔ)利用在內(nèi)存中直接跳轉(zhuǎn)到代碼原子130來代替使用分支。回補(bǔ)可以為第一個實(shí)際調(diào)用程序執(zhí)行并且也可以應(yīng)用于任何加載原子130,以便如果并且當(dāng)參考原子130被實(shí)際調(diào)用時,可以直接跳轉(zhuǎn)到它。代碼分支可以留在內(nèi)存中由沒有對其進(jìn)行回補(bǔ)的其它原子使用。本發(fā)明的實(shí)施例規(guī)定代碼原子130和數(shù)據(jù)原子130參考被標(biāo)記以在原子級別上影響特定加載操作(例如,延遲或渴望)。
圖15是五個代碼程序和三個數(shù)據(jù)單元的示例系統(tǒng)圖。在該示例中,程序P1調(diào)用程序P2和P3,程序P1也訪問數(shù)據(jù)單元D1,其訪問數(shù)據(jù)單元D2。程序P2調(diào)用程序P4并訪問數(shù)據(jù)單元D3。程序P3訪問數(shù)據(jù)單元D1并調(diào)用程序P5。根據(jù)本發(fā)明的一個實(shí)施例,每個代碼程序{P1,P2,P3,P4,P5}定義為單個的單獨(dú)可尋址原子。類似地,每個數(shù)據(jù)單元{D1,D2,D3}定義為單個的單獨(dú)可尋址原子。在運(yùn)行時間,當(dāng)P1被加載時,D1立刻被加載,這使得D2將被加載。如果對P2和P3的參考是延遲的,那么將建立用于P2和P3的分支,考慮到程序代碼的實(shí)際加載將被延遲,直到如果或者當(dāng)它們實(shí)際被調(diào)用為止。很可能某些代碼程序(例如,錯誤處理程序)在正常執(zhí)行路徑期間不會被調(diào)用。在這種情況下,通過延遲加載可以節(jié)省處理和內(nèi)存?;诖a(例如,P2)的延遲加載的數(shù)據(jù)(例如,D3)的隱含加載節(jié)省了處理器和內(nèi)存兩者。
數(shù)據(jù)原子參考可以被編碼以提供用于數(shù)據(jù)單元的類似容量。數(shù)據(jù)的明確延遲加載可以提供甚至更多的節(jié)約(例如,D3的加載甚至可以被延遲到P2被加載之后)。
通過修改參考原子的原子識別符,原子管理程序160可以延遲數(shù)據(jù)單元/原子的加載直到它實(shí)際被參考為止。對于代碼原子,很可能某些數(shù)據(jù)原子(例如,錯誤消息)在正常執(zhí)行路徑期間不會被參考。數(shù)據(jù)原子的延遲/遲緩加載也節(jié)省了處理和內(nèi)存。
傳統(tǒng)系統(tǒng)(例如,Linux DLL)提供了代碼分支,但是這些系統(tǒng)在啟動時建立了用于所有可能參考的分支。相反,本發(fā)明的實(shí)施例只為被加載原子130實(shí)際參考的每個原子130建立分支。參考圖13,加載P1會使得用于P2和P3的分支被建立,但不建立用于P4的分支。傳統(tǒng)的系統(tǒng)典型地在啟動時加載所有數(shù)據(jù)單元。例如,在傳統(tǒng)系統(tǒng)中,在啟動時D1,D2和D3都將被加載。相反,本發(fā)明的實(shí)施例在加載D2時或只有當(dāng)D3被實(shí)際使用時才加載D3。在加載方面,以相似的方式來處理數(shù)據(jù)和代碼的靈活性提供許多性能改善。對于具有相對大的數(shù)據(jù)與代碼之比的系統(tǒng)尤其如此。
圖16a是示例數(shù)據(jù)原子130的圖。數(shù)據(jù)原子130被概念性地表示以示例它們的原子id 132、原子字節(jié)134和原子參考136。數(shù)據(jù)原子16001(類似于圖15的D1)包含兩個數(shù)據(jù)項(原子字節(jié)134)至個人名字(例如,“Mary Smith”)的參考(指針)和表示Mary的年齡(例如,47)的整數(shù)。參考(原子參考136)是對原子16002的參考。參考16002(類似于圖15中的D2)是表示字符串“Mary Smith”(原子字節(jié)132)的數(shù)據(jù)原子130,原子16002不參考任何其它原子。
圖16b是示例代碼原子130的圖。代碼原子130被概念地表示以示例它們的原子id 132、原子字節(jié)134和原子參考136。代碼原子15000(類似于圖15中的P5)表示print_person()程序的可執(zhí)行代碼,其用來打印出人名和年齡。代碼原子16000(類似于圖15中的P3)表示調(diào)用print_person()函數(shù)以打印輸出Mary的名字和年齡的程序。代碼原子16000通過參考數(shù)據(jù)原子16001來參考用于Mary的數(shù)據(jù),并通過參考代碼原子15000print_person()來調(diào)用print_person()函數(shù)。因此,由原子16000表示的原子包含兩個原子參考136,對原子15000(用于print_person()程序的代碼原子)的代碼原子參考136和對原子16001(用于Mary的數(shù)據(jù)的數(shù)據(jù)原子)的數(shù)據(jù)原子參考136。
雖然本發(fā)明參考其優(yōu)選實(shí)施例進(jìn)行了特別展示和描述,但是本領(lǐng)域技術(shù)人員應(yīng)該明白,在不脫離由所附權(quán)利要求包括的本發(fā)明的范圍的情況下,可以對其作出各種形式和細(xì)節(jié)上的變化。
具體來說,原子數(shù)據(jù)庫120被描述為具有大量不同的部分,本領(lǐng)域技術(shù)人員很容易認(rèn)識到,表示原子130的不同用途的各部分可以在本發(fā)明的教導(dǎo)的范圍之內(nèi)被添加或移除。此外,實(shí)際盤編碼方案可以在本發(fā)明的教導(dǎo)范圍之內(nèi)進(jìn)行改變。
雖然本發(fā)明的實(shí)施例適合于實(shí)現(xiàn)CurlTM運(yùn)行時間,但是所有的公開并不將本發(fā)明的使用限制于CurlTM運(yùn)行時間。本發(fā)明的各實(shí)施例可以適用于任何軟件程序。
權(quán)利要求
1.一種按照需要加載原子化計算機(jī)程序代碼和數(shù)據(jù)的方法,包括將以精細(xì)顆?;?、單獨(dú)可尋址方式定義代碼或數(shù)據(jù)的原子從原子數(shù)據(jù)庫加載到內(nèi)存中,所述原子包括原子識別符;計算機(jī)程序代碼或數(shù)據(jù)信息;計算機(jī)程序代碼或數(shù)據(jù)參考信息;和通過將參考原子識別符變換成內(nèi)存地址來修改計算機(jī)程序代碼或數(shù)據(jù)信息。
2.根據(jù)權(quán)利要求1的方法,其中,內(nèi)存地址是用于加載被參考原子并跳轉(zhuǎn)到該被參考原子的分支例程的內(nèi)存地址。
3.根據(jù)權(quán)利要求2的方法,其中,到所述分支例程的內(nèi)存地址由直接參考所述被參考原子的更新的內(nèi)存地址來重寫。
4.根據(jù)權(quán)利要求2的方法,其中,到所述分支例程的內(nèi)存地址對于參考所述被參考原子的所有被加載原子進(jìn)行重寫。
5.根據(jù)權(quán)利要求1的方法,其中,所述修改步驟進(jìn)一步包括編碼內(nèi)存地址以便被參考數(shù)據(jù)原子直到在運(yùn)行時間實(shí)際被訪問時才加載。
6.根據(jù)權(quán)利要求5的方法,其中,所述編碼步驟包括將參考原子識別符乘以2并將該參考原子識別符加1來產(chǎn)生松散數(shù)據(jù)原子識別符。
7.根據(jù)權(quán)利要求1的方法,進(jìn)一步包括步驟基于對在前的原子加載經(jīng)歷的運(yùn)行時間模式的分析,重新排序基于盤的原子數(shù)據(jù)庫中的原子以使訪問有效率。
8.根據(jù)權(quán)利要求1的方法,進(jìn)一步包括步驟通過代替計算機(jī)程序代碼或數(shù)據(jù)信息以及計算機(jī)程序代碼或數(shù)據(jù)參考信息來更新在原子數(shù)據(jù)庫中的至少一個原子。
9.根據(jù)權(quán)利要求1的方法,進(jìn)一步包括步驟向原子數(shù)據(jù)庫中的原子添加新的原子。
10.根據(jù)權(quán)利要求1的方法,進(jìn)一步包括步驟從原子數(shù)據(jù)庫中的原子中刪除所選原子。
11.根據(jù)權(quán)利要求1的方法,其中,所述加載步驟進(jìn)一步包括解壓縮以壓縮格式存儲的計算機(jī)程序代碼或數(shù)據(jù)信息。
12.根據(jù)權(quán)利要求1的方法,其中,基于預(yù)定使用門限從內(nèi)存中移除被加載原子。
13.根據(jù)權(quán)利要求1的方法,其中,被加載原子的執(zhí)行在加載由該被加載原子所參考的所有原子之前開始。
14.根據(jù)權(quán)利要求1的方法,進(jìn)一步包括步驟修改計算機(jī)程序代碼或數(shù)據(jù)參考信息以影響渴望或延遲加載技術(shù)。
15.根據(jù)權(quán)利要求14的方法,其中,修改步驟基于對在前的原子加載經(jīng)歷的運(yùn)行時間模式的分析來確定加載技術(shù)。
16.根據(jù)權(quán)利要求1的方法,其中,被加載原子通過只讀緩存器在多個可執(zhí)行處理之間共享。
17.一種原子化計算機(jī)程序代碼和數(shù)據(jù)的方法,包括接收按照定義單獨(dú)可尋址代碼和數(shù)據(jù)的目標(biāo)代碼格式的計算機(jī)程序代碼和數(shù)據(jù);從按照目標(biāo)代碼格式的計算機(jī)程序代碼和數(shù)據(jù)中提取計算機(jī)程序代碼和數(shù)據(jù)信息;從按照目標(biāo)代碼格式的計算機(jī)程序代碼和數(shù)據(jù)中提取計算機(jī)程序代碼和數(shù)據(jù)參考信息;修改計算機(jī)程序代碼和數(shù)據(jù)參考信息以使用原子識別符;和將計算機(jī)程序代碼和數(shù)據(jù)信息以及計算機(jī)程序代碼和數(shù)據(jù)參考信息存儲在一個原子中,該原子包括原子識別符;計算機(jī)程序代碼或數(shù)據(jù)信息;和計算機(jī)程序代碼或數(shù)據(jù)參考信息。
18.一種按照需要加載原子化計算機(jī)程序代碼和數(shù)據(jù)的裝置,包括原子,其包括原子識別符;計算機(jī)程序代碼或數(shù)據(jù)信息;計算機(jī)程序代碼或數(shù)據(jù)參考信息;和原子管理程序單元,其將以精細(xì)顆?;?、單獨(dú)可尋址方式定義代碼或數(shù)據(jù)的原子從原子數(shù)據(jù)庫加載到內(nèi)存中,并通過將參考原子識別符變換成內(nèi)存地址來修改計算機(jī)程序代碼或數(shù)據(jù)信息。
19.一種原子化計算機(jī)程序代碼和數(shù)據(jù)的裝置,包括接收器,用于接收按照定義單獨(dú)可尋址代碼和數(shù)據(jù)的目標(biāo)代碼格式的計算機(jī)程序代碼和數(shù)據(jù);提取器,用于從按照目標(biāo)代碼格式的計算機(jī)程序代碼和數(shù)據(jù)中提取計算機(jī)程序代碼和數(shù)據(jù)信息,并從按照目標(biāo)代碼格式的計算機(jī)程序代碼和數(shù)據(jù)中提取計算機(jī)程序代碼和數(shù)據(jù)參考信息;修改器,用于修改計算機(jī)程序代碼和數(shù)據(jù)參考信息以使用原子識別符;和存儲單元,用于將計算機(jī)程序代碼和數(shù)據(jù)信息以及計算機(jī)程序代碼和數(shù)據(jù)參考信息存儲在一個原子中,所述原子包括原子識別符;計算機(jī)程序代碼或數(shù)據(jù)信息;和計算機(jī)程序代碼或數(shù)據(jù)參考信息。
20.一種按照需要加載原子化計算機(jī)程序代碼和數(shù)據(jù)的裝置,包括用于將以精細(xì)顆?;为?dú)可尋址方式定義代碼或數(shù)據(jù)的原子從原子數(shù)據(jù)庫加載到內(nèi)存中的設(shè)備,所述原子包括原子識別符;計算機(jī)程序代碼或數(shù)據(jù)信息;計算機(jī)程序代碼或數(shù)據(jù)參考信息;和用于通過將參考原子識別符變換成內(nèi)存地址來修改計算機(jī)程序代碼或數(shù)據(jù)信息的設(shè)備。
21.一種用于原子化計算機(jī)程序代碼和數(shù)據(jù)的裝置,包括用來接收按照定義單獨(dú)可尋址代碼和數(shù)據(jù)的目標(biāo)代碼格式的計算機(jī)程序代碼和數(shù)據(jù)的設(shè)備;用來從按照目標(biāo)代碼格式的計算機(jī)程序代碼和數(shù)據(jù)中提取計算機(jī)程序代碼和數(shù)據(jù)信息的設(shè)備;用來從按照目標(biāo)代碼格式的計算機(jī)程序代碼和數(shù)據(jù)中提取計算機(jī)程序代碼和數(shù)據(jù)參考信息的設(shè)備;用來修改計算機(jī)程序代碼和數(shù)據(jù)參考信息以使用原子識別符的設(shè)備;和用來將計算機(jī)程序代碼和數(shù)據(jù)信息以及計算機(jī)程序代碼和數(shù)據(jù)參考信息存儲在一個原子中的設(shè)備,所述原子包括原子識別符;計算機(jī)程序代碼或數(shù)據(jù)信息;和計算機(jī)程序代碼或數(shù)據(jù)參考信息。
22.一種計算機(jī)程序產(chǎn)品,包括用來按照需要加載原子化計算機(jī)程序代碼和數(shù)據(jù)的計算機(jī)可用介質(zhì);嵌入在該計算機(jī)可用介質(zhì)中的一組計算機(jī)程序指令,包括以下指令將以精細(xì)顆粒化、單獨(dú)可尋址方式定義代碼或數(shù)據(jù)的原子從原子數(shù)據(jù)庫加載到內(nèi)存,所述原子包括原子識別符;計算機(jī)程序代碼或數(shù)據(jù)信息;計算機(jī)程序代碼或數(shù)據(jù)參考信息;和通過將參考原子識別符變換成內(nèi)存地址來修改計算機(jī)程序代碼或數(shù)據(jù)信息。
23.一種計算機(jī)程序產(chǎn)品,包括用來原子化計算機(jī)程序代碼和數(shù)據(jù)的計算機(jī)可用介質(zhì);嵌入在該計算機(jī)可用介質(zhì)上的一組計算機(jī)程序指令,包括下列指令接收按照定義單獨(dú)可尋址代碼和數(shù)據(jù)的目標(biāo)代碼格式的計算機(jī)程序代碼和數(shù)據(jù);從按照目標(biāo)代碼格式的計算機(jī)程序代碼和數(shù)據(jù)中提取計算機(jī)程序代碼和數(shù)據(jù)信息;從按照目標(biāo)代碼格式的計算機(jī)程序代碼和數(shù)據(jù)中提取計算機(jī)程序代碼和數(shù)據(jù)參考信息;修改計算機(jī)程序代碼和數(shù)據(jù)參考信息以使用原子識別符;和將計算機(jī)程序代碼和數(shù)據(jù)信息以及計算機(jī)程序代碼和數(shù)據(jù)參考信息存儲在一個原子中,所述原子包括原子識別符;計算機(jī)程序代碼或數(shù)據(jù)信息;和計算機(jī)程序代碼或數(shù)據(jù)參考信息。
24.一種嵌入在包括代碼片段的載波中的計算機(jī)數(shù)據(jù)信號,用來按照需要加載原子化計算機(jī)程序代碼和數(shù)據(jù),其包括下列指令將以精細(xì)顆?;?、單獨(dú)可尋址方式定義代碼或數(shù)據(jù)的原子從原子數(shù)據(jù)庫加載到內(nèi)存,所述原子包括原子識別符;計算機(jī)程序代碼或數(shù)據(jù)信息;計算機(jī)程序代碼或數(shù)據(jù)參考信息;和通過將參考原子識別符變換成內(nèi)存地址來修改計算機(jī)程序代碼或數(shù)據(jù)信息。
25.一種嵌入在包括代碼片段的載波中的計算機(jī)數(shù)據(jù)信號,用于原子化計算機(jī)程序代碼和數(shù)據(jù),包括下列指令接收按照定義單獨(dú)可尋址代碼和數(shù)據(jù)的目標(biāo)代碼格式的計算機(jī)程序代碼和數(shù)據(jù);從按照目標(biāo)代碼格式的計算機(jī)程序代碼和數(shù)據(jù)中提取計算機(jī)程序代碼和數(shù)據(jù)信息;從按照目標(biāo)代碼格式的計算機(jī)程序代碼和數(shù)據(jù)中提取計算機(jī)程序代碼和數(shù)據(jù)參考信息;修改計算機(jī)程序代碼和數(shù)據(jù)參考信息以使用原子識別符;和將計算機(jī)程序代碼和數(shù)據(jù)信息以及計算機(jī)程序代碼和數(shù)據(jù)參考信息存儲在一個原子中,所述原子包括原子識別符;計算機(jī)程序代碼或數(shù)據(jù)信息;和計算機(jī)程序代碼或數(shù)據(jù)參考信息。
26.一種用來存儲由在數(shù)據(jù)處理系統(tǒng)上執(zhí)行的計算機(jī)程序所訪問的數(shù)據(jù)的存儲器,其包括存儲在表示原子數(shù)據(jù)庫的存儲器中的數(shù)據(jù)結(jié)構(gòu),該數(shù)據(jù)結(jié)構(gòu)包括頭部;和原子映象,該原子映象包括原子映象頭部;和原子映象主體,該原子映象主體包括參考原子偏移序列的原子映象陣列,所述原子偏移序列包括第一原子文件偏移;增量編碼文件偏移陣列;以及,參考一個原子包括原子標(biāo)志;原子數(shù)量信息;編碼的原子參考;和編碼的原始原子字節(jié)。
27.根據(jù)權(quán)利要求26的存儲器,其中,所述原子映象提供原子識別符到符號名的映射。
全文摘要
軟件原子化提供了一種通過將以精細(xì)顆?;?、單獨(dú)可尋址方式定義代碼或數(shù)據(jù)的原子從原子數(shù)據(jù)庫加載到內(nèi)存以按照需要加載原子化計算機(jī)程序代碼和數(shù)據(jù)的方法。原子包括原子識別符、計算機(jī)程序代碼或數(shù)據(jù)信息以及計算機(jī)程序代碼或數(shù)據(jù)參考信息。所述計算機(jī)程序代碼或數(shù)據(jù)信息通過將參考信息變換成內(nèi)存地址來修改。本發(fā)明提供了以隱含地以及明確地兩種方式延遲加載數(shù)據(jù)。當(dāng)參考延遲加載的代碼時,數(shù)據(jù)被隱含地延遲加載。通過編碼參考原子識別符延遲加載數(shù)據(jù),以便被參考數(shù)據(jù)原子直到在運(yùn)行時間被實(shí)際訪問才被加載。
文檔編號G06F9/445GK1826586SQ03815271
公開日2006年8月30日 申請日期2003年6月3日 優(yōu)先權(quán)日2002年6月3日
發(fā)明者馬修·J.·郝斯特特爾, 本杰明·R.·哈瑞森 申請人:住商信息系統(tǒng)株式會社
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點(diǎn)贊!
1