專(zhuān)利名稱(chēng):用于軟件原子化的視圖的制作方法
相關(guān)申請(qǐng)本申請(qǐng)是2002年6月21日申請(qǐng)的美國(guó)申請(qǐng)?zhí)?0/178,898的繼續(xù)申請(qǐng),在此將其并入本項(xiàng)申請(qǐng)中作為參考。
背景技術(shù):
計(jì)算機(jī)軟件通常是為解釋語(yǔ)言系統(tǒng)或編譯語(yǔ)言系統(tǒng)創(chuàng)建的。解釋語(yǔ)言系統(tǒng)將高級(jí)程序語(yǔ)句翻譯成可執(zhí)行形式,并且每次執(zhí)行一條語(yǔ)句,而不是在執(zhí)行之前全部翻譯(即編譯)高級(jí)語(yǔ)句。通常運(yùn)用Basic、LISP和APL作為解釋語(yǔ)言。編譯語(yǔ)言系統(tǒng)在執(zhí)行之前將高級(jí)程序語(yǔ)句翻譯成中間的目標(biāo)代碼格式。在編譯語(yǔ)言系統(tǒng)中,程序語(yǔ)句用源代碼程序設(shè)計(jì)語(yǔ)言(如C、C++)來(lái)編寫(xiě)。源代碼包括用不能由計(jì)算機(jī)直接執(zhí)行的高級(jí)或匯編語(yǔ)言編寫(xiě)的人可讀程序語(yǔ)句。源代碼是由編譯器進(jìn)行處理,編譯器通過(guò)遵循一組句法和語(yǔ)義規(guī)則將源代碼變換成目標(biāo)代碼(如OBJ文件)。然后,利用鏈接程序?qū)⒛繕?biāo)代碼連接起來(lái),以生成可執(zhí)行的計(jì)算機(jī)程序(如EXE文件)。
可執(zhí)行計(jì)算機(jī)軟件在存儲(chǔ)到磁盤(pán)上和載入計(jì)算機(jī)存儲(chǔ)器中時(shí)會(huì)很大。動(dòng)態(tài)鏈接庫(kù)(“DLL”)提供一種機(jī)制來(lái)存儲(chǔ)與可執(zhí)行的計(jì)算機(jī)主程序獨(dú)立的可執(zhí)行例程和數(shù)據(jù)??蓤?zhí)行例程在可執(zhí)行計(jì)算機(jī)程序需要時(shí)才會(huì)被加載。當(dāng)使用例程或數(shù)據(jù)時(shí),DLL通過(guò)僅僅使用存儲(chǔ)器來(lái)節(jié)省空間。DLL還規(guī)定與可執(zhí)行的計(jì)算機(jī)主程序獨(dú)立的、以及與其他DLL獨(dú)立的計(jì)算機(jī)代碼和數(shù)據(jù)的組織和管理。這允許程序員僅對(duì)DLL中的某些例程進(jìn)行糾正或改進(jìn),而不影響對(duì)調(diào)用的計(jì)算機(jī)程序或任何其他DLL的操作,還不需要對(duì)調(diào)用程序或任何其他DLL重新編譯。此外,DLL還可以在多個(gè)計(jì)算機(jī)程序之間進(jìn)行共享。DLL本身會(huì)是很大又很多的可執(zhí)行例程,由于其單片性,DLL在下載、更新和加載方面不是非常粒狀(granular)的。
存在這樣一些技術(shù),用于最小化與更新大的DLL或其他代碼/數(shù)據(jù)有關(guān)的傳送時(shí)間。使用差分檢測(cè)算法(如rsync)的文件傳送協(xié)議,能夠減少傳送時(shí)間。這些算法可以將源文件和目標(biāo)文件排列成數(shù)據(jù)塊,對(duì)這些塊進(jìn)行分析,并僅僅傳送在源文件和目標(biāo)文件之間不同的塊。
還可以使用壓縮來(lái)減少通信介質(zhì)上和從磁盤(pán)到存儲(chǔ)器的代碼和數(shù)據(jù)的傳送時(shí)間。尤其對(duì)可執(zhí)行代碼尺寸敏感的嵌入式處理器系統(tǒng)已經(jīng)實(shí)現(xiàn),它對(duì)可執(zhí)行代碼實(shí)施壓縮??梢允褂么a的壓縮的“線(xiàn)(wire)”表示,但是在執(zhí)行之前必須對(duì)代碼進(jìn)行解壓。其他技術(shù)規(guī)定直接執(zhí)行壓縮代碼(如“字節(jié)編碼的(byte-coded)RISC”或“BRISC”虛擬機(jī)(virtual machine))。
CurlTM語(yǔ)言將設(shè)計(jì)、腳本編寫(xiě)和程序設(shè)計(jì)能力合并在一個(gè)集成環(huán)境中。通過(guò)將該具有完全特征的語(yǔ)言與客戶(hù)端的執(zhí)行相組合,CurlTM技術(shù)在Web上傳送快速、有效和功能強(qiáng)大的應(yīng)用程序,并且能夠?qū)崿F(xiàn)使客戶(hù)端和服務(wù)器互操作的交互式Web服務(wù)能力。利用增加了CurlrM插件和CurlTM運(yùn)行時(shí)環(huán)境的Web瀏覽器來(lái)顯示CurlTM內(nèi)容。CurlTM運(yùn)行時(shí)環(huán)境是非典型的運(yùn)行時(shí)環(huán)境,因?yàn)樗菑慕频攘康拇a和數(shù)據(jù)進(jìn)行編譯的。利用大量的DLL,CurlTM運(yùn)行時(shí)環(huán)境才得以實(shí)現(xiàn)。
發(fā)明內(nèi)容
包括一些大的可執(zhí)行程序和/或大的共享庫(kù)(DLL)的計(jì)算機(jī)系統(tǒng)在存儲(chǔ)在磁盤(pán)上和載入存儲(chǔ)器中時(shí)會(huì)出現(xiàn)容量問(wèn)題。此外,在運(yùn)載(shipped)時(shí),對(duì)這些系統(tǒng)進(jìn)行更新或修補(bǔ)需要擴(kuò)展帶寬,因此,常常造成在客戶(hù)端存儲(chǔ)關(guān)于代碼和/或數(shù)據(jù)的多個(gè)、近乎一樣的副本。這確實(shí)如此,因?yàn)橛?jì)算機(jī)系統(tǒng)通過(guò)各種遞增的版本發(fā)展,用戶(hù)需要同時(shí)對(duì)多個(gè)版本進(jìn)行支持。
原子數(shù)據(jù)庫(kù)的視圖通過(guò)提供對(duì)原子數(shù)據(jù)庫(kù)中的現(xiàn)有原子的運(yùn)行時(shí)變換來(lái)創(chuàng)建新的或虛擬原子數(shù)據(jù)庫(kù),使這些問(wèn)題得到解決。視圖提供了對(duì)原子數(shù)據(jù)庫(kù)中所存儲(chǔ)的代碼或數(shù)據(jù)的共享,還提供對(duì)載入存儲(chǔ)器的代碼或數(shù)據(jù)的共享。原子是代碼或數(shù)據(jù)的細(xì)粒的(fine-grained)可尋址單元,包括永久標(biāo)識(shí)符、代碼/數(shù)據(jù)字節(jié)和對(duì)其他原子的引用。這些原子存儲(chǔ)在原子數(shù)據(jù)庫(kù)中。本專(zhuān)利申請(qǐng)與由Mathew J.Hostetter和Benjamin R.Harrison于2002年6月3日申請(qǐng)的、名稱(chēng)為“軟件原子化”的共同未決的美國(guó)專(zhuān)利申請(qǐng)No.10/161,964有關(guān),在此合并其全部所教內(nèi)容作為參考。
視圖是一組變換操作,包括插入一個(gè)新原子,修改一個(gè)現(xiàn)有原子,或者刪除一個(gè)現(xiàn)有原子,這些操作可以應(yīng)用于原子數(shù)據(jù)庫(kù)。對(duì)于未修改也未刪除的原子,重用操作(reuse operation)是固有的。變換操作可以用于,要么真實(shí)地(literally)在磁盤(pán)上創(chuàng)建一個(gè)新原子數(shù)據(jù)庫(kù),要么虛擬地(virtually),在運(yùn)行時(shí)創(chuàng)建一個(gè)虛擬原子數(shù)據(jù)庫(kù),而不必實(shí)際上在磁盤(pán)上創(chuàng)建一個(gè)真實(shí)的原子數(shù)據(jù)庫(kù)。修改現(xiàn)有原子可以用各種方法,包括改變?cè)幼止?jié),或者原子引用,或者原子屬性。如果需要,甚至可以將視圖破壞性地應(yīng)用于在適當(dāng)位置對(duì)原子數(shù)據(jù)庫(kù)進(jìn)行修改。
不同類(lèi)型的視圖變換具有不同的優(yōu)缺點(diǎn)。虛擬地將視圖應(yīng)用于創(chuàng)建虛擬原子數(shù)據(jù)庫(kù)需要較少的磁盤(pán)空間來(lái)存儲(chǔ)這些原子,但是在運(yùn)行時(shí)較慢,因?yàn)槊看渭虞d一個(gè)原子都要進(jìn)行變換操作。好處是保留了變換信息,并且可以使用變換信息以在各種視圖之間共享原子。真實(shí)地將視圖應(yīng)用于創(chuàng)建虛擬原子數(shù)據(jù)庫(kù)需要較多的磁盤(pán)空間來(lái)存儲(chǔ)這些原子,但是在運(yùn)行時(shí)較快,因?yàn)橐呀?jīng)應(yīng)用了這些變換。這允許直接加載變換過(guò)的原子,但是喪失了在各種視圖之間共享原子的能力。即使不能共享原子數(shù)據(jù)庫(kù),每個(gè)可執(zhí)行的原子數(shù)據(jù)庫(kù)可以以原子數(shù)據(jù)庫(kù)的不同副本來(lái)運(yùn)行。真實(shí)地將視圖應(yīng)用于重寫(xiě)(overwrite)現(xiàn)有的原子數(shù)據(jù)庫(kù)節(jié)省了磁盤(pán)空間,并且在運(yùn)行時(shí)較快,但是一旦應(yīng)用變換,變換信息就丟失,因此,在各種視圖之間不再共享原子數(shù)據(jù)庫(kù)。對(duì)于所有情況都為最佳的單一選擇是沒(méi)有的。每個(gè)計(jì)算機(jī)程序環(huán)境必須權(quán)衡各種視圖選擇的優(yōu)缺點(diǎn),以便選擇整體上最佳的解決方案來(lái)滿(mǎn)足特定的性能需求。
映射表是一種簡(jiǎn)單的視圖形式,表中唯一的操作是修改操作,并且表中那些修改操作僅能用另一原子的原子字節(jié)和原子引用來(lái)替換現(xiàn)有原子的原子字節(jié)和原子引用(稱(chēng)作替換操作)。它可以用于(真實(shí)地或虛擬地)完全用另一原子來(lái)替換現(xiàn)有原子,然而卻保留同樣的原子標(biāo)識(shí)符。這考慮到可能具有對(duì)老的原子的原子引用的任何其他原子“自動(dòng)地”引用替換它的原子。因?yàn)橛成浔碛昧硪辉觼?lái)替換現(xiàn)有原子,它們能夠隨意完成有興趣的修改操作,比如將一些原子字節(jié)從英語(yǔ)變換為日語(yǔ),或者將一些原子引用從懶惰的(lazy)變到急切的(eager)。
創(chuàng)建原子數(shù)據(jù)庫(kù)的視圖的方法包括定義一組變換操作和將這組變換操作應(yīng)用到原子數(shù)據(jù)庫(kù)。當(dāng)虛擬地應(yīng)用這些變換操作時(shí),在運(yùn)行時(shí)就建立了一個(gè)虛擬原子數(shù)據(jù)庫(kù),而當(dāng)真實(shí)地應(yīng)用這些變換操作時(shí),建立了一個(gè)新的原子數(shù)據(jù)庫(kù)。原子數(shù)據(jù)庫(kù)存儲(chǔ)原子,原子包括永久分配的原子標(biāo)識(shí)符、計(jì)算機(jī)代碼和/或數(shù)據(jù)以及對(duì)其他原子的引用。可以將新的原子數(shù)據(jù)庫(kù)存儲(chǔ)在與原子數(shù)據(jù)庫(kù)獨(dú)立的文件中,或者可以替換原始原子數(shù)據(jù)庫(kù)。變換操作包括插入一個(gè)新原子的插入操作、修改一個(gè)現(xiàn)有原子的修改操作、以及/或刪除一個(gè)現(xiàn)有原子的刪除操作。
視圖可用于以多種方式來(lái)共享原子數(shù)據(jù)庫(kù)中的原子。通過(guò)將該視圖和原子數(shù)據(jù)庫(kù)與第一可執(zhí)行程序和第二可執(zhí)行程序相關(guān)聯(lián),單個(gè)視圖可用于共享存儲(chǔ)于原子數(shù)據(jù)庫(kù)中的原子。利用視圖虛擬地在運(yùn)行時(shí)變換原子數(shù)據(jù)庫(kù),以創(chuàng)建一個(gè)虛擬原子數(shù)據(jù)庫(kù)。然后,由第一可執(zhí)行程序和第二可執(zhí)行程序?qū)?lái)自虛擬原子數(shù)據(jù)庫(kù)的原子加載,因此,在第一可執(zhí)行程序和第二可執(zhí)行程序之間共享了該原子。當(dāng)把原子載入第一可執(zhí)行程序可訪問(wèn)的第一存儲(chǔ)緩沖區(qū)以及把原子載入第二可執(zhí)行程序可訪問(wèn)的第二存儲(chǔ)緩沖區(qū)時(shí),提供磁盤(pán)共享。當(dāng)把原子載入第一可執(zhí)行程序和第二可執(zhí)行程序均可訪問(wèn)的存儲(chǔ)緩沖區(qū)時(shí),提供存儲(chǔ)器共享。
通過(guò)將第一視圖和原子數(shù)據(jù)庫(kù)與第一可執(zhí)行程序相關(guān)聯(lián),并將第二視圖和原子數(shù)據(jù)庫(kù)與第二可執(zhí)行程序相關(guān)聯(lián),可以利用多個(gè)視圖來(lái)共享原子數(shù)據(jù)庫(kù)中的原子。在運(yùn)行時(shí),利用第一視圖和第二視圖虛擬地對(duì)原子數(shù)據(jù)庫(kù)進(jìn)行變換,以創(chuàng)建第一虛擬原子數(shù)據(jù)庫(kù)和第二虛擬原子數(shù)據(jù)庫(kù)。通過(guò)第一可執(zhí)行程序利用第一視圖和通過(guò)第二可執(zhí)行程序利用第二視圖對(duì)來(lái)自虛擬原子數(shù)據(jù)庫(kù)的原子進(jìn)行加載,因此,在第一可執(zhí)行程序和第二可執(zhí)行程序之間共享了該原子。當(dāng)把原子載入利用第一視圖第一可執(zhí)行程序可訪問(wèn)的第一存儲(chǔ)緩沖區(qū),以及把原子載入利用第二視圖可由第二可執(zhí)行程序訪問(wèn)的第二存儲(chǔ)緩沖區(qū)時(shí),可提供利用多個(gè)視圖的硬盤(pán)共享。對(duì)于不受任何視圖影響的原子來(lái)說(shuō)(即,沒(méi)有對(duì)它們進(jìn)行修改),當(dāng)把原子載入利用第一視圖第一可執(zhí)行程序和利用第二視圖第二可執(zhí)行程序均可訪問(wèn)的存儲(chǔ)緩沖區(qū)時(shí),可提供利用多個(gè)視圖的存儲(chǔ)器共享。
視圖可作多用?;谠訉⒃谄渖线\(yùn)行的計(jì)算機(jī)硬件和/或軟件系統(tǒng)的優(yōu)化特征,可以對(duì)變換操作進(jìn)行定義,以便定制性能。定義變換操作以便限制對(duì)由這些原子所提供的某些特征的訪問(wèn),以便提供具有所定制的特征集的版本。
原子還可以包括一個(gè)原子特征,因而原子變換操作能夠改變?cè)犹卣?。比如,代碼原子可以通過(guò)修改其調(diào)試信息來(lái)變換。
可以將該組變換操作應(yīng)用于虛擬原子數(shù)據(jù)庫(kù),以便在一個(gè)視圖上應(yīng)用一個(gè)視圖。
映射表是一種簡(jiǎn)單的視圖,其中該組變換操作僅包括以第二原子替換第一原子的修改操作。替換操作是一種雖簡(jiǎn)單但又高效的機(jī)制,用于有效地將所有引用從一個(gè)原子改變到另一原子。
包括一個(gè)視圖的這組變換操作可以由程序員手動(dòng)創(chuàng)建,或者由過(guò)程自動(dòng)生成。用于創(chuàng)建將第一原子數(shù)據(jù)庫(kù)變換為第二原子數(shù)據(jù)庫(kù)的一組原子變換操作的方法包括,利用一個(gè)標(biāo)準(zhǔn)的原子共享算法規(guī)范化第一原子數(shù)據(jù)庫(kù)和第二原子數(shù)據(jù)庫(kù),其中存儲(chǔ)原子的第一原子數(shù)據(jù)庫(kù)和第二原子數(shù)據(jù)庫(kù)中的每一個(gè)都包括一個(gè)永久分配的原子標(biāo)識(shí)符、計(jì)算機(jī)代碼和/或數(shù)據(jù)和對(duì)其他原子的引用。確定(identify)在第一原子數(shù)據(jù)庫(kù)的原子和第二原子數(shù)據(jù)庫(kù)的原子之間的一組目標(biāo)合并。*確定輔助目標(biāo)合并的、在第一原子數(shù)據(jù)庫(kù)的原子和第二原子數(shù)據(jù)庫(kù)的原子之間的一組輔助合并。當(dāng)這組目標(biāo)合并不為空時(shí),重復(fù)以下步驟在這組輔助合并中選擇最佳合并、提交(commit)所選擇的最佳合并、更新這組目標(biāo)合并以及更新這組輔助合并。
不為重用合并或者不是輔助所提交的重用合并的每一個(gè)所提交的合并并非都完成。如果創(chuàng)建唯一兼容的合并,就將這些唯一兼容的合并加到這些目標(biāo)合并,將一個(gè)無(wú)限權(quán)重指定給其中一個(gè)唯一兼容的合并,以及轉(zhuǎn)到確定一組輔助合并的步驟。應(yīng)用使用了第一數(shù)據(jù)庫(kù)和第二數(shù)據(jù)庫(kù)的修改過(guò)的原子共享算法,以便確定剩余的同構(gòu)(isomorphism)。如果創(chuàng)建了唯一兼容的合并,就將這些唯一兼容的合并加到這些目標(biāo)合并,將一個(gè)無(wú)限權(quán)重指定給其中一個(gè)唯一兼容的合并,以及轉(zhuǎn)到確定一組輔助合并的步驟。如果創(chuàng)建了任何兼容的合并,就提交具有最大權(quán)重的兼容合并,將一個(gè)無(wú)限權(quán)重指定給所提交的兼容合并,將所提交的兼容合并加到這組目標(biāo)合并,以及轉(zhuǎn)到確定一組輔助合并的步驟。這些所提交的合并可以包括一個(gè)修改/替換合并、一個(gè)插入合并和/或一個(gè)刪除合并。這些合并是一個(gè)視圖中的實(shí)際變換操作。
在各版本中共享代碼和數(shù)據(jù)節(jié)省了磁盤(pán)存儲(chǔ)和存儲(chǔ)器使用。允許代碼和數(shù)據(jù)在各版本中共享,還提供保持獨(dú)立版本和避免手動(dòng)創(chuàng)建在各版本之間的“包裝程序(wrapper)”接口。包裝程序的目的是創(chuàng)建新代碼的向后兼容版本,這樣,在客戶(hù)端不再需要保留關(guān)于代碼的老版本。包裝程序是為了盡力避免程序的多個(gè)版本的系統(tǒng)開(kāi)銷(xiāo),每個(gè)版本包含基本上相同的代碼的龐大主體。用于軟件原子化的視圖,通過(guò)允許代碼和數(shù)據(jù)在程序的各版本之間自動(dòng)共享,消除了包裝程序的必要,并在軟件程序版本的設(shè)計(jì)中允許具有更大的體系結(jié)構(gòu)自由。
以下對(duì)如在附圖中圖示的本發(fā)明優(yōu)選實(shí)施例進(jìn)行更為詳細(xì)的說(shuō)明,從中將更易于理解有關(guān)本發(fā)明的前述和其他的對(duì)象、特征和優(yōu)點(diǎn),附圖中相同附圖標(biāo)記指示在所有不同視圖中的相同部分。這些圖未必是按比例畫(huà)出,重點(diǎn)是在于說(shuō)明本發(fā)明的原則。
圖1是關(guān)于其上實(shí)現(xiàn)本發(fā)明的一個(gè)實(shí)施例的一種計(jì)算機(jī)系統(tǒng)的圖示。
圖2是關(guān)于在圖1的計(jì)算機(jī)系統(tǒng)中的一種計(jì)算機(jī)的內(nèi)部結(jié)構(gòu)的圖示。
圖3說(shuō)明用于創(chuàng)建和加載計(jì)算機(jī)程序以在運(yùn)行時(shí)顯示輸出的一種傳統(tǒng)過(guò)程。
圖4說(shuō)明用于創(chuàng)建和加載原子化的計(jì)算機(jī)程序以在運(yùn)行時(shí)顯示輸出的一種軟件原子化過(guò)程。
圖5說(shuō)明一種原子提取過(guò)程。
圖6a是關(guān)于原子、原子數(shù)據(jù)庫(kù)、視圖和虛擬原子數(shù)據(jù)庫(kù)的圖示。
圖6b是關(guān)于原子、原子數(shù)據(jù)庫(kù)、視圖和獨(dú)立的新原子數(shù)據(jù)庫(kù)的圖示。
圖6c是關(guān)于原子、原子數(shù)據(jù)庫(kù)、視圖和重寫(xiě)的新原子數(shù)據(jù)庫(kù)的圖示。
圖7a是關(guān)于利用單個(gè)視圖并共享磁盤(pán)上的原子的多個(gè)可執(zhí)行程序的圖示。
圖7b是關(guān)于利用單個(gè)視圖并共享磁盤(pán)上和存儲(chǔ)器中的原子的多個(gè)可執(zhí)行程序的圖示。
圖7c是關(guān)于利用多個(gè)視圖并共享磁盤(pán)上的原子的多個(gè)可執(zhí)行程序的圖示。
圖7d是關(guān)于利用多個(gè)視圖并共享磁盤(pán)上和存儲(chǔ)器中的原子的多個(gè)可執(zhí)行程序的圖示。
圖8說(shuō)明一種原子管理過(guò)程。
圖9是關(guān)于一種原子數(shù)據(jù)庫(kù)數(shù)據(jù)結(jié)構(gòu)的圖示。
圖10是關(guān)于一種原子映射表首部數(shù)據(jù)結(jié)構(gòu)的圖示。
圖11是關(guān)于一種原子映射表數(shù)組數(shù)據(jù)結(jié)構(gòu)的圖示。
圖12是關(guān)于一種原子偏移序列數(shù)據(jù)結(jié)構(gòu)的圖示。
圖13是關(guān)于一種編碼原子數(shù)據(jù)結(jié)構(gòu)的圖示。
圖14是關(guān)于一種編碼原子引用數(shù)據(jù)結(jié)構(gòu)的圖示。
圖15是關(guān)于一種有6個(gè)代碼過(guò)程和3個(gè)數(shù)據(jù)元素的實(shí)例系統(tǒng)的圖示。
圖16a是關(guān)于實(shí)例數(shù)據(jù)原子的圖示。
圖16b是關(guān)于實(shí)例代碼原子的圖示。
圖16c是關(guān)于實(shí)例替換代碼原子的圖示。
圖17a是關(guān)于一種原子數(shù)據(jù)庫(kù)差分過(guò)程的圖示。
圖17b是關(guān)于表示老的原子數(shù)據(jù)庫(kù)和新的原子數(shù)據(jù)庫(kù)的圖表的圖示。
圖17c是關(guān)于表示可選擇的老的原子數(shù)據(jù)庫(kù)和新的原子數(shù)據(jù)庫(kù)的圖表的圖示。
具體實(shí)施例方式
下面說(shuō)明本發(fā)明的優(yōu)選實(shí)施例。這些優(yōu)選實(shí)施例適用于原子化執(zhí)行CurlTM運(yùn)行時(shí)環(huán)境的計(jì)算機(jī)程序,CurlTM運(yùn)行時(shí)環(huán)境執(zhí)行原子化CurlTM運(yùn)行時(shí)的適當(dāng)部分,以處理用CurlTM語(yǔ)言、腳本或非CurlTM程序編寫(xiě)的軟件。
圖1是關(guān)于其上實(shí)現(xiàn)本發(fā)明一個(gè)實(shí)施例的一種計(jì)算機(jī)系統(tǒng)的圖示??蛻?hù)端計(jì)算機(jī)50和服務(wù)器端計(jì)算機(jī)60提供用于原子化和執(zhí)行原子化了的計(jì)算機(jī)程序的處理、存儲(chǔ)和輸入/輸出裝置。這些客戶(hù)端計(jì)算機(jī)50還能通過(guò)通信網(wǎng)70鏈接到其他計(jì)算機(jī)裝置,包括其他客戶(hù)端50和服務(wù)器端計(jì)算機(jī)60。通信網(wǎng)70可以是因特網(wǎng)的一部分,為全球范圍的大量計(jì)算機(jī)、網(wǎng)絡(luò)和網(wǎng)關(guān),通常使用TCP/IP協(xié)議組來(lái)進(jìn)行彼此通信。因特網(wǎng)提供主要節(jié)點(diǎn)或主機(jī)之間的高速數(shù)據(jù)通信線(xiàn)路的主干,包括數(shù)千的商業(yè)、政府、教育和其他計(jì)算機(jī)網(wǎng),對(duì)數(shù)據(jù)和消息進(jìn)行路由。在本發(fā)明的另一實(shí)施例中,可以在獨(dú)立的計(jì)算機(jī)上實(shí)施用于原子化和執(zhí)行原子化了的計(jì)算機(jī)程序的處理、存儲(chǔ)和輸入/輸出裝置。
圖2是關(guān)于在圖1的計(jì)算機(jī)系統(tǒng)中的一種計(jì)算機(jī)(如50、60)的內(nèi)部結(jié)構(gòu)的圖示。每臺(tái)計(jì)算機(jī)包括一個(gè)系統(tǒng)總線(xiàn)200,總線(xiàn)是一組硬件線(xiàn)路,用于在計(jì)算機(jī)的各部分傳送數(shù)據(jù)??偩€(xiàn)200本質(zhì)上是連接計(jì)算機(jī)系統(tǒng)的不同組件(如處理器、磁盤(pán)存儲(chǔ)器、存儲(chǔ)器、輸入/輸出端口、網(wǎng)絡(luò)端口等)的共享管道,能使信息在這些組件之間傳送。I/O裝置接口202,連在系統(tǒng)總線(xiàn)200上,用于連接各種輸入和輸出裝置(如顯示器、打印機(jī)、揚(yáng)聲器等)。網(wǎng)絡(luò)接口206允許計(jì)算機(jī)連接到各種連在網(wǎng)上(如網(wǎng)絡(luò)70)的其他裝置。存儲(chǔ)器208為用于實(shí)現(xiàn)本發(fā)明實(shí)施例的計(jì)算機(jī)軟件指令(如原子提取器程序150和原子管理程序160)和數(shù)據(jù)結(jié)構(gòu)(如原子數(shù)據(jù)庫(kù)120)提供可變存儲(chǔ)。磁盤(pán)存儲(chǔ)器210為用于完成本發(fā)明實(shí)施例的計(jì)算機(jī)軟件指令(如原子提取器程序150和原子管理程序160)和數(shù)據(jù)結(jié)構(gòu)(如原子數(shù)據(jù)庫(kù)120)提供非可變存儲(chǔ)。
中央處理器204也連在系統(tǒng)總線(xiàn)700上,為執(zhí)行計(jì)算機(jī)指令(如原子提取器程序150和原子管理程序160)作準(zhǔn)備,因此允許計(jì)算機(jī)原子化和執(zhí)行原子化了的計(jì)算機(jī)程序。
圖3說(shuō)明用于創(chuàng)建和加載計(jì)算機(jī)程序以在運(yùn)行時(shí)顯示輸出的一種傳統(tǒng)過(guò)程。源節(jié)點(diǎn)102是由計(jì)算機(jī)程序員利用源節(jié)點(diǎn)程序設(shè)計(jì)語(yǔ)言(如C、C++)生成。編譯器104處理源節(jié)點(diǎn),并生成目標(biāo)代碼106文件。利用鏈接程序108來(lái)鏈接一個(gè)或多個(gè)目標(biāo)代碼106文件,以生成鏈接程序段(linker section)109。將鏈接程序段109合并以生成可執(zhí)行代碼110。可執(zhí)行代碼110可以作為獨(dú)立的可執(zhí)行程序(如EXE文件)或者作為共享的代碼庫(kù)(如DLL文件)進(jìn)行鏈接。為了執(zhí)行,加載程序112將可執(zhí)行代碼110載入存儲(chǔ)器,以便生成運(yùn)行時(shí)顯示114。
圖4說(shuō)明用于創(chuàng)建和加載原子化的計(jì)算機(jī)程序以在運(yùn)行時(shí)顯示輸出的一種軟件原子化過(guò)程。如利用傳統(tǒng)的處理,源節(jié)點(diǎn)102是由計(jì)算機(jī)程序員利用源節(jié)點(diǎn)程序設(shè)計(jì)語(yǔ)言(如C、C++)生成。編譯器104處理源節(jié)點(diǎn),并生成目標(biāo)代碼106文件。按通常方式將源代碼102編譯為目標(biāo)代碼106文件之后,原子提取器150對(duì)目標(biāo)代碼106文件進(jìn)行處理,以識(shí)別原子130。將細(xì)粒的(fine-grained)、可獨(dú)立編址的原子130放于原子數(shù)據(jù)庫(kù)120中,每個(gè)原子130收到一個(gè)唯一的原子標(biāo)識(shí)符132。細(xì)粒的原子130用于定義任意整數(shù)字節(jié)的代碼和數(shù)據(jù)。將代碼和數(shù)據(jù)的引用變換為原子標(biāo)識(shí)符引用。比如,通過(guò)原子標(biāo)識(shí)符132,將代碼內(nèi)的過(guò)程調(diào)用變換成調(diào)用其他原子130。通過(guò)原子標(biāo)識(shí)符132,還將數(shù)據(jù)引用變換為數(shù)據(jù)原子引用。
原子提取器150瀏覽代碼文件106,并從代碼中創(chuàng)建原子130。需要從目標(biāo)代碼文件106中提取原子130的信息已在目標(biāo)文件中得以實(shí)施,由于事實(shí)上傳統(tǒng)加載程序需要同樣的信息以便加載和調(diào)用過(guò)程并優(yōu)化只讀數(shù)據(jù)。需要從目標(biāo)代碼文件106中提取多個(gè)數(shù)據(jù)原子的信息需要分離各種原子數(shù)量。分離可以由一些傳統(tǒng)編譯器(如gcc)自動(dòng)完成,或者明確通過(guò)程序員標(biāo)記源代碼中的數(shù)據(jù)數(shù)量(如編譯器指示)來(lái)完成。在運(yùn)行時(shí),原子管理程序160從原子數(shù)據(jù)庫(kù)120中訪問(wèn)原子130,并且為了執(zhí)行,將其載入存儲(chǔ)器。然后,在執(zhí)行時(shí),被加載的原子130可以生成運(yùn)行時(shí)顯示114,或程序?qū)⑵湓O(shè)計(jì)的任何其他結(jié)果。原子管理程序160可以基于靜態(tài)代碼分析或動(dòng)態(tài)配置(profiling)確定用于加載原子130的優(yōu)化順序。通過(guò)依靠編譯器創(chuàng)建目標(biāo)代碼文件106的獨(dú)立部分,可以使原子化處理自動(dòng)完成,而不必手動(dòng)分解和分析。編譯器的使用提供了用于創(chuàng)建獨(dú)立的代碼和數(shù)據(jù)部分的一種選擇,可選擇的是可將其他程序用于處理源文件以生成原子130。
圖5說(shuō)明一種原子提取過(guò)程。在步驟302處,接收目標(biāo)代碼格式的計(jì)算機(jī)程序代碼和/或數(shù)據(jù)。在步驟304處,從目標(biāo)代碼格式的計(jì)算機(jī)程序代碼和/或數(shù)據(jù)中提取計(jì)算機(jī)程序代碼和/或數(shù)據(jù)信息。在步驟306處,從目標(biāo)代碼格式的計(jì)算機(jī)程序代碼和/或數(shù)據(jù)中提取計(jì)算機(jī)程序代碼和/或數(shù)據(jù)引用信息。在步驟308處,修改計(jì)算機(jī)程序代碼和/或數(shù)據(jù)引用信息,以使用原子標(biāo)識(shí)符。最后,在步驟310處,將計(jì)算機(jī)程序代碼和/或數(shù)據(jù)和計(jì)算機(jī)程序代碼和/或數(shù)據(jù)引用信息存儲(chǔ)在一個(gè)原子中,該原子包括一個(gè)原子標(biāo)識(shí)符;計(jì)算機(jī)程序代碼和/或數(shù)據(jù);以及計(jì)算機(jī)程序代碼和/或數(shù)據(jù)引用信息。
圖6a是關(guān)于原子、原子數(shù)據(jù)庫(kù)、視圖和虛擬原子數(shù)據(jù)庫(kù)的圖示。從概念上可以把原子數(shù)據(jù)庫(kù)120視為原子130的定向(directed)圖。原子字節(jié)134(節(jié)點(diǎn))由原子標(biāo)識(shí)132(節(jié)點(diǎn)標(biāo)識(shí))識(shí)別,并由原子引用136(邊緣)鏈接。原子數(shù)據(jù)庫(kù)120存儲(chǔ)原子130。每個(gè)原子130都由唯一的原子標(biāo)識(shí)132識(shí)別。對(duì)于每個(gè)原子,代碼和/或數(shù)據(jù)都被表示為原子字節(jié)134??梢詫?duì)原子130進(jìn)行壓縮,包括原子字節(jié)134和原子引用136內(nèi)的代碼和/或數(shù)據(jù)。在某些情況下,解壓縮比讀盤(pán)時(shí)間短,所以,壓縮和解壓縮過(guò)程提供了明顯的性能改進(jìn)以及減少的存儲(chǔ)器和磁盤(pán)存儲(chǔ)空間。通過(guò)使用變換操作,虛擬地將存儲(chǔ)原子(如原子141、142、143、144)的原子數(shù)據(jù)庫(kù)120變換為存儲(chǔ)原子(如141、142、143、144、145、146)的虛擬原子數(shù)據(jù)庫(kù)121。插入操作增加原子146,而替換操作將原子143替換為原子145(這樣,原子144就調(diào)用原子145)。雖然通過(guò)視圖122訪問(wèn)原子數(shù)據(jù)庫(kù)120(即訪問(wèn)虛擬原子數(shù)據(jù)庫(kù)121)的程序(如可執(zhí)行程序158)將會(huì)訪問(wèn)調(diào)用原子145的原子144,但是直接訪問(wèn)原子數(shù)據(jù)庫(kù)120的可執(zhí)行程序156將會(huì)訪問(wèn)調(diào)用原子143的原子144。這樣,可以維持多版本的原子軟件,而不必存儲(chǔ)關(guān)于相同原子的另外副本(如141、142)。
原子130是由永久原子標(biāo)識(shí)符132(標(biāo)識(shí)符)唯一識(shí)別的代碼段或數(shù)據(jù)元素。代碼原子130典型與源語(yǔ)言(如C/C++)過(guò)程類(lèi)似。數(shù)據(jù)原子130是數(shù)據(jù)元素,并且可以為任意大小。原子130在需要時(shí)被拉入存儲(chǔ)器(如只讀代碼緩沖區(qū)170、只讀數(shù)據(jù)緩沖區(qū)180、讀寫(xiě)數(shù)據(jù)緩沖區(qū)190),并且可以在不再需要時(shí)被換出。原子標(biāo)識(shí)符132的永久性質(zhì)提供這樣一種能力,通過(guò)確定某些原子130已經(jīng)存在并且由永久原子標(biāo)識(shí)符132來(lái)識(shí)別,基于現(xiàn)有版本來(lái)設(shè)計(jì)新版本。這提供了基于來(lái)自現(xiàn)有版本的增量的遞增版本。
可以對(duì)原子數(shù)據(jù)庫(kù)120中的原子130進(jìn)行修改,以影響所期望的程序設(shè)計(jì)變化(如更新代碼、數(shù)據(jù)、引用和/或特性)。修改操作的一個(gè)重要子集是替換操作,其中利用視圖122將一個(gè)原子130用另一原子130替換,用于在磁盤(pán)上和/或存儲(chǔ)器中共享原子130。當(dāng)用不同原子130替換或更新引用原子時(shí),替換原子允許引用原子130的代碼和/數(shù)據(jù)保持不變。視圖122可以將引用從一個(gè)原子標(biāo)識(shí)符132變換為另一原子標(biāo)識(shí)符132。視圖122還可以包括影響原子130的其他數(shù)據(jù)、引用和/或特性的變換操作。
可以在原子數(shù)據(jù)庫(kù)120上定義多個(gè)視圖122,從而允許可執(zhí)行程序156以各種方式訪問(wèn)和共享原子130。這樣,利用用于原子化的視圖的可執(zhí)行程序156可能不按原子數(shù)據(jù)庫(kù)120的特定視圖122執(zhí)行。比如,視圖122和原子數(shù)據(jù)庫(kù)130可以通過(guò)執(zhí)行命令行“MyApplication.exe-dATOM.DB-v1.1”與可執(zhí)行程序156相關(guān)聯(lián)??蓤?zhí)行程序156“MyApplication.exe”可以包括存根(stub)來(lái)調(diào)用原子加載程序(如原子管理程序160),以訪問(wèn)在利用在視圖文件“1.1”中定義的視圖122創(chuàng)建時(shí),在視圖版本“1.1”中定義的原子130。
創(chuàng)建視圖122的變換操作包括生成一組從一個(gè)原子數(shù)據(jù)庫(kù)120到另一原子數(shù)據(jù)庫(kù)120的原子130的差分。因?yàn)樵?30能夠在各種視圖122之間共享,利用單個(gè)原子數(shù)據(jù)庫(kù)120,可以維持產(chǎn)品的多個(gè)版本。
可以將計(jì)算機(jī)軟件的新版本編成包含變化操作的視圖122。變換操作可以定義兩個(gè)物理原子數(shù)據(jù)庫(kù)120之間、或者虛擬數(shù)據(jù)庫(kù)121和物理原子數(shù)據(jù)庫(kù)120之間、或者一對(duì)虛擬原子數(shù)據(jù)庫(kù)121之間的差別。這樣,就可以基于先前的軟件版本來(lái)構(gòu)建軟件版本。
圖6b是關(guān)于原子、原子數(shù)據(jù)庫(kù)、視圖和獨(dú)立的新原子數(shù)據(jù)庫(kù)的圖示。視圖122可以將原子數(shù)據(jù)庫(kù)120變換成新的原子數(shù)據(jù)庫(kù)120。在圖6a討論中所描述的情況下,當(dāng)訪問(wèn)原子并將其載入存儲(chǔ)器時(shí),通過(guò)變換原子引用、數(shù)據(jù)和/或特性,變換創(chuàng)建虛擬原子數(shù)據(jù)庫(kù)121??梢杂孟嗤^(guò)程來(lái)創(chuàng)建新的物理原子數(shù)據(jù)庫(kù)123。這樣,變換操作僅需進(jìn)行一次,而獨(dú)立的新原子數(shù)據(jù)庫(kù)123可用被變換的原子130的映像(image)來(lái)創(chuàng)建。獨(dú)立的新原子數(shù)據(jù)庫(kù)123存儲(chǔ)被重用的(即未被修改也未被刪除)、來(lái)自原子數(shù)據(jù)庫(kù)120的所有原子130的副本,存儲(chǔ)作為插入操作的結(jié)果而被插入的所有新原子130,以及存儲(chǔ)作為修改操作的結(jié)果而被修改的原子130。獨(dú)立的新原子數(shù)據(jù)庫(kù)123提供更新原子數(shù)據(jù)庫(kù)120的另一非破壞性方式。
圖6c是關(guān)于原子、原子數(shù)據(jù)庫(kù)、視圖和重寫(xiě)的新原子數(shù)據(jù)庫(kù)的圖示。視圖122可以將原子數(shù)據(jù)庫(kù)120變換成新的原子數(shù)據(jù)庫(kù)120。新原子數(shù)據(jù)庫(kù)120可以是虛擬原子數(shù)據(jù)庫(kù)121(如圖6a所示)或者是獨(dú)立的新原子數(shù)據(jù)庫(kù)123(如圖6b所示)。新原子數(shù)據(jù)庫(kù)120還可意重寫(xiě)現(xiàn)有的原子數(shù)據(jù)庫(kù)120,以創(chuàng)建被重寫(xiě)的新原子數(shù)據(jù)庫(kù)123。當(dāng)利用獨(dú)立的新原子數(shù)據(jù)庫(kù)123,變換操作僅需進(jìn)行一次,而被重寫(xiě)的新原子數(shù)據(jù)庫(kù)123可用被變換的原子130的映像來(lái)創(chuàng)建。被重寫(xiě)的新原子數(shù)據(jù)庫(kù)123保留被重用的(即未被修改也未被刪除)、來(lái)自原子數(shù)據(jù)庫(kù)120的所有原子130的副本,存儲(chǔ)作為插入操作的結(jié)果而被插入的所有新原子130,以及存儲(chǔ)作為替換操作的結(jié)果而被替換的原子130??梢赃M(jìn)行刪除操作,以將未用的原子從被重寫(xiě)的新原子數(shù)據(jù)庫(kù)123中除去。被重寫(xiě)的新原子數(shù)據(jù)庫(kù)123提供更新原子數(shù)據(jù)庫(kù)120的一種破壞性方式。
圖7a是關(guān)于利用單個(gè)視圖并共享磁盤(pán)上的一個(gè)原子的多個(gè)可執(zhí)行程序的圖示。在運(yùn)行時(shí),本發(fā)明的一個(gè)實(shí)施例避開(kāi)用于加載共享庫(kù)(即DLL)的傳統(tǒng)機(jī)制,而采用更為有效的原子機(jī)制,以原子130的粒度(granularity)加載,而不用比如4K的存儲(chǔ)器塊。原子管理程序160在需要時(shí)將原子130從原子數(shù)據(jù)庫(kù)120加載。原子管理程序160分配存儲(chǔ)器,然后,管理緩沖區(qū)中的原子130(如原子141)。原子提取器150,對(duì)于原子管理程序160,先前已對(duì)非直接通過(guò)原子130的過(guò)程調(diào)用進(jìn)行過(guò)修改,原子管理程序160定位在存儲(chǔ)器中的現(xiàn)有原子130或者如果它們還未被加載,將它們從原子數(shù)據(jù)庫(kù)120加載。
緩沖區(qū)管理提供幾種好處,包括有限的存儲(chǔ)器使用、減少的交換和無(wú)休止互交換(thrashing)以及減少的啟動(dòng)次數(shù)。有限的存儲(chǔ)器使用將存儲(chǔ)器使用限制在任意特定的大小。比如,對(duì)于代碼原子130,可能精確地定義8MB存儲(chǔ)器,因而當(dāng)需要更新的原子時(shí),可能將較老的原子130換出。通過(guò)限定存儲(chǔ)器使用,本發(fā)明的實(shí)施例減少了交換和無(wú)休止互換,因而程序不必利用其存儲(chǔ)器管理機(jī)制來(lái)管理存儲(chǔ)器的過(guò)多使用。程序的存儲(chǔ)器管理固有較低效率,因?yàn)樗峭ㄓ玫亩钦{(diào)整為專(zhuān)用。通過(guò)準(zhǔn)確加載所需代碼,而不必僅因?yàn)槠渌a在共享庫(kù)的“附近(nearby)”而將其加載,將會(huì)減少存儲(chǔ)器開(kāi)銷(xiāo)。原子管理程序160減少啟動(dòng)次數(shù)。當(dāng)需要新原子130時(shí),將原子加載并執(zhí)行。因此,不必等整個(gè)代碼集加載到存儲(chǔ)器中,就立刻執(zhí)行代碼。本發(fā)明的實(shí)施例開(kāi)始執(zhí)行代碼原子130,其在下載完成之前被下載(受到仍然還未被發(fā)送的原子130的可用性的限制)。
原子管理程序160管理三種緩沖區(qū)只讀代碼緩沖區(qū)(如176、178)、可用于數(shù)據(jù)常量的只讀數(shù)據(jù)緩沖區(qū)(如186、188)和可用于全局?jǐn)?shù)據(jù)的讀寫(xiě)數(shù)據(jù)緩沖區(qū)(如196、198)。因?yàn)樽x寫(xiě)數(shù)據(jù)可能為任意長(zhǎng)度,并且不可以將其從原子數(shù)據(jù)庫(kù)120重新加載,它的大小可以不受限定,因此,對(duì)于它的管理,可以利用程序的虛擬存儲(chǔ)器系統(tǒng)。
如果能夠確定原子是相關(guān)的,將原子130一次一個(gè)載入緩沖區(qū)不如同時(shí)將原子130的工作集(working set)加載有效。用工作集協(xié)調(diào)程序(working set tuner)來(lái)確定哪些原子130形成“工作組(workinggroup)”。對(duì)于原子化環(huán)境,使工作集協(xié)調(diào)程序適于收集信息。一旦收集到信息,就使用某種機(jī)制來(lái)利用信息,如原子數(shù)據(jù)庫(kù)120內(nèi)的指明原子130彼此關(guān)系的指示。本發(fā)明的實(shí)施例提供對(duì)磁盤(pán)上的原子130重新排序的能力,以匹配特定的加載序列,因而提供更快的加載。
通過(guò)原子管理程序?qū)χ蛔x代碼緩沖區(qū)176、178的管理,提供了某些加載優(yōu)化。當(dāng)一個(gè)原子130對(duì)另一原子130進(jìn)行過(guò)程調(diào)用時(shí),通常通過(guò)原子管理程序160利用存根間接進(jìn)行調(diào)用。當(dāng)修改調(diào)用程序(caller)的代碼的存儲(chǔ)器內(nèi)映像以直接跳(“快速鏈接(linksnapping)”)至目標(biāo)原子130時(shí),過(guò)程調(diào)用會(huì)更快。然而,一旦快速鏈接起來(lái),原子管理程序160不使鏈接無(wú)效就不能去除或換出目標(biāo)原子130。對(duì)于被頻繁調(diào)用的原子130,這是值得做的權(quán)衡。由原子管理程序160使用工具來(lái)確定哪些原子130有資格直接調(diào)用,以及有資格將原子130鎖入存儲(chǔ)器中。在運(yùn)行時(shí),通過(guò)將代碼/數(shù)據(jù)鎖在存儲(chǔ)器中,或者在編譯時(shí),通過(guò)標(biāo)記在運(yùn)行時(shí)未使用存根的某些原子引用136,可以進(jìn)行快速鏈接的分析。原子數(shù)據(jù)庫(kù)視圖122和存根/快速鏈接的組合提供一些選擇來(lái)調(diào)諧系統(tǒng)特性以滿(mǎn)足所需性能要求。
許多可執(zhí)行程序156、158可以訪問(wèn)相同的虛擬原子數(shù)據(jù)庫(kù)121(或新的原子數(shù)據(jù)庫(kù)123),以共享代碼和/或數(shù)據(jù)。比如,可執(zhí)行程序156調(diào)用代碼原子141??蓤?zhí)行程序158也調(diào)用代碼原子141。代碼原子141的副本是從磁盤(pán)讀出,并被載入每個(gè)程序的只讀存儲(chǔ)緩沖區(qū)176、178。然后,可執(zhí)行程序156、158可以直接調(diào)用被加載的代碼原子141。這樣,可能來(lái)自不同產(chǎn)品和/或不同產(chǎn)品版本的多個(gè)不同的可執(zhí)行程序156、158共享存于原子數(shù)據(jù)庫(kù)120中的磁盤(pán)上的原子130(如原子141)。
圖7b是關(guān)于利用單個(gè)視圖并共享磁盤(pán)上和存儲(chǔ)器中的一個(gè)原子的多個(gè)可執(zhí)行程序的圖示。在該實(shí)例中,許多可執(zhí)行程序156、158共享緩沖區(qū)(如只讀代碼緩沖區(qū)170和只讀數(shù)據(jù)緩沖區(qū)180)。當(dāng)?shù)谝豢蓤?zhí)行程序(如可執(zhí)行程序156)調(diào)用原子141時(shí),原子管理程序160將原子141載入只讀代碼緩沖區(qū)170。當(dāng)下一可執(zhí)行程序(如可執(zhí)行程序158)調(diào)用原子141時(shí),原子管理程序160可以確定原子141已被加載。這樣,多個(gè)不同的可執(zhí)行程序156、158共享存于原子數(shù)據(jù)庫(kù)120中的存儲(chǔ)器里的代碼原子130(如原子141),從而提供對(duì)在許多執(zhí)行程序之間的原子的同時(shí)重用。應(yīng)用關(guān)于共享只讀代碼緩存器170的可執(zhí)行程序的某些限定,比如,不能用被共享的代碼原子迅速建立鏈接。當(dāng)因?yàn)檎褂脙H僅一個(gè)視圖122,可以共享原子144時(shí),另外的共享也是可能的。因此,可執(zhí)行程序156、158都可以使用相同的視圖122,并且可以共享被修改的原子144副本。
圖7c是關(guān)于利用多個(gè)視圖并共享磁盤(pán)上的一個(gè)原子的多個(gè)可執(zhí)行程序的圖示。在該實(shí)例中,許多可執(zhí)行程序156、158各自都有自己的緩沖區(qū)(如只讀代碼緩沖區(qū)176、178,只讀數(shù)據(jù)緩沖區(qū)186、188,以及讀寫(xiě)數(shù)據(jù)緩沖區(qū)196、198)。此外,每個(gè)可執(zhí)行程序156、158利用關(guān)于基礎(chǔ)(underlying)原子數(shù)據(jù)庫(kù)120的不同視圖122、125訪問(wèn)不同的虛擬原子數(shù)據(jù)庫(kù)121、124。視圖122創(chuàng)建虛擬原子數(shù)據(jù)庫(kù)121,在該庫(kù)中代碼原子141對(duì)調(diào)用144的代碼原子142進(jìn)行調(diào)用。視圖125創(chuàng)建虛擬原子數(shù)據(jù)庫(kù)124,在該庫(kù)中代碼原子141對(duì)調(diào)用145的代碼原子142進(jìn)行調(diào)用。當(dāng)可執(zhí)行程序156、158調(diào)用代碼原子141時(shí),這些程序通過(guò)其各自的視圖(即視圖122、125)訪問(wèn)原子數(shù)據(jù)庫(kù)120,以便創(chuàng)建虛擬原子數(shù)據(jù)庫(kù)(即虛擬原子數(shù)據(jù)庫(kù)121、124)。然后,可執(zhí)行程序156、158,通過(guò)將原子141的副本載入各自的緩沖區(qū)(如只讀代碼緩沖區(qū)176、178)中,可以共享原子141的磁盤(pán)副本。當(dāng)可執(zhí)行程序156的被加載的代碼原子141運(yùn)行時(shí),程序?qū)?huì)對(duì)將被載入可執(zhí)行程序156的只讀代碼緩沖區(qū)176中的代碼原子142進(jìn)行訪問(wèn)。代碼原子142未經(jīng)修改就被載入只讀代碼緩沖區(qū)176中。當(dāng)可執(zhí)行程序158的加載代碼原子141運(yùn)行時(shí),程序?qū)?huì)對(duì)將被載入可執(zhí)行程序158的只讀代碼緩沖區(qū)178中的代碼原子142進(jìn)行訪問(wèn)。將會(huì)從原子數(shù)據(jù)庫(kù)120中加載代碼原子142,原子數(shù)據(jù)庫(kù)120具有如在視圖125中定義的被變換的原子引用。這樣,百分之一的代碼原子141得以共享,并且可以共享大部分的代碼原子142。對(duì)于代碼原子142,將共享所有的代碼字節(jié),也將會(huì)共享大部分引用,因?yàn)閮H僅單個(gè)引用被改變。在加載代碼原子142時(shí),區(qū)別是因?yàn)槭聦?shí)上每個(gè)可執(zhí)行程序156、158利用不同的視圖122、125來(lái)訪問(wèn)原子130。這樣,多個(gè)不同的可執(zhí)行程序156、158從磁盤(pán)共享存儲(chǔ)于原子數(shù)據(jù)庫(kù)120中的代碼原子130(如原子141),同時(shí)用于修改如由不同視圖122、125所定義的其他原子130。
圖7d是關(guān)于利用多個(gè)視圖并共享磁盤(pán)上和存儲(chǔ)器中的一個(gè)原子的多個(gè)可執(zhí)行程序的圖示。在該實(shí)例中,許多可執(zhí)行程序156、158維持獨(dú)立的緩沖區(qū)(如只讀代碼緩沖區(qū)176、178,只讀數(shù)據(jù)緩沖區(qū)186、188,以及讀寫(xiě)數(shù)據(jù)緩沖區(qū)196、198),還共享一些緩沖區(qū)(如只讀代碼緩沖區(qū)170和只讀數(shù)據(jù)緩沖區(qū)180)。此外,每個(gè)可執(zhí)行程序156、158利用不同的視圖122、125訪問(wèn)不同的虛擬原子數(shù)據(jù)庫(kù)121、124。視圖122創(chuàng)建虛擬原子數(shù)據(jù)庫(kù)121,在該庫(kù)中代碼原子141對(duì)調(diào)用144的代碼原子142進(jìn)行調(diào)用。視圖125創(chuàng)建虛擬原子數(shù)據(jù)庫(kù)124,在該庫(kù)中代碼原子141對(duì)調(diào)用145的代碼原子142進(jìn)行調(diào)用。虛擬數(shù)據(jù)庫(kù)124可以通過(guò)將視圖125應(yīng)用于虛擬數(shù)據(jù)庫(kù)121來(lái)創(chuàng)建,在這種情況下,變換操作將會(huì)已經(jīng)用145替換了原子143。當(dāng)可執(zhí)行程序156、158調(diào)用代碼原子141時(shí),這些程序通過(guò)視圖(如視圖122、125)訪問(wèn)原子數(shù)據(jù)庫(kù)120,以便創(chuàng)建虛擬原子數(shù)據(jù)庫(kù)(如虛擬原子數(shù)據(jù)庫(kù)121、124)。實(shí)際上,每個(gè)虛擬原子數(shù)據(jù)庫(kù)121和124都可以共享相同的基本物理原子數(shù)據(jù)庫(kù)120。然后,可執(zhí)行程序156、158可以通過(guò)將副本載入被共享的緩沖區(qū)—只讀緩沖區(qū)170中,共享原子141的磁盤(pán)副本和存儲(chǔ)器副本。當(dāng)可執(zhí)行程序156加載代碼原子141時(shí),原子將會(huì)被載入只讀代碼緩沖區(qū)176中。當(dāng)可執(zhí)行程序158加載代碼原子142時(shí),原子將會(huì)被載入只讀代碼緩沖區(qū)178中。盡管可執(zhí)行程序156和可執(zhí)行程序158可以共享磁盤(pán),它們不能完全共享代碼原子142,可以將原子載入共享的只讀緩沖區(qū)170中用于其他調(diào)用程序使用。加載的區(qū)別是因?yàn)槭聦?shí)上每個(gè)可執(zhí)行程序156、158利用不同的視圖122、125來(lái)訪問(wèn)原子130,因此,應(yīng)用不同的變換。這樣,多個(gè)不同的可執(zhí)行程序156、158從磁盤(pán)和存儲(chǔ)器中共享存于原子數(shù)據(jù)庫(kù)120中的代碼原子130(如原子141),同時(shí)用于替換如由不同視圖122、125所定義的其他原子130。
圖8說(shuō)明一種原子管理過(guò)程。在步驟321處,訪問(wèn)視圖122,以便對(duì)作為加載目標(biāo)的原子應(yīng)用任何需要的變換。變換可以包括修改原子引用、原子代碼/數(shù)據(jù)(字節(jié))和/或原子特征。在步驟322處,原子管理過(guò)程通過(guò)將原子從原子數(shù)據(jù)庫(kù)載入存儲(chǔ)器來(lái)管理原子化的計(jì)算機(jī)程序代碼和/或數(shù)據(jù),原子包括一個(gè)原子標(biāo)識(shí)符;計(jì)算機(jī)程序代碼和/或數(shù)據(jù)信息;以及計(jì)算機(jī)代碼和/或數(shù)據(jù)引用信息。然后,在步驟324處,修改計(jì)算機(jī)代碼和/或數(shù)據(jù)引用信息,這樣,存儲(chǔ)器地址代替了原子標(biāo)識(shí)符和偏移。
圖9是關(guān)于一種原子數(shù)據(jù)庫(kù)數(shù)據(jù)結(jié)構(gòu)的圖示。原子數(shù)據(jù)庫(kù)120存儲(chǔ)原子130。原子130對(duì)于單個(gè)數(shù)據(jù),如被編譯的過(guò)程或字符串常量。原子130在需要時(shí)被從原子數(shù)據(jù)庫(kù)120載入存儲(chǔ)器中。這減少了存儲(chǔ)器占用空間和磁盤(pán)I/O。原子數(shù)據(jù)庫(kù)120是從原子標(biāo)識(shí)符132值(整數(shù))到原子130的映射。原子標(biāo)識(shí)符132可以被表示為識(shí)別原子130的一個(gè)31位整數(shù)??梢砸匀我忭樞蚣虞d原子130。對(duì)原子數(shù)據(jù)庫(kù)120的磁盤(pán)上的表示進(jìn)行優(yōu)化,以節(jié)省空間和最小化將原子130載入存儲(chǔ)器所需的I/O。原子數(shù)據(jù)庫(kù)120還提供從原子標(biāo)識(shí)符132值到與相應(yīng)的原子130有關(guān)的信息的映射,如符號(hào)和調(diào)試信息。原子數(shù)據(jù)庫(kù)120是這樣一個(gè)文件,包括幾個(gè)不同部分,每部分具有可變大小,這些部分包括一個(gè)DB-首部350和一些原子映射表360。在各種實(shí)施例中,原子映射表360可以包括一個(gè)主體原子映射表(body-atom-map)、一個(gè)符號(hào)原子映射表(symbol-atom-map)、一個(gè)類(lèi)別原子映射表(category-atom-map)以及一個(gè)描述原子映射表(description-atom-map)。首先是DB-首部350,而其他表的順序、位置和數(shù)量都是任意的。對(duì)于其他部分的每一個(gè),DB-首部350包括文件偏移。
DB-首部350正是在數(shù)據(jù)庫(kù)文件中最靠前的內(nèi)容。它包括關(guān)于文件和其他部分位置的一些全局信息,包括幻數(shù)(magic-number)、版本號(hào)、cpu類(lèi)型、os類(lèi)型、主體原子映射表偏移、符號(hào)原子映射表偏移、類(lèi)別原子映射表偏移以及描述原子映射表偏移。
幻數(shù)識(shí)別該文件為原子數(shù)據(jù)庫(kù)120,還定義文件中所有其他的多字節(jié)數(shù)的終止端(endianness)。如果按小的終止(endian)字節(jié)順序來(lái)存儲(chǔ)數(shù)據(jù)庫(kù)0xD7 0x15 0xFF 0x31,幻數(shù)包括這4個(gè)字節(jié)。對(duì)于一個(gè)大的終止文件,倒換這些字節(jié)0x31 0xFF 0x15 0xD7。這個(gè)字節(jié)順序沒(méi)有特殊含義。將總是以處理器的本來(lái)終止端(native endianness)來(lái)存儲(chǔ)數(shù)據(jù)庫(kù)文件,它包含處理器代碼。這避免了在運(yùn)行時(shí)需要浪費(fèi)的字節(jié)交換。然而,幻數(shù)明確指定了終止端,所以,跨平臺(tái)工具可以控制原子數(shù)據(jù)庫(kù)120。
版本號(hào)指明數(shù)據(jù)庫(kù)所用的文件格式的版本。
CPU類(lèi)型指明生成數(shù)據(jù)庫(kù)的CPU類(lèi)型(如Pentium、PowerPC等)。
OS類(lèi)型是生成數(shù)據(jù)庫(kù)的操作系統(tǒng)的類(lèi)型(如Win32、Linux、MacOS等)。
主體原子映射表偏移是相對(duì)于文件起始處,主體原子映射表部分開(kāi)始的文件偏移。
符號(hào)原子映射表偏移是相對(duì)于文件起始處,符號(hào)原子映射表部分開(kāi)始的文件偏移。
類(lèi)別原子映射表偏移是相對(duì)于文件起始處,類(lèi)型原子映射表部分開(kāi)始的文件偏移。
描述原子映射表偏移是相對(duì)于文件起始處,描述原子映射表部分開(kāi)始的文件偏移。
圖10是關(guān)于一種原子映射表首部數(shù)據(jù)結(jié)構(gòu)的圖示。原子映射表360包含一個(gè)原子映射表首部370和一個(gè)原子映射表數(shù)組380。原子映射表360將原子標(biāo)識(shí)符132映射到文件偏移,有關(guān)那個(gè)原子標(biāo)識(shí)符132的某些信息就可以在文件偏移處找到。原子映射表360表示將會(huì)為任何一組原子標(biāo)識(shí)符132工作,但是對(duì)于原子標(biāo)識(shí)符132的鄰近范圍,它會(huì)得到優(yōu)化,所以舉例來(lái)說(shuō),用于原子標(biāo)識(shí)符132{12、23、24、216}的原子映射表360將會(huì)比用于原子標(biāo)識(shí)符132{10、11、12、13}的原子映射表360占用更多空間。一個(gè)原子映射表360部分以原子映射表首部370為起始,370包括一個(gè)默認(rèn)原子序列增量372、一個(gè)原子偏移序列數(shù)組大小374、一個(gè)原子偏移序列數(shù)組偏移376以及一個(gè)原子映射表數(shù)據(jù)偏移378。
對(duì)于對(duì)應(yīng)于連續(xù)原子標(biāo)識(shí)符132的數(shù)據(jù),在包含文件偏移序列的原子映射表360中,可以使用默認(rèn)原子序列增量372。在原子映射表360中對(duì)這些序列進(jìn)行“增量編碼”,以節(jié)省空間。增量編碼是一種對(duì)作為連續(xù)數(shù)對(duì)之間的差值的一系列數(shù)字進(jìn)行存儲(chǔ)的技術(shù)。對(duì)于許多序列,增量將是很小的,而且由于許多編碼方案可以更為緊湊地存儲(chǔ)近零數(shù),增量序列將會(huì)通常比原始序列占用更小的空間。比如,{1000,1011,1012,1013,1015,1016}的增量編碼將會(huì)是{1000,1,1,1,2,1}。增量通常是很小的正數(shù),但是可以通過(guò)從每一個(gè)數(shù)中減去一個(gè)選擇得當(dāng)?shù)某?shù)即默認(rèn)原子序列增量372來(lái)使增量更趨近于0。比如,假定原始數(shù)字序列為{1000,1050,1104,1165,1202}。對(duì)此序列進(jìn)行增量編碼,則得到{1000,50,54,61,37}。由于默認(rèn)原子序列增量372等于50,該序列還可能調(diào)整為{1000,0,4,11,-13}。因?yàn)檫@些最終數(shù)字更近于0,該序列可以更為緊湊地進(jìn)行編碼。也可以應(yīng)用哈夫曼(Huffman)編碼或算數(shù)編碼方案。
原子偏移序列數(shù)組大小374是原子映射表360的序列數(shù)組中的入口數(shù)。
原子偏移序列數(shù)組偏移376是相對(duì)于數(shù)據(jù)庫(kù)文件中的原子映射表360部分的起始處,原子映射表360的序列數(shù)組的文件偏移。
原子映射表數(shù)據(jù)偏移378是相對(duì)于數(shù)據(jù)庫(kù)120文件中的原子映射表360部分的起始處,對(duì)于原子映射表360,數(shù)據(jù)起始處的文件偏移,。
原子映射表360(如主體原子映射表、符號(hào)原子映射表、類(lèi)別原子映射表和描述原子映射表)包含一個(gè)原子映射表數(shù)組380。每個(gè)原子映射表數(shù)組380元素是對(duì)被壓縮的一系列文件偏移(即原子偏移序列390)的引用。對(duì)于屬于一組連續(xù)原子標(biāo)識(shí)符132的信息,每個(gè)原子偏移序列390包含被壓縮的文件偏移。
圖11是關(guān)于一種原子映射表數(shù)組數(shù)據(jù)結(jié)構(gòu)的圖示。原子映射表數(shù)組380包括以下元素第一標(biāo)識(shí)符382、序列大小384和序列偏移386。第一標(biāo)識(shí)符382是第一原子130在序列中的原子標(biāo)識(shí)符132。序列大小384是在原子偏移序列390中的原子130的數(shù)目。序列中的原子130具有起始為第一標(biāo)識(shí)符382的連續(xù)原子標(biāo)識(shí)符132。序列偏移386是相對(duì)于數(shù)據(jù)庫(kù)120文件的原子映射表360部分的起始處,原子偏移序列390的起始處的文件偏移。原子映射表數(shù)組380由每個(gè)序列中的第一原子130的原子標(biāo)識(shí)符132進(jìn)行分類(lèi)。這使通過(guò)作對(duì)分檢索(binary search)將連續(xù)原子標(biāo)識(shí)符132映射到它的包含序列成為可能。然后,掃描包含序列將會(huì)得到用于所期望的原子130的文件偏移。
圖12是關(guān)于一種原子偏移序列數(shù)據(jù)結(jié)構(gòu)的圖示。原子偏移序列390是文件偏移的增量編碼數(shù)組,包括一個(gè)第一原子文件偏移392和一個(gè)增量編碼文件偏移數(shù)組394。將每個(gè)文件偏移都加到原子映射表數(shù)據(jù)偏移378上,并且相對(duì)于原子映射表360部分,對(duì)結(jié)果進(jìn)行解釋。一個(gè)長(zhǎng)序列比包含相同文件偏移數(shù)目的兩個(gè)較短的序列占用空間少,因?yàn)樗鼣備N(xiāo)固定的開(kāi)銷(xiāo)給每序列。然而,越長(zhǎng)的序列花費(fèi)越長(zhǎng)的搜索時(shí)間。所以,典型將原子映射表360分成的序列數(shù)目比確實(shí)需要的要多,以對(duì)其長(zhǎng)度進(jìn)行合理限定,并因此對(duì)搜索時(shí)間進(jìn)行合理限定。然而,對(duì)序列大小沒(méi)有固定限制。
第一原子文件偏移392是第一原子130在序列中的文件偏移。序列的其余部分是以這個(gè)值為開(kāi)始的一系列增量。
被增量編碼的文件偏移數(shù)組394是編碼一系列文件偏移的字節(jié)塊,在文件偏移處可以找到屬于連續(xù)原子標(biāo)識(shí)符132的數(shù)據(jù)。
為了對(duì)序列進(jìn)行編碼,編碼器從一系列文件偏移開(kāi)始。這些偏移表示將加到原子映射表數(shù)據(jù)偏移378的字節(jié)偏移。比如,假定原始文件偏移序列是{1000,1050,1104,1165,1645,760}。要注意的是原子130在文件中不必依次排列。首先,對(duì)序列增量編碼會(huì)得到{1000,50,54,61,480,-885}。如果默認(rèn)原子序列增量372等于50,還可以將此序列進(jìn)一步調(diào)整為{1000,0,4,11,430,-935}。最后,把序列中的每個(gè)數(shù)(經(jīng)過(guò)第一步驟之后,將這些數(shù)存儲(chǔ)于第一原子文件偏移392中)作為可變大小的整數(shù)進(jìn)行編碼。編碼得到的字節(jié)序列為{0x00 0x04 0x0B 0x83 0x2E 0xF8 0xF9}。利用較小值用較少字節(jié)的可變大小編碼方案對(duì)一些整數(shù)進(jìn)行存儲(chǔ)。帶符號(hào)的整數(shù)作為7比特值的序列進(jìn)行編碼。將這些值按大的終止字節(jié)順序(高字節(jié)在先)進(jìn)行存儲(chǔ),而不管數(shù)據(jù)庫(kù)的整個(gè)終止端。每字節(jié)的高位是特殊標(biāo)志,指明后面是否還跟有字節(jié)。第一字節(jié)的第7位(數(shù)值數(shù)據(jù)的最高位)是符號(hào)擴(kuò)展位。無(wú)符號(hào)整數(shù)作為7比特值的序列進(jìn)行編碼。將這些值按大終止字節(jié)順序(高字節(jié)在先)存儲(chǔ),而不管數(shù)據(jù)庫(kù)的整個(gè)終止端。每字節(jié)的高位是特殊標(biāo)志,指明后面是否還跟有字節(jié)。所產(chǎn)生的值是0擴(kuò)展。
利用原子映射表360將特定類(lèi)型的信息與原子標(biāo)識(shí)符相關(guān)聯(lián)。比如,可以將原子映射表360用于代碼/數(shù)據(jù)主體信息,符號(hào)信息,種類(lèi)信息和描述信息。
主體原子映射表將每個(gè)原子標(biāo)識(shí)符132映射到加載那個(gè)原子標(biāo)識(shí)符132所需的信息塊,對(duì)于正常原子,該塊包括可以合并形成最終的正常原子主體的有關(guān)原子引用136和原子字節(jié)134的壓縮信息,而對(duì)于專(zhuān)用原子,包括適于專(zhuān)用原子的每個(gè)子類(lèi)的信息。
利用該塊的第一字節(jié)對(duì)一組原子標(biāo)志396進(jìn)行編碼。如果原子標(biāo)志396的低三位的值未包含專(zhuān)用標(biāo)識(shí)符(如三位上指明值“7”),那么原子130就是正常原子,否則,它是專(zhuān)用原子。為了提高正常原子主體的加載過(guò)程,對(duì)于原子130,將原子引用136和原子字節(jié)134都連續(xù)存儲(chǔ)在原子數(shù)據(jù)庫(kù)120文件中。為了使原子數(shù)據(jù)庫(kù)120的大小保持較小,因而提高將其加載的速度,對(duì)于正常原子主體,以多種方式壓縮原子引用136和原子字節(jié)134。
圖13是關(guān)于一種編碼原子數(shù)據(jù)結(jié)構(gòu)的圖。對(duì)于正常原子,信息塊包括原子標(biāo)志396,原子數(shù)信息397,編碼原子引用398以及編碼原始原子字節(jié)399。
原子標(biāo)志396利用各種不同的標(biāo)志位指定原子壓縮類(lèi)型。本發(fā)明的實(shí)施例支持多種壓縮類(lèi)型。原子標(biāo)志396的其他位指定應(yīng)當(dāng)將該原子載入哪個(gè)緩沖區(qū)中(即只讀代碼緩沖區(qū)、只讀數(shù)據(jù)緩沖區(qū)、讀寫(xiě)數(shù)據(jù)緩沖區(qū))。還有一些其他位將定義原子130在加載時(shí)所需要的隊(duì)列(alignment)的以2為底的對(duì)數(shù)(log base two)(比如,在這些位中存儲(chǔ)的值“3”將使原子130在加載時(shí)被模(mod)8字節(jié)排列)。
原子數(shù)信息397是字節(jié)塊,包含關(guān)于編碼原子引用398塊中會(huì)出現(xiàn)多少個(gè)引用的信息,以及將會(huì)從編碼原始原子字節(jié)399塊中提取多少個(gè)原始字節(jié)的信息。那個(gè)入口將確定要提取的引用的數(shù)量和原始字節(jié)的數(shù)量。將概念上的原子字節(jié)134和原子引用136分別作為編碼原子引用398和編碼原始原子字節(jié)399進(jìn)行編碼。
圖14是關(guān)于一種編碼原子引用數(shù)據(jù)結(jié)構(gòu)的圖示。每個(gè)編碼原子引用398都是描述從這個(gè)原子130到那個(gè)原子130的引用的字節(jié)塊。比如,如果原子130表示調(diào)用由另一原子130所表示的另一過(guò)程的過(guò)程,將會(huì)在編碼原子引用398中對(duì)后一原子130進(jìn)行描述。這個(gè)關(guān)于編碼原子引用398的數(shù)組是由原子管理程序160使用,以在程序160加載398時(shí)把這些原子130鏈接在一起。
原子數(shù)信息是由編碼原子引用398編碼的原子引用的數(shù)量。
每個(gè)編碼原子引用398包括一個(gè)原子引用類(lèi)型(atom-ref-type)402、一個(gè)源偏移增量(source-offset-delta)404、一個(gè)目的偏移(dest-offset)406以及一個(gè)目的原子標(biāo)識(shí)符(dest-atom-id)408。
原子引用類(lèi)型402定義從這個(gè)原子130到那個(gè)原子130的不同類(lèi)型引用。不是所有類(lèi)型都將由所有平臺(tái)使用。有效的原子引用類(lèi)型402包括急切-絕對(duì)-32(eager-absolute-32)、急切-相對(duì)-32(eager-relative-32)、懶惰-絕對(duì)-代碼-32(lazy-absolute-code-32)、懶惰-相對(duì)-代碼-32(lazy-relative-code-32)以及懶惰-絕對(duì)-32(lazy-absolute-32)。
急切-絕對(duì)-32使原子管理程序160立即加載被引用的原子130,并存儲(chǔ)到該原子的絕對(duì)地址。
急切-相對(duì)-32類(lèi)似于急切-絕對(duì)-32,但是急切-相對(duì)-32存儲(chǔ)到相對(duì)引用的原子130的偏移。相對(duì)偏移是從引用的起始處計(jì)算。
懶惰-絕對(duì)-代碼-32定義到包含代碼的原子130的絕對(duì)地址(如32位)。它是“懶惰的”,因?yàn)楸灰玫脑?30實(shí)際上直到首次調(diào)用時(shí)才加載。原子管理程序160通過(guò)建立引用來(lái)管理延遲加載,以指向首次調(diào)用時(shí)懶惰地加載被引用的原子130的代碼存根。
懶惰-相對(duì)-代碼-32類(lèi)似于懶惰-絕對(duì)-代碼-32,但是懶惰-相對(duì)-代碼-32存儲(chǔ)相對(duì)于引用的偏移。相對(duì)偏移是從引用的起始處計(jì)算。
數(shù)據(jù)的懶惰加載或按需加載隱含是通過(guò)提供代碼的懶惰加載來(lái)提供,而明確是通過(guò)編碼引用的原子標(biāo)識(shí)符來(lái)提供,這樣,在運(yùn)行時(shí),被引用的數(shù)據(jù)原子直到被實(shí)際訪問(wèn)時(shí)才會(huì)被加載。既然,引用數(shù)據(jù)的代碼的加載一直延遲到被調(diào)用時(shí),代碼引用的數(shù)據(jù)同樣受到延遲——隱含地提供了數(shù)據(jù)的懶惰加載。懶惰數(shù)據(jù)明顯地典型需要程序員支持,以便標(biāo)記要懶惰加載的數(shù)據(jù)(如利用編譯器指示)。在一個(gè)實(shí)施例中,明顯地利用特定編碼算法來(lái)引用懶惰數(shù)據(jù),該算法以2乘以引用的原子標(biāo)識(shí)符并將引用的原子標(biāo)識(shí)符加1,以生成懶惰數(shù)據(jù)的原子標(biāo)識(shí)符。
懶惰-絕對(duì)-代碼-32定義到另一原子130的絕對(duì)地址(如32位地址)。它是懶惰的,因?yàn)楸灰玫脑?30實(shí)際上沒(méi)有被明確加載。相反,原子管理程序160通過(guò)存儲(chǔ)被編碼的地址(2*被引用的原子標(biāo)識(shí)符)+1來(lái)鏈接該引用。要注意的是,被編碼的地址總是奇數(shù)的。不像可以利用跳躍存根的懶惰的代碼引用,懶惰的數(shù)據(jù)引用需要從原子管理程序160運(yùn)行的程序中合作。它需要核對(duì)奇數(shù)指針值,并識(shí)別出它們就是懶惰的數(shù)據(jù)引用。然后,它需要通過(guò)回調(diào)到原子管理程序160來(lái)加載所期望的原子130,并將會(huì)典型地用最終地址來(lái)重寫(xiě)引用。自然一定會(huì)得知懶惰加載的數(shù)據(jù)具有偶數(shù)列,或者對(duì)于這樣的指針,奇數(shù)值將是不明確的。
源偏移增量404指定出現(xiàn)在原子130中的引用有多少字節(jié)。將該值表示為從前一引用的末尾的增量。對(duì)首次引用進(jìn)行編碼,好像前一引用在源偏移0處結(jié)束一樣。引用總是由它們的源偏移分類(lèi)進(jìn)行存儲(chǔ),所以,該數(shù)組中增量總是非負(fù)的。比如,如果原子130在字節(jié)偏移0、4、8、12、20處具有4字節(jié)引用,那么對(duì)于那些引用,源偏移增量將被編碼為0、0、0、0、4。
目的偏移406將字節(jié)數(shù)的偏移編碼為該引用指向的被引用(目的)的原子130。
目的原子標(biāo)識(shí)符408是該引用指向的原子130的原子標(biāo)識(shí)符132。
被編碼的原始原子字節(jié)399是表示原子130的原子字節(jié)134的字節(jié)塊,將容納其他原子130的任何引用所需的空間換出,并且剩余的原始字節(jié)以原子壓縮類(lèi)型所指定的方式進(jìn)行壓縮??梢砸谱咴幼止?jié)內(nèi)的引用,以創(chuàng)建原始字節(jié),因?yàn)楸痪幋a的引用信息包括一個(gè)源偏移(識(shí)別在哪進(jìn)行引用),一個(gè)目的標(biāo)識(shí)符(識(shí)別目標(biāo)原子)和一個(gè)目的偏移(識(shí)別引用將多少字節(jié)指向目標(biāo)原子)。比如,如果原子字節(jié)134表示一個(gè)C字符串常量,該數(shù)組將會(huì)容納該字符串中的一系列可能壓縮過(guò)的字符。相反,如果原子字節(jié)134包括四種數(shù)據(jù)類(lèi)型,其后接著對(duì)另一原子130的四字節(jié)引用,其后接著另外八個(gè)數(shù)據(jù)類(lèi)型,被編碼的原始原子字節(jié)399就會(huì)包含12字節(jié)可能壓縮過(guò)的數(shù)據(jù)。在加載期間,四字節(jié)引用將被接合進(jìn)去,從而使整個(gè)加載的原子字節(jié)占有16字節(jié)。
專(zhuān)用的原子是由包含特定標(biāo)識(shí)符(如將其最低的三位設(shè)為值“7”)的原子標(biāo)記396來(lái)定義。原子標(biāo)志396的剩余位指定專(zhuān)用的原子是否為dll引用原子(dll-ref-atom)或dll原子(dll-atom)。
dll引用原子包括三個(gè)字段原子標(biāo)志(atom-flag)、dll原子標(biāo)識(shí)符(dll-atom-id)以及dll符號(hào)(dll-symbol)。dll引用原子對(duì)應(yīng)于外部DLL中的符號(hào)(像用于如printf( )這樣的庫(kù)函數(shù)的原子130)。將那些原子130表示為一對(duì)DLL和在那個(gè)DLL中查找的符號(hào)。dll原子標(biāo)識(shí)符指定dll原子的標(biāo)識(shí)符,dll原子指定查找dll符號(hào)的DLL。dll-symbol指定在DLL中查找哪個(gè)符號(hào)。
dll原子包括一個(gè)原子標(biāo)志字段和一個(gè)dll路徑名稱(chēng)字段。dll原子與dll引用原子有關(guān),并用于指定dll引用原子要查找符號(hào)的DLL。dll路徑名稱(chēng)指定適于傳給dlopen、LoadLibrary或同等函數(shù)的路徑名稱(chēng)。將它存儲(chǔ)為C字符串(一系列以0為結(jié)尾的字節(jié))。
符號(hào)原子映射表將原子標(biāo)識(shí)符132映射到原文的符號(hào),通過(guò)原文符號(hào)可以用名稱(chēng)來(lái)訪問(wèn)所關(guān)聯(lián)的原子130。符號(hào)有助于以用戶(hù)友好的方式來(lái)引用原子130。比如,當(dāng)用原子標(biāo)識(shí)符值57來(lái)提交原子130時(shí),對(duì)于程序員,用名字(如“printf”)來(lái)引用原子130比用原子標(biāo)識(shí)符值(如“57”)更容易。
類(lèi)別原子映射表是從原子標(biāo)識(shí)符132到具有不定語(yǔ)義的原文類(lèi)別的原子映射表360。類(lèi)別原子映射表考慮到開(kāi)發(fā)者對(duì)原子的特定分類(lèi)。在另一實(shí)例中,可以將類(lèi)別用于對(duì)原子130加上標(biāo)簽,以識(shí)別字符字符串原子130,識(shí)別用于國(guó)際化以及用于許多其他用途的原子130。
描述原子映射表是從原子標(biāo)識(shí)符132到具有不定語(yǔ)義的原文描述的原子映射表360??梢詫⒚枋鲈佑成浔碛糜诖鎯?chǔ)在開(kāi)發(fā)/調(diào)試基于原子的系統(tǒng)時(shí)對(duì)開(kāi)發(fā)者有益的調(diào)試信息。
基于配置引用的用法,可以靜態(tài)或動(dòng)態(tài)改變?cè)右玫囊妙?lèi)型。原子引用136通常默認(rèn)為“懶惰的”,以便在運(yùn)行時(shí),將實(shí)際原子字節(jié)134的加載一直延遲到實(shí)際需要時(shí)。“急切的”引用使被引用的數(shù)據(jù)/代碼在加載調(diào)用原子130時(shí)加載,而不管它是否實(shí)際需要。通常,在運(yùn)行時(shí),在給定的原子130內(nèi)執(zhí)行的運(yùn)行時(shí)代碼路徑不會(huì)執(zhí)行原子130內(nèi)的所有指令。加載未調(diào)用或未引用的原子130浪費(fèi)了存儲(chǔ)器和處理資源。
解決用于代碼的懶惰引用包括指向一個(gè)首次調(diào)用時(shí)懶惰地加載引用原子130的代碼存根。解決用于數(shù)據(jù)的懶惰引用包括將被引用的原子標(biāo)識(shí)符存儲(chǔ)為被定義為(2*被引用的原子標(biāo)識(shí)符)+1的修改原子標(biāo)識(shí)符。
一旦執(zhí)行/訪問(wèn)懶惰的代碼引用,可以進(jìn)行優(yōu)化以避免間接使用代碼存根。優(yōu)化包括“后向修補(bǔ)(back-patching)”引用代碼,以直接引用所加載的原子130。后向修補(bǔ)用直接跳到存儲(chǔ)器中的代碼原子130來(lái)代替利用存根。對(duì)于首次實(shí)際調(diào)用程序來(lái)說(shuō),可以進(jìn)行后向修補(bǔ),并且還可以將后向修補(bǔ)應(yīng)用于任何被加載的原子130,這樣,如果當(dāng)實(shí)際上調(diào)用被引用的原子130時(shí),可以直接跳到該原子。代碼存根可以留在存儲(chǔ)器中以備未完成后向修補(bǔ)的任何原子使用。本發(fā)明的實(shí)施例提供標(biāo)記代碼原子130和數(shù)據(jù)原子130引用,以實(shí)現(xiàn)原子級(jí)上的特定加載動(dòng)作(如懶惰的或急切的)。
圖15是關(guān)于一種有6個(gè)代碼過(guò)程和3個(gè)數(shù)據(jù)元素的實(shí)例系統(tǒng)的圖示。在該實(shí)例中,過(guò)程P1調(diào)用過(guò)程P2和P3,過(guò)程P1還對(duì)訪問(wèn)數(shù)據(jù)元素D2的數(shù)據(jù)元素D1進(jìn)行訪問(wèn)。過(guò)程P2調(diào)用過(guò)程P4,并訪問(wèn)數(shù)據(jù)元素D3。過(guò)程P3訪問(wèn)數(shù)據(jù)元素D1,并調(diào)用過(guò)程P5。根據(jù)本發(fā)明的一個(gè)實(shí)施例,將每個(gè)代碼過(guò)程{P1,P2,P3,P4,P5,P6}定義為單個(gè)的可獨(dú)立編址的原子。類(lèi)似地,將每個(gè)數(shù)據(jù)元素{D1,D2,D3}定義為單個(gè)的可獨(dú)立編址的原子。在運(yùn)行時(shí),當(dāng)加載P1時(shí),立即將D1加載,這使得D2也被加載。如果P2和P3的引用是懶惰的,對(duì)于P2和P3,將創(chuàng)建存根,從而考慮到這些過(guò)程的實(shí)際代碼加載一直推遲到它們實(shí)際調(diào)用的時(shí)候。很可能的是,在正常的執(zhí)行路徑期間不會(huì)調(diào)用一些代碼過(guò)程(如差錯(cuò)處理程序(error handler))。在這種情況下,將會(huì)通過(guò)延遲加載來(lái)節(jié)省處理和存儲(chǔ)。基于代碼的懶惰加載(如P2),數(shù)據(jù)的隱含懶惰加載提供了處理器和存儲(chǔ)器的節(jié)省。
對(duì)數(shù)據(jù)原子引用進(jìn)行編碼,以為數(shù)據(jù)元素提供類(lèi)似能力。數(shù)據(jù)的明確懶惰加載可以提供甚至更多的節(jié)省(如甚至在加載P2之后還可以加載D3)。
通過(guò)修改被引用的原子的原子標(biāo)識(shí)符,原子管理程序160可以將數(shù)據(jù)元素/原子一直延遲到實(shí)際被引用時(shí)。當(dāng)利用這些代碼原子時(shí),很可能的是,在正常的執(zhí)行路徑期間不會(huì)引用一些數(shù)據(jù)原子(如差錯(cuò)消息)。懶惰地/延遲地加載數(shù)據(jù)原子也節(jié)省了處理和存儲(chǔ)。
傳統(tǒng)系統(tǒng)(如Linux DLL)提供代碼存根,但是這些系統(tǒng)在啟動(dòng)時(shí)間對(duì)所有可能的引用建立存根。相反,本發(fā)明的實(shí)施例僅對(duì)每個(gè)由被加載的原子130已實(shí)際引用的原子建立存根。參照?qǐng)D13,加載P1將會(huì)使用于P2和P3的存根創(chuàng)建。傳統(tǒng)系統(tǒng)典型地在啟動(dòng)時(shí)加載所有的數(shù)據(jù)元素。比如,在一個(gè)傳統(tǒng)系統(tǒng)中,在啟動(dòng)時(shí)將會(huì)把D1、D2和D3都加載。相反,本發(fā)明的實(shí)施例在加載D2時(shí)僅加載D3,或者僅當(dāng)D3實(shí)際使用時(shí)進(jìn)行加載。在加載方面,以類(lèi)似方式靈活處理數(shù)據(jù)和代碼提供了許多性能改善。這一點(diǎn)對(duì)具有相對(duì)大的要編碼的數(shù)據(jù)速率的系統(tǒng)尤為正確。
利用視圖,該實(shí)例系統(tǒng)可以包括替換P5的一個(gè)新過(guò)程P6?,F(xiàn)有系統(tǒng)不必進(jìn)行改變,因?yàn)榭梢詫⒁晥D用于加載和引用以P6的引用來(lái)替換P5的引用的操作。
圖16a是實(shí)例數(shù)據(jù)原子130的圖示。從概念上表示數(shù)據(jù)原子130,以舉例說(shuō)明其原子標(biāo)識(shí)符132、原子字節(jié)134和原子引用136。數(shù)據(jù)原子16001(類(lèi)似于圖15中的D1)包含兩項(xiàng)數(shù)據(jù)(原子字節(jié)134)對(duì)一個(gè)人名(即“瑪麗 史密斯”)的引用(指針)和一個(gè)代表瑪麗年齡的整數(shù)(即47)。該引用(原子引用136)是對(duì)原子16002的引用。原子16002(類(lèi)似于圖15中的D2)是表示字母字符串“瑪麗 史密斯”(原子字節(jié)132)的數(shù)據(jù)原子130,原子16002不引用任何其它原子。
圖16b是關(guān)于實(shí)例代碼原子130的圖示。從概念上表示代碼原子130,以舉例說(shuō)明其原子標(biāo)識(shí)符132、原子字節(jié)134和原子引用136。代碼原子15000(類(lèi)似于圖15中的P5)表示用于打印人名和年齡的print_person( )過(guò)程的可執(zhí)行代碼。代碼原子16000(類(lèi)似于圖15中的P3)表示調(diào)用print_person( )過(guò)程來(lái)打印瑪麗名字和年齡的過(guò)程。代碼原子16000通過(guò)引用數(shù)據(jù)原子16001來(lái)引用用于瑪麗的數(shù)據(jù),并通過(guò)對(duì)代碼原子15000的引用,print_person( ),來(lái)調(diào)用print_person( )函數(shù)。因此,由原子16000表示的原子包括兩個(gè)原子引用136,一個(gè)是對(duì)原子15000(用于print_person( )過(guò)程的代碼原子)的代碼原子引用136,另一個(gè)是對(duì)原子16001(用于瑪麗的數(shù)據(jù)的數(shù)據(jù)原子)的數(shù)據(jù)原子引用。
圖16c是關(guān)于實(shí)例替換代碼原子的圖示。將代碼原子17000增加到原子數(shù)據(jù)庫(kù)120上,并且它表示print_person( )過(guò)程的更新版本(原子15000)。調(diào)用print_person( )的可執(zhí)行程序現(xiàn)在可以調(diào)用老的print_person( )過(guò)程(原子標(biāo)識(shí)符15000),或者是新的print_person( )過(guò)程(原子17000),這取決于關(guān)于代碼原子17000,是否利用修改對(duì)原子15000的引用的視圖來(lái)執(zhí)行可執(zhí)行程序。這樣,可以將視圖應(yīng)用于使可執(zhí)行程序調(diào)用現(xiàn)有過(guò)程的更新版本,雖然還在適當(dāng)位置把現(xiàn)有過(guò)程留給替換的調(diào)用程序。
圖17a是關(guān)于一種原子數(shù)據(jù)庫(kù)差分過(guò)程的圖示。原子數(shù)據(jù)庫(kù)差分過(guò)程500取得兩個(gè)原子數(shù)據(jù)庫(kù),第一原子數(shù)據(jù)庫(kù)510和第二原子數(shù)據(jù)庫(kù)520,并生成一個(gè)可以被存儲(chǔ)為修補(bǔ)文件的視圖122??梢詫⒁晥D122用于虛擬地或物理地將一個(gè)原子數(shù)據(jù)庫(kù)變換為另一數(shù)據(jù)庫(kù)。原子數(shù)據(jù)庫(kù)差分過(guò)程的一個(gè)目標(biāo)在于最小化視圖122的大小,這樣可以將其存儲(chǔ)起來(lái),并以有效的方式分布。
每個(gè)原子130具有一個(gè)“主體”(原子主體134),包括字節(jié)塊(用于過(guò)程的可執(zhí)行代碼,或者字符串常量的字符),以及沒(méi)有或者多個(gè)對(duì)其他原子130的引用。將每個(gè)引用定位于主體內(nèi)的某些特定偏移;比如,對(duì)于在偏移20處或其附近所調(diào)用的過(guò)程,到該過(guò)程的調(diào)用指令20將會(huì)典型地包括對(duì)原子130的引用。
原子數(shù)據(jù)庫(kù)120對(duì)具有標(biāo)記的邊緣的指向圖進(jìn)行編碼,圖中每個(gè)原子130都是一個(gè)節(jié)點(diǎn),并且每個(gè)原子引用136都是一個(gè)邊緣。生成修補(bǔ)文件涉及識(shí)別第一原子數(shù)據(jù)庫(kù)510和第二原子數(shù)據(jù)庫(kù)520之間公用的子圖,以及重用它們而不是將那些節(jié)點(diǎn)再次運(yùn)載到修補(bǔ)文件中。不幸的是,生成質(zhì)量修補(bǔ)不只是需要識(shí)別同構(gòu)子圖。實(shí)際上,子圖除了有一個(gè)或兩個(gè)差別之外,通常是同構(gòu)的;比如,當(dāng)改變一個(gè)過(guò)程而調(diào)用它的所有過(guò)程都保持不變,就出現(xiàn)這樣情況。我們還是會(huì)喜歡將大量的原子重用于該子圖,而不是因?yàn)橐粋€(gè)差異而將它們一起放棄。
修補(bǔ)文件對(duì)第一原子數(shù)據(jù)庫(kù)510的一系列變換進(jìn)行編碼,變換提供其產(chǎn)生的圖,該圖同構(gòu)于第二原子數(shù)據(jù)庫(kù)520。識(shí)別正確的一組變換是原子數(shù)據(jù)庫(kù)差分過(guò)程500的一部分。原子數(shù)據(jù)庫(kù)差分過(guò)程500將第二原子數(shù)據(jù)庫(kù)520中的每個(gè)原子分類(lèi)為三種類(lèi)別中的其中一種,每種類(lèi)別是不同種類(lèi)的圖變換。分類(lèi)向量包括生成修補(bǔ)文件所需的所有信息。重用分類(lèi)確定可以重用第一原子數(shù)據(jù)庫(kù)510中的原子130,所以沒(méi)有必要將其增加到差分集上。這是最好的情況。替換分類(lèi)確定新原子130需要替換第一原子數(shù)據(jù)庫(kù)510中的原子130,大概允許其他原子歸入重用類(lèi)別。修補(bǔ)文件中將會(huì)出現(xiàn)原子130的字節(jié)。插入分類(lèi)確定新原子130與第一原子數(shù)據(jù)庫(kù)510中的任意原子130毫無(wú)共同之處,所以需要將其加上。修補(bǔ)文件中將會(huì)出現(xiàn)該原子130的字節(jié)。人們認(rèn)為插入比替換略好一些,因?yàn)樾扪a(bǔ)文件不必包含描述替換的信息。刪除操作是可選的,因?yàn)樵谶M(jìn)行沒(méi)有損害的修補(bǔ)之后,可以留下附加的原子130。當(dāng)應(yīng)用修補(bǔ)時(shí),該過(guò)程實(shí)際上不必替換磁盤(pán)上的原子130,因?yàn)榭梢詫⒆儞Q操作用于修改對(duì)老的原子130的引用,當(dāng)從后向修補(bǔ)安裝的角度看,相反應(yīng)當(dāng)使用新原子130。
現(xiàn)在參照?qǐng)D17b,這里每個(gè)大寫(xiě)字母{A、B、C、D、E、F}表明原子130的內(nèi)容。兩個(gè)原子當(dāng)且僅當(dāng)具有相同大寫(xiě)字母時(shí)才具有相等主體。主后綴“′”表明節(jié)點(diǎn)是新圖中的節(jié)點(diǎn)。對(duì)于該圖,一序列優(yōu)化變換是重用(C,C′),替換(D,E′),重用(B,B′)和插入(A′)。刪除(F)是可選的。
最要注意的是,變換替換(D,E′)是使變換重用(B,B′)的關(guān)鍵。一旦由B和B′所引用的原子變換為相等,B和B′就成為相等。算法將花費(fèi)大量時(shí)間試圖變換該圖,以將該圖變換,使盡可能多的重用合并成為可能。變換允許重用來(lái)自以前圖中的B和C,所以不必將它們運(yùn)載到修補(bǔ)文件中。
現(xiàn)在參照?qǐng)D17c,所示的是看起來(lái)簡(jiǎn)單但實(shí)際上更為復(fù)雜的實(shí)例。要注意的是,對(duì)邊緣進(jìn)行排序,所以?xún)煞鶊D不是很一般地同構(gòu)。在該實(shí)例中,必須做出選擇要么重用X和Y,要么重用A。兩種選擇都可以。為了重用X和Y重用(X,X′),重用(Y,Y′)以及替換(A,A′)。為了重用A替換(X,Y′),替換(Y,X′)以及重用(A,A′)。正確的答案取決于X、Y和Z有多大。如果A與X和Y相比較小,第一答案較好。如果A相對(duì)較大,那么第二答案較好。
使用貪心算法來(lái)選擇最大化重用合并的一組圖變換。并不保證該算法生成優(yōu)化的結(jié)果,當(dāng)這些圖適度類(lèi)似時(shí)該算法效果將會(huì)很好。兩個(gè)原子130,一個(gè)來(lái)自(老的)第一原子數(shù)據(jù)庫(kù)510而另一個(gè)來(lái)自(新的)第二原子數(shù)據(jù)庫(kù)520,在差分算法將一個(gè)映射到另一個(gè)時(shí),被定義為“合并的”。兩原子130合并后,就被看作是相等的。名詞“合并”描述了考慮用于合并的一對(duì)原子130。“提交的合并”是實(shí)際上完成了的合并。一旦差分算法結(jié)束,每個(gè)提交的合并將會(huì)被分類(lèi)為重用合并或替換合并。將未被合并的原子130分類(lèi)為插入合并。每個(gè)原子130至多可以合并一次。如果兩原子(老的原子和新的原子)還可能以重用合并來(lái)結(jié)束共同合并,它們就是“兼容的”。尤其是1)原子130除彼此外還未與任何原子130合并,2)原子130具有同樣的原子主體,3)忽視它們引用的原子130,原子130具有成對(duì)的同樣引用,換句話(huà)說(shuō),引用具有相同的偏移、類(lèi)型等等,4)所有被引用的原子130要么彼此相互成對(duì)合并,要么根本沒(méi)有進(jìn)行合并,換句話(huà)說(shuō),還未提交使該合并不可能為重用合并的合并,5)對(duì)“自身”的引用必須在兩個(gè)原子中成對(duì)排列,以及6)原子130沒(méi)有內(nèi)部矛盾的合并要求,比如,如果老的原子引用過(guò)原子X(jué)兩次,而新的原子引用過(guò)原子A和B,就會(huì)出現(xiàn)這種要求。為了成為重用合并,X將不得不與A和B進(jìn)行合并,而這是不可能的。
如果兩原子130(老的原子、新的原子)彼此“兼容”而與其他原子“不兼容”,它們是“唯一兼容的”。合并的“權(quán)重”是重要性的指示。如果用重用合并沒(méi)有成功合并原子130,該權(quán)重等于將要加到修補(bǔ)文件的所估計(jì)的字節(jié)數(shù)。這實(shí)際上是原子的磁盤(pán)字節(jié)表示的大小。
差分算法大體包括以下步驟1)規(guī)范化老的db和新的db,2)標(biāo)識(shí)一組“目標(biāo)”合并GM,3)標(biāo)識(shí)一組輔助GM的合并AM,4)在GM非空時(shí)a)選擇并應(yīng)用AM中的最佳合并。
b)更新GM。
c)更新AM。
5)取消每個(gè)已提交的證明不是重用合并,或者不是輔助提交的重用合并的合并,如果出現(xiàn)任何唯一兼容的合并,將所有的合并加到GM,給出一個(gè)無(wú)限權(quán)重并轉(zhuǎn)向步驟3)。
6)將老的db和新的db之間的已修改的共享算法應(yīng)用到查找剩余的同構(gòu),如果出現(xiàn)任何唯一兼容的合并,將所有的合并加到GM,給出一個(gè)無(wú)限權(quán)重并轉(zhuǎn)向步驟3)。
7)如果存在任何兼容的合并,以最大權(quán)重提交合并,給它一個(gè)無(wú)限權(quán)重,將它加到GM并轉(zhuǎn)向步驟3)。
標(biāo)準(zhǔn)化老的db和新的db包括相互獨(dú)立來(lái)瓦解每個(gè)數(shù)據(jù)庫(kù)內(nèi)的同構(gòu)子圖,在老的db和新的db上運(yùn)行標(biāo)準(zhǔn)的原子共享算法。這樣標(biāo)準(zhǔn)化數(shù)據(jù)庫(kù),從而避免了需要將原子多次合并的大多數(shù)情況。
識(shí)別GM,一組“目標(biāo)合并”,包括通過(guò)大量的在其他方面不明確的原子中明確一些“固定點(diǎn)”,試圖對(duì)兩圖進(jìn)行排列。這些提供一個(gè)起始點(diǎn),從該點(diǎn)可以決定其他合并。GM總是等于還未成為正式的重用合并的一組所有唯一兼容的合并。利用混雜了原子主體和其引用的結(jié)構(gòu)的散列(hash)表來(lái)找唯一兼容的合并。當(dāng)算法運(yùn)行時(shí),將合并加到GM,并在變換其余圖時(shí)將其從GM除去。將GM的元素稱(chēng)為“目標(biāo)合并”。要注意的是該算法沒(méi)有試圖找到可能曾經(jīng)發(fā)生的所有重用。通常將會(huì)有數(shù)量極大的重用。在最糟糕的情況下,可能的重用合并的總數(shù)量將與圖大小的平方類(lèi)似。
識(shí)別AM,一組“輔助合并”,從而了解到對(duì)于將成為重用的目標(biāo)合并,所有被引用的原子必須成對(duì)合并。那些成對(duì)合并被稱(chēng)為“輔助合并”,并且這組所有的成對(duì)合并是AM。因此,AM完全是一個(gè)關(guān)于GM的函數(shù)。GM的元素還可以在AM中出現(xiàn)。當(dāng)目標(biāo)合并輔助另一目標(biāo)合并時(shí)將發(fā)生這種情況。
當(dāng)應(yīng)用“明顯”合并時(shí),阻礙一個(gè)原子與另一原子進(jìn)行合并的是那些原子與任何其他原子進(jìn)行合并將不再自由。然而,如果僅有一個(gè)其他原子是潛在的合并對(duì)象(反之亦然),那么那個(gè)阻礙將消失。在這樣的情況下,立即將那兩原子合并沒(méi)有損害。提交這樣的合并的好處在于合并有助于使剩余合并待選的數(shù)目更為精確。在該階段中,所有這樣的“明顯”合并得到識(shí)別及應(yīng)用。每個(gè)原子可以在目標(biāo)合并、輔助合并或兩者中消失。既然重要的是決定是否有多于一個(gè)的潛在合并,例示所有可能的合并(可能進(jìn)行n2次)是不必要的。相反,可以對(duì)合并進(jìn)行計(jì)數(shù),因而當(dāng)找到第二可能合并對(duì)象時(shí),可以停止該過(guò)程。通過(guò)定義,潛在目標(biāo)合并的數(shù)量與兼容原子的數(shù)量一樣。利用散列表可以很容易算出該數(shù)量。
對(duì)于原子X(jué),對(duì)潛在輔助合并的計(jì)數(shù)更為復(fù)雜。這是通過(guò)X的所有父原子的迭代來(lái)完成。對(duì)于每個(gè)父原子,檢查該父原子與其兼容的其他原子;這些原子的每一個(gè)都表示一個(gè)潛在的目標(biāo)合并。對(duì)于每個(gè)潛在的目標(biāo)合并,要注意的是X會(huì)不得不與其合并以使自己成為成功的重用合并的類(lèi)似原子。每個(gè)這樣的原子是X的一個(gè)潛在輔助合并對(duì)象。對(duì)那些原子計(jì)數(shù)顯示出X曾經(jīng)可能會(huì)成為多少個(gè)輔助合并候選的對(duì)象。
在GM非空時(shí),盡力將每個(gè)目標(biāo)合并(老的原子、新的原子)變?yōu)閷?shí)際的重用。如較早討論的,這需要由老的原子和新的原子所引用的所有原子的成對(duì)合并。主循環(huán)(main loop)識(shí)別具有最高“分?jǐn)?shù)”的合并(下面進(jìn)行定義),并貪心地提交那個(gè)合并,重復(fù)該過(guò)程直到GM為空。具有負(fù)分的合并如果具有最高分(如果不是沒(méi)有可能構(gòu)建實(shí)際上可以出現(xiàn)合并的情況,合并將很復(fù)雜),理論上可以得到提交,但是明顯忽視分?jǐn)?shù)等于負(fù)無(wú)窮大的合并。
每個(gè)合并具有一個(gè)分?jǐn)?shù),該分?jǐn)?shù)(很粗略地)估計(jì)提交該合并將會(huì)把修補(bǔ)文件的大小降低多少。輔助合并和目標(biāo)合并都有分?jǐn)?shù)。重要的是分?jǐn)?shù)計(jì)算是相對(duì)局部的過(guò)程。如果每個(gè)合并需要改變整圖的分?jǐn)?shù),該算法將會(huì)運(yùn)行過(guò)慢而不實(shí)用。如果合并不是輔助合并也不是具有提交的所有輔助合并的目標(biāo)合并,分?jǐn)?shù)將是負(fù)無(wú)窮大。否則,分?jǐn)?shù)是關(guān)于目標(biāo)合并對(duì)其產(chǎn)生的“壓力”的函數(shù)。
每個(gè)目標(biāo)合并將壓力均勻地應(yīng)用于其所依賴(lài)的所有未提交的輔助合并,以及其本身。對(duì)“本身”的引用不接收壓力。通過(guò)采用除了對(duì)“本身”的引用以外,通過(guò)取被未提交的輔助合并的數(shù)量除的目標(biāo)合并的權(quán)重來(lái)計(jì)算壓力。
所以,具有小數(shù)量的引用的極大原子將對(duì)輔助合并產(chǎn)生相當(dāng)大的壓力,而具有大量引用的原子將對(duì)輔助合并產(chǎn)生相對(duì)小的壓力,這表明每個(gè)合并的用處很小。由于此公式,當(dāng)提交更多的輔助合并時(shí),在要進(jìn)行合并的剩余候選上的壓力將增加,因而激勵(lì)它們“結(jié)束工作”。
將合并上的所有壓力總和稱(chēng)為P。對(duì)于與M相互排斥的其他輔助合并,輔助合并的分?jǐn)?shù)M等于P減去所有P的最大值。比如,合并原子(X,Y)意味原子(X,Z)不能進(jìn)行合并,因?yàn)閄僅能合并一次。如果合并(X,Z)得到很多,那么對(duì)于(X,Y)合并,為阻止合并而受處罰是有意義的。
當(dāng)可能有大量的合并時(shí),用“最大”代替“總和”是為了避免病態(tài)處罰(pathological penalization),因?yàn)樗鼈儾欢寄馨l(fā)生。在前一實(shí)例中,由(X,Y)阻止的每個(gè)合并必定涉及X或Y,所以即使理論上阻止了上千個(gè)合并(如(X,A),(X,B),(X,C),...),至多同時(shí)可能有這些合并中的其中兩個(gè)發(fā)生(涉及X的一個(gè)合并和涉及Y的一個(gè)合并)。所以對(duì)于上千個(gè)受到阻止的合并的處罰是太過(guò)苛刻了。
要注意的是目標(biāo)合并對(duì)本身應(yīng)用壓力,即使分?jǐn)?shù)通常是負(fù)無(wú)窮大。這就是所以與目標(biāo)合并相互排斥的輔助合并因?yàn)樽柚顾艿教幜P。
合并兩原子可以導(dǎo)致三種事件發(fā)生GM、AM或AM和GM中的合并分?jǐn)?shù)。如果目標(biāo)合并成為提交的重用,目標(biāo)合并集將明顯改變。當(dāng)發(fā)生改變時(shí),從GM中除去合并,因?yàn)橥耆瓿闪撕喜?。僅提交目標(biāo)合并是不足以將合并從GM中除去的,因?yàn)楹喜⑦€需要將壓力應(yīng)用于輔助合并,所以合并實(shí)際上成為重用。當(dāng)提交合并時(shí),涉及那些原子的其他合并變?yōu)椴豢赡?,因?yàn)槊總€(gè)原子僅能合并一次。那樣將會(huì)導(dǎo)致依賴(lài)當(dāng)前不可能的合并的任何目標(biāo)合并沒(méi)有希望成為重用合并,因此,它們停止成為目標(biāo)合并,并被從GM中除去。合并還可以通過(guò)將兼容合并變成唯一兼容合并來(lái)創(chuàng)建新目標(biāo)合并。比如,假定在老的db和新的db中的每一個(gè)中都有10個(gè)原子,所有原子都相互兼容。對(duì)于那一對(duì)表示好的合并,這里沒(méi)有好的指導(dǎo),因此,該過(guò)程不會(huì)產(chǎn)生所有的100(10*10)個(gè)目標(biāo)合并。但是當(dāng)由這些原子所引用的原子中出現(xiàn)合并時(shí),成對(duì)的這些原子突然可以變?yōu)槲ㄒ患嫒?,因?yàn)閷?duì)于在老的db中的給定原子,在新的db中可能僅有一個(gè)這樣的原子,具有相同的主體,并且它的合并的引用都依然潛在地排成列。
將以前沒(méi)有考慮目標(biāo)合并的兩個(gè)兼容原子合并在一起,創(chuàng)建一個(gè)新的目標(biāo)合并,因?yàn)楝F(xiàn)在它們唯一兼容。對(duì)此的一種方式是,既然已將它們提交合并,該過(guò)程最好還是通過(guò)將壓力施加在它們引用的原子上來(lái)盡力使合并變?yōu)橹赜谩?br>
AM完全是關(guān)于GM的一個(gè)函數(shù),所以GM的變化會(huì)影響AM。從語(yǔ)義上講,好像每次GM變化,都從頭重新計(jì)算AM。實(shí)際上,增加了對(duì)AM的刷新。
根據(jù)上面給出的公式,合并的分?jǐn)?shù)受合并的影響。從語(yǔ)義上講,好像是從頭重新計(jì)算所有的合并候選分?jǐn)?shù)。實(shí)際上,在原子圖中只有“臨近”合并的原子的分?jǐn)?shù)需要刷新它們的分?jǐn)?shù)。
如果已提交的合并既不是重用也不能使其成為重用,應(yīng)當(dāng)取消合并。有兩個(gè)原因首先,替換合并比插入略為昂貴一些。其次,取消合并使涉及的原子對(duì)于不同合并來(lái)說(shuō)都是合格的,這可能對(duì)于使一些重新合并成為可能是必要的。如果在取消步驟之后,任何未提交的唯一兼容合并出現(xiàn),就將所有合并加到GM并重試主循環(huán)。但是在開(kāi)始再次循環(huán)之前,把具有最高權(quán)重的新的目標(biāo)合并給與無(wú)限權(quán)重,以保證至少該合并會(huì)成為提交的重用。這保證算法將會(huì)最終停止,而不是連續(xù)取消和始終重新應(yīng)用合并。
原子系統(tǒng)已經(jīng)具有可以瓦解數(shù)據(jù)庫(kù)中的所有同構(gòu)原子的通用的共享算法。問(wèn)題基本上與“FSM減少”相同。計(jì)算兩幅圖之間的差值的問(wèn)題與共享同構(gòu)原子有關(guān),因?yàn)閮伤惴ǘ际菍ふ彝瑯?gòu)。運(yùn)行在老的db和新的db之間的修改過(guò)的共享算法是定位其他算法所錯(cuò)過(guò)的同構(gòu)的好的支持(backstop)。該修改過(guò)的共享算法在以下方面區(qū)別于標(biāo)準(zhǔn)的共享算法1)原子僅可以在數(shù)據(jù)庫(kù)之間共享,在它們的內(nèi)部不共享,2)甚至通常不可共享的原子,如易變的數(shù)據(jù),都可以共享,以及(3)每個(gè)原子僅可以共享一次。如果在共享步驟之后,出現(xiàn)任何未提交的唯一兼容合并,正如前一步驟那樣,在給最重的目標(biāo)合并無(wú)限權(quán)重之后,重試主循環(huán)。
如果還存在任何兼容合并,提交具有最大權(quán)重的合并,給與合并無(wú)限權(quán)重,將其加到GM并重試主循環(huán)??蛇x擇的是,存在這樣的選擇,檢查與每個(gè)原子有關(guān)的人可讀描述,并利用描述來(lái)指導(dǎo)合并。該“欺騙”常常會(huì)有效,但是如果重新命名過(guò)程而另外的保持不變,將會(huì)失敗。
雖然已根據(jù)其中的優(yōu)選實(shí)施例對(duì)本發(fā)明作以專(zhuān)門(mén)說(shuō)明,本領(lǐng)域的技術(shù)人員要理解的是不偏離附加的權(quán)利要求書(shū)所涵蓋的發(fā)明范圍,這里可以進(jìn)行各種形式和細(xì)節(jié)上的變化。
特別是,對(duì)具有大量不同部分的原子數(shù)據(jù)庫(kù)120進(jìn)行了說(shuō)明,本領(lǐng)域的技術(shù)人員將會(huì)很容易認(rèn)識(shí)到,在本發(fā)明的所教范圍內(nèi)可以添加或刪除表示原子130的不同使用的部分。另外,在本發(fā)明的所教范圍內(nèi),可以改變實(shí)際的磁盤(pán)編碼方案。
盡管本發(fā)明的實(shí)施例適于完成CurlTM運(yùn)行時(shí),在發(fā)明內(nèi)容中沒(méi)有把本發(fā)明限定到用于CurlTM運(yùn)行時(shí)??梢詫⒈景l(fā)明實(shí)施例應(yīng)用于任何軟件程序。
權(quán)利要求
1.一種用于創(chuàng)建原子數(shù)據(jù)庫(kù)的視圖的方法,包括定義一組變換操作;以及將該組變換操作應(yīng)用于所述原子數(shù)據(jù)庫(kù),使得在虛擬地應(yīng)用所述變換操作時(shí),在運(yùn)行時(shí),創(chuàng)建一個(gè)虛擬原子數(shù)據(jù)庫(kù),并且在真實(shí)地應(yīng)用所述變換操作時(shí),創(chuàng)建一個(gè)新的原子數(shù)據(jù)庫(kù),所述原子數(shù)據(jù)庫(kù)存儲(chǔ)原子,所述原子包括一個(gè)永久分配的原子標(biāo)識(shí)符,計(jì)算機(jī)代碼和/或數(shù)據(jù),對(duì)其他原子的引用。
2.根據(jù)權(quán)利要求1的方法,其中將所述新的原子數(shù)據(jù)庫(kù)存儲(chǔ)在一個(gè)與所述原子數(shù)據(jù)庫(kù)獨(dú)立的文件中。
3.根據(jù)權(quán)利要求1的方法,其中所述新的原子數(shù)據(jù)庫(kù)替換原始原子數(shù)據(jù)庫(kù)。
4.根據(jù)權(quán)利要求1的方法,其中所述變換操作包括插入一個(gè)新原子的插入操作。
5.根據(jù)權(quán)利要求1的方法,其中所述變換操作包括修改一個(gè)現(xiàn)有原子的修改操作。
6.根據(jù)權(quán)利要求1的方法,其中所述變換操作包括刪除一個(gè)現(xiàn)有原子的刪除操作。
7.根據(jù)權(quán)利要求1的方法,還包括將所述視圖和所述原子數(shù)據(jù)庫(kù)與第一可執(zhí)行程序和第二可執(zhí)行程序相關(guān)聯(lián);在運(yùn)行時(shí),利用所述視圖,虛擬地對(duì)所述原子數(shù)據(jù)庫(kù)進(jìn)行變換,以創(chuàng)建一個(gè)虛擬原子數(shù)據(jù)庫(kù);以及通過(guò)所述第一可執(zhí)行程序和所述第二可執(zhí)行程序加載來(lái)自所述虛擬原子數(shù)據(jù)庫(kù)的原子,從而共享所述第一可執(zhí)行程序和所述第二可執(zhí)行程序之間的原子。
8.根據(jù)權(quán)利要求7的方法,其中將所述原子載入所述第一可執(zhí)行程序可訪問(wèn)的第一存儲(chǔ)緩沖區(qū)中,并且將所述原子載入所述第二可執(zhí)行程序可訪問(wèn)的第二存儲(chǔ)緩沖區(qū)中。
9.根據(jù)權(quán)利要求7的方法,其中將所述原子載入所述第一可執(zhí)行程序和所述第二可執(zhí)行程均可訪問(wèn)的存儲(chǔ)緩沖區(qū)中。
10.根據(jù)權(quán)利要求1的方法,還包括將第一視圖和所述原子數(shù)據(jù)庫(kù)與第一可執(zhí)行程序相關(guān)聯(lián),并將第二視圖和所述原子數(shù)據(jù)庫(kù)與第二可執(zhí)行程序相關(guān)聯(lián);在運(yùn)行時(shí),利用所述第一視圖和所述第二視圖,虛擬地對(duì)所述原子數(shù)據(jù)庫(kù)進(jìn)行變換,以創(chuàng)建第一虛擬原子數(shù)據(jù)庫(kù)和第二虛擬原子數(shù)據(jù)庫(kù);以及通過(guò)利用所述第一視圖由所述第一可執(zhí)行程序和通過(guò)利用所述第二視圖由所述第二可執(zhí)行程序加載來(lái)自所述原子數(shù)據(jù)庫(kù)的原子,從而共享所述第一可執(zhí)行程序和所述第二可執(zhí)行程序之間的原子。
11.根據(jù)權(quán)利要求10的方法,其中將所述原子載入利用所述第一視圖所述第一可執(zhí)行程序可訪問(wèn)的第一存儲(chǔ)緩沖區(qū)中,并且將所述原子載入利用所述第二視圖所述第二可執(zhí)行程序可訪問(wèn)的第二存儲(chǔ)緩沖區(qū)中。
12.根據(jù)權(quán)利要求10的方法,其中將所述原子載入利用所述第一視圖所述第一可執(zhí)行程序和利用所述第二視圖所述第二可執(zhí)行程均可訪問(wèn)的存儲(chǔ)緩沖區(qū)中。
13.根據(jù)權(quán)利要求1的方法,其中基于所述原子將在其上執(zhí)行的計(jì)算機(jī)硬件和/或軟件系統(tǒng)的優(yōu)化特征,定義所述變換操作。
14.根據(jù)權(quán)利要求1的方法,其中定義所述變換操作,以便限制對(duì)所述原子所提供的某些特征的訪問(wèn)。
15.根據(jù)權(quán)利要求1的方法,其中所述原子還包括原子特征,且所述原子變換操作改變所述原子特征。
16.根據(jù)權(quán)利要求1的方法,其中該組變換操作僅包括用第二原子替換第一原子的修改操作,這樣就創(chuàng)建了一個(gè)映射表。
17.根據(jù)權(quán)利要求1的方法,其中該組變換操作應(yīng)用于虛擬原子數(shù)據(jù)庫(kù)。
18.一種用于創(chuàng)建一組原子變換操作,以將第一原子數(shù)據(jù)庫(kù)變換為第二原子數(shù)據(jù)庫(kù)的方法,包括a)利用標(biāo)準(zhǔn)的原子共享算法,規(guī)范化所述第一原子數(shù)據(jù)庫(kù)和所述第二原子數(shù)據(jù)庫(kù),所述第一原子數(shù)據(jù)庫(kù)和所述第二原子數(shù)據(jù)庫(kù)的每一個(gè)存儲(chǔ)原子,所述原子包括一個(gè)永久分配的原子標(biāo)識(shí)符,計(jì)算機(jī)代碼和/或數(shù)據(jù),對(duì)其他原子的引用;b)確定所述第一原子數(shù)據(jù)庫(kù)的原子和所述第二原子數(shù)據(jù)庫(kù)的原子之間的一組目標(biāo)合并;c)確定輔助所述目標(biāo)合并的所述第一原子數(shù)據(jù)庫(kù)的原子和所述第二原子數(shù)據(jù)庫(kù)的原子之間的一組輔助合并;d)在該組目標(biāo)合并不為空時(shí),重復(fù)以下步驟i)在該組輔助合并中選擇一個(gè)最佳合并;ii)提交所選擇的最佳合并;iii)更新該組目標(biāo)合并;iv)更新該組輔助合并;e)取消每個(gè)提交的不是重用合并,或者未輔助提交的重用合并的合并;f)確定是否創(chuàng)建了唯一的兼容合并,并將所述唯一的兼容合并添加至所述目標(biāo)合并,將一個(gè)無(wú)限權(quán)重指定給所述唯一的兼容合并的其中一個(gè),并轉(zhuǎn)到步驟c);g)應(yīng)用使用了所述第一數(shù)據(jù)庫(kù)和所述第二數(shù)據(jù)庫(kù)的修改過(guò)的原子共享算法,以便識(shí)別剩余的同構(gòu);h)確定是否創(chuàng)建了唯一的兼容合并,并將所述唯一的兼容合并添加至所述目標(biāo)合并,將一個(gè)無(wú)限權(quán)重指定給所述唯一的兼容合并的其中一個(gè),并轉(zhuǎn)到步驟c);以及i)確定是否創(chuàng)建了任何兼容合并,并提交具有最大權(quán)重的兼容合并,將一個(gè)無(wú)限權(quán)重指定給所述提交的兼容合并,并將所述提交的兼容合并添加至該組目標(biāo)合并,并轉(zhuǎn)到步驟c);
19.根據(jù)權(quán)利要求18的方法,其中至少一個(gè)所述提交的合并是替換合并。
20.根據(jù)權(quán)利要求18的方法,其中至少一個(gè)所述提交的合并是插入合并。
21.根據(jù)權(quán)利要求18的方法,其中至少一個(gè)所述提交的合并是刪除合并。
22.一種用于創(chuàng)建原子數(shù)據(jù)庫(kù)的視圖的裝置,包括一組變換操作;以及一個(gè)處理器,其將該組變換操作應(yīng)用于所述原子數(shù)據(jù)庫(kù),使得在虛擬地應(yīng)用所述變換操作時(shí),在運(yùn)行時(shí),創(chuàng)建一個(gè)虛擬原子數(shù)據(jù)庫(kù),并且在真實(shí)地應(yīng)用所述變換操作時(shí),創(chuàng)建一個(gè)新的原子數(shù)據(jù)庫(kù),所述原子數(shù)據(jù)庫(kù)存儲(chǔ)原子,所述原子包括一個(gè)永久分配的原子標(biāo)識(shí)符,計(jì)算機(jī)代碼和/或數(shù)據(jù),對(duì)其他原子的引用。
23.一種用于創(chuàng)建原子數(shù)據(jù)庫(kù)的視圖的裝置,包括用于定義一組變換操作的裝置;以及用于將該組變換操作應(yīng)用于所述原子數(shù)據(jù)庫(kù)的裝置,使得在虛擬地應(yīng)用所述變換操作時(shí),在運(yùn)行時(shí),創(chuàng)建一個(gè)虛擬原子數(shù)據(jù)庫(kù),并且在真實(shí)地應(yīng)用所述變換操作時(shí),創(chuàng)建一個(gè)新的原子數(shù)據(jù)庫(kù),所述原子數(shù)據(jù)庫(kù)存儲(chǔ)原子,所述原子包括一個(gè)永久分配的原子標(biāo)識(shí)符,計(jì)算機(jī)代碼和/或數(shù)據(jù),對(duì)其他原子的引用。
24.一種計(jì)算機(jī)程序產(chǎn)品,包括計(jì)算機(jī)可用介質(zhì),用于創(chuàng)建原子數(shù)據(jù)庫(kù)的視圖;在所述計(jì)算機(jī)可用介質(zhì)上體現(xiàn)的一組計(jì)算機(jī)程序指令,包括的指令有定義一組變換操作;以及將該組變換操作應(yīng)用于所述原子數(shù)據(jù)庫(kù),使得在虛擬地應(yīng)用所述變換操作時(shí),在運(yùn)行時(shí),創(chuàng)建一個(gè)虛擬原子數(shù)據(jù)庫(kù),并且在真實(shí)地應(yīng)用所述變換操作時(shí),創(chuàng)建一個(gè)新的原子數(shù)據(jù)庫(kù),所述原子數(shù)據(jù)庫(kù)存儲(chǔ)原子,所述原子包括一個(gè)永久分配的原子標(biāo)識(shí)符,計(jì)算機(jī)代碼和/或數(shù)據(jù),對(duì)其他原子的引用。
全文摘要
用于軟件原子化的視圖提供對(duì)原子數(shù)據(jù)庫(kù)中的現(xiàn)有原子的運(yùn)行時(shí)變換,以創(chuàng)建新的或虛擬原子數(shù)據(jù)庫(kù)。視圖提供對(duì)存儲(chǔ)于原子數(shù)據(jù)庫(kù)的代碼和數(shù)據(jù)原子的共享,以及提供對(duì)載入存儲(chǔ)器中的代碼和數(shù)據(jù)原子的共享。一個(gè)視圖是一組變換操作,包括插入一個(gè)新原子,修改一個(gè)現(xiàn)有原子,或者刪除一個(gè)現(xiàn)有原子,可以將該組變換操作應(yīng)用于原子數(shù)據(jù)庫(kù)??梢哉鎸?shí)地應(yīng)用所述變換操作,以在磁盤(pán)上創(chuàng)建一個(gè)新的原子數(shù)據(jù)庫(kù),或者可以虛擬地應(yīng)用所述變換操作,以在運(yùn)行時(shí)創(chuàng)建一個(gè)虛擬原子數(shù)據(jù)庫(kù),而不必實(shí)際在磁盤(pán)上創(chuàng)建一個(gè)真實(shí)的原子數(shù)據(jù)庫(kù)??梢杂酶鞣N方法來(lái)完成對(duì)現(xiàn)有原子的修改,包括改變?cè)幼止?jié),或者原子引用,或者原子屬性。
文檔編號(hào)G06F9/445GK1672150SQ03817341
公開(kāi)日2005年9月21日 申請(qǐng)日期2003年6月18日 優(yōu)先權(quán)日2002年6月21日
發(fā)明者馬修·J·霍斯泰特, 本亞明·R·哈里森 申請(qǐng)人:住商信息系統(tǒng)株式會(huì)社