專利名稱:管理鏈接表數(shù)據(jù)結(jié)構(gòu)的方法和裝置的制作方法
技術(shù)領(lǐng)域:
本發(fā)明總體涉及計算機軟件程序領(lǐng)域,更具體地說,本發(fā)明涉及一種對由計算機程序保持和訪問的鏈接表數(shù)據(jù)結(jié)構(gòu)進行管理的方法。
鏈接表數(shù)據(jù)結(jié)構(gòu)存儲數(shù)據(jù)元素的序列,具有快速地對這種序列進行增、刪數(shù)據(jù)元素的功能。鏈接表數(shù)據(jù)結(jié)構(gòu)的特點在于,它的每個數(shù)據(jù)元素都包括一個指向鏈接表中下一個順序排列的元素的指針。因此應(yīng)當明白,向鏈接表數(shù)據(jù)結(jié)構(gòu)增加一個元素或者從中刪除一個元素都要求修改與該元素直接相鄰的前一個元素的指針內(nèi)容,以反映鏈接表數(shù)據(jù)結(jié)構(gòu)的變化。
多線程程序包括許多線程,其中的許多線程可能要求訪問某特定的鏈接表數(shù)據(jù)結(jié)構(gòu)。這種線程對鏈接表數(shù)據(jù)結(jié)構(gòu)既可能進行非改變性操作例如GET(獲取),也可能進行改變性操作例如ADD(增加)。為了防止許多線程同時訪問一個對象,諸如鏈接表數(shù)據(jù)結(jié)構(gòu),通常的做法是讓這類線程執(zhí)行所謂的“同步化”方法(method),對目標對象進行鎖定,這樣就能防止任何其它方法在目標對象被活動方法釋放之前訪問到目標對象。
如果目標對象是鏈接表數(shù)據(jù)結(jié)構(gòu),一般來說整個數(shù)據(jù)結(jié)構(gòu)都要被同步化方法鎖定,直到方法完成。這樣就能禁止不同線程同時訪問一個鏈接表數(shù)據(jù)結(jié)構(gòu)。
根據(jù)本發(fā)明的第一個方面,提供一種管理鏈接表數(shù)據(jù)結(jié)構(gòu)的方法。鏈接表數(shù)據(jù)結(jié)構(gòu)包括由數(shù)據(jù)部分和指針部分組成的第一個元素。該方法要求通過插入或刪除第二個元素來修改鏈接表數(shù)據(jù)結(jié)構(gòu)。然后更新第一個元素的指針部分,以反映對鏈接表數(shù)據(jù)結(jié)構(gòu)的修改。對第一個元素的指針部分的更新包含一個原子操作。與對鏈接表數(shù)據(jù)結(jié)構(gòu)修改的同時執(zhí)行的,是對鏈接表數(shù)據(jù)結(jié)構(gòu)的非同步遍歷。在一個實施例中,遍歷操作是一種非修改性操作,包含一個數(shù)據(jù)讀和/或檢索操作。
根據(jù)本發(fā)明的第二個方面,提供一種計算機可讀介質(zhì),其上存儲的指令序列被處理器執(zhí)行時,使處理器執(zhí)行如上所述的該方法的諸步驟。
根據(jù)本發(fā)明的第三個方面,提供一種面向?qū)ο蟮木幊汰h(huán)境中的鏈接表對象。該對象包括一種鏈接表數(shù)據(jù)結(jié)構(gòu)和一種通過插入或刪除第一個元素來修改鏈接表數(shù)據(jù)結(jié)構(gòu)的修改方法。該對象還包括一種為了反映修改方法對鏈接表數(shù)據(jù)結(jié)構(gòu)的修改而對第二個元素的指針部分進行更新的更新方法。該更新方法執(zhí)行的更新步驟中包含一個原子操作。該對象還包括一種遍歷方法,在通過修改方法對鏈接表數(shù)據(jù)結(jié)構(gòu)修改的同時,執(zhí)行對鏈接表數(shù)據(jù)結(jié)構(gòu)的非同步遍歷。遍歷可作為原子操作對第一個元素的指針部分進行檢查。
閱讀下文中的附圖、詳細說明和權(quán)利要求,本發(fā)明的其它特點也顯而易見。
本發(fā)明是通過舉例說明的,并不局限于附圖中的各圖示。附圖中用類似的參照號來標示一些成分,其中
圖1是表示在面向?qū)ο蟮某绦颦h(huán)境中運行的多線程程序的框圖。
圖2是鏈接表數(shù)據(jù)結(jié)構(gòu)的圖解表示。
圖3a和3b的示意圖分別表示對圖2的鏈接表數(shù)據(jù)結(jié)構(gòu)進行的元素插入和刪除操作。
圖4是一種按照本發(fā)明管理鏈接表數(shù)據(jù)結(jié)構(gòu)的方法的流程圖。
圖5是表示一種散列表的結(jié)構(gòu)的框圖。
圖6是表示按照本發(fā)明的一個實施例構(gòu)造的一系列散列表對象的框圖。
圖7是表示一個計算機系統(tǒng)的框圖,該系統(tǒng)包括一種計算機可讀介質(zhì),其上存儲的指令序列被處理器執(zhí)行時,使處理器執(zhí)行按照本發(fā)明一個實施例的管理鏈接表數(shù)據(jù)結(jié)構(gòu)的方法。
現(xiàn)在說明一種計算機實現(xiàn)的管理鏈接表數(shù)據(jù)結(jié)構(gòu)的方法。為了解釋的需要,以下說明中陳述了許多具體細節(jié),目的是透徹地闡明本發(fā)明。不過本領(lǐng)域的熟練人員顯然清楚,沒有這些具體細節(jié),本發(fā)明也可以實施。特別是,盡管下文描述的一個示范實施例是用一種面向?qū)ο蟮木幊陶Z言實現(xiàn)的,但是本發(fā)明并不受這種或任何其它類型的編程語言的限制。
參見圖1,圖中顯示的用一種面向?qū)ο蟮木幊陶Z言設(shè)計的多線程程序(10)的框圖,該編程語言例如是美國加州Mountain View的Sun Mircosystems公司開發(fā)的JavaTM程序設(shè)計語言。如圖所示,程序10保持著一個線程隊列12,包括14b、14c和14d,它們都要求訪問對象16。圖中示出線程14a正在訪問對象16。多線程程序10的特點在于每個線程14共享數(shù)據(jù),因此可以訪問相同的數(shù)據(jù)和變量,這些數(shù)據(jù)和變量則可以包容在諸如對象16的某個對象中。例如,采用JavaTM程序設(shè)計語言,Java虛擬機(JVM)任何時刻都可以支持多個執(zhí)行線程。這些線程中每一個都獨立地執(zhí)行對在共享內(nèi)存中存儲的值和對象進行操作的Java程序碼。支持多線程的手段可以是,采用多個硬件處理器、對單一硬件處理器的時間分片、對多個硬件處理器的時間分片。
活動的線程14可以對其引用的任何對象進行訪問。例如,線程14a~d中的每個線程都有一個指向?qū)ο?6的索引。如果兩個或更多的線程訪問同一個對象時,可以想見,這些線程所執(zhí)行的操作可能會相互沖突,導致有關(guān)對象的不可靠或者某個或多個線程的操作不正常。為了解決這個問題,通常的做法是規(guī)定多線程對共享對象進行“同步”訪問。具體來說,“同步”一詞指保證一個線程沒有中斷地完成對一個對象-無論變量還是數(shù)據(jù)-的操作的能力。信號量和mutexes可以用來實現(xiàn)同步。另一種替代方法是,可以通過采用“監(jiān)控器”來獲得線程訪問之間的同步,其中監(jiān)控器是這樣的高級工具,它們只允許每次有一個線程執(zhí)行由相關(guān)監(jiān)控器保護的一部分代碼。在JavaTM語言中,將能夠封鎖線程、并在其變得可用時再次通知被封鎖線程的對象,稱為監(jiān)控器對象。例如參見圖1,對象16就可以是個監(jiān)控器對象,如果這樣,當線程14a訪問該對象時,它就封鎖線程14b~c,當線程14a完成對對象16的訪問時,它將通知線程隊列12。由其它線程作出的對訪問某對象的封鎖這個操作,稱為進行“鎖定”(lock);由另一個線程作出的再次允許訪問某對象這個操作,稱為“解鎖”(unlocked)操作。
應(yīng)當理解,執(zhí)行同步化方法(method)的線程存在著性能上的缺陷,因為任何時刻只允許由一個線程訪問某個對象,某些并發(fā)操作會被禁止。
對象16內(nèi)的包含的通常的數(shù)據(jù)結(jié)構(gòu)類型是圖2所示的鏈接表數(shù)據(jù)結(jié)構(gòu)20。鏈接表數(shù)據(jù)結(jié)構(gòu)20包含一個有序的元素序列22a~22n,這種結(jié)構(gòu)有利于快速地向序列插入元素或從其刪除元素。每個元素22包括數(shù)據(jù)項24和指向鏈接表數(shù)據(jù)結(jié)構(gòu)20中下一個順序元素22的指針26。數(shù)據(jù)結(jié)構(gòu)20中的最后元素22n的指針內(nèi)容為零,表示該表的結(jié)尾。
圖3a和3b表示對鏈接表數(shù)據(jù)結(jié)構(gòu)20的修改。具體來說,圖3a表示將元素22(n+1)插入數(shù)據(jù)結(jié)構(gòu)20中22(n)與22(n+2)之間。圖3b類似地表示將元素22(n+1)從鏈接表數(shù)據(jù)結(jié)構(gòu)20刪除。首先參見圖3a,能訪問一個包括鏈接表數(shù)據(jù)結(jié)構(gòu)20的對象的活動線程可能希望插入元素22(n+1)。向鏈接表數(shù)據(jù)結(jié)構(gòu)20插入(添加)這個元素要求與元素22(n+1)要插入位置直接相鄰的前一個元素22(n)的指針內(nèi)容,由原來指向順序元素22(n+2)更新為指向新近插入的元素22(n+1)。元素22(n)的指針的更新由箭頭28表示。元素22(n+1)的指針也必須設(shè)置為指向元素22(n+2)。
在本發(fā)明的一個實施例中,每個指針26含有一個32位地址。如果假設(shè)兩個線程會同時訪問鏈接表數(shù)據(jù)結(jié)構(gòu)20,顯然需要在程序中進行同步。具體來說,假設(shè)第一個線程插入元素22(n+1),將元素22(n)的指針26內(nèi)容更新為指向元素22(n+1)。與此同時,第二個線程可能正在通過檢查由指針規(guī)定的數(shù)據(jù)路徑執(zhí)行對數(shù)據(jù)結(jié)構(gòu)20的遍歷操作。具體來說,第二個線程可能正在遍歷數(shù)據(jù)結(jié)構(gòu)20,目的是檢索某預(yù)定數(shù)據(jù)項24。由于第二個線程要依靠每個元素的指針來指引其向序列中下一個元素的搜索,所以不難理解,對部分改變了的指針的讀操作,會對第二個線程對數(shù)據(jù)結(jié)構(gòu)20的遍歷產(chǎn)生嚴重錯誤。為了防止發(fā)生上述情況,通常做法是對訪問鏈接表數(shù)據(jù)結(jié)構(gòu)20的對象的方法(methods of objects)進行同步,以便任意時刻只有一個線程或方法能訪問數(shù)據(jù)結(jié)構(gòu)20。具體來說,可以利用同步來鎖定引用鏈接表數(shù)據(jù)結(jié)構(gòu)的數(shù)據(jù)結(jié)構(gòu),諸如散列表,或者直接鎖定鏈接表數(shù)據(jù)結(jié)構(gòu)20本身。然而應(yīng)當明白,每次只允許一個線程訪問鏈接表數(shù)據(jù)結(jié)構(gòu)并不能達到最佳效能。為了理解本發(fā)明的重要性,首先必須考察在鏈接表數(shù)據(jù)結(jié)構(gòu)20上的三種可能操作,它們是1.插入(添加)操作。如圖3a所示,該操作將元素添加到鏈接表數(shù)據(jù)結(jié)構(gòu)20。
2.移出(刪除)操作。如圖3b所示,該操作從鏈接表數(shù)據(jù)結(jié)構(gòu)20刪除元素。
3.遍歷操作。該操作檢查鏈接表數(shù)據(jù)結(jié)構(gòu)20內(nèi)元素的內(nèi)容,目的是確定其中是否存在某數(shù)據(jù)項和/或可能提取這個數(shù)據(jù)項。
遍歷操作與插入和刪除操作的不同在于它不會改變數(shù)據(jù)結(jié)構(gòu)20。本發(fā)明提出的方法中,對鏈接表數(shù)據(jù)結(jié)構(gòu)20的非改變性遍歷是與其它遍歷操作以及與修改操作不同步的。采用非同步遍歷操作的優(yōu)點在于修改和遍歷操作可以同時進行,并且可以同時對鏈接表數(shù)據(jù)結(jié)構(gòu)20進行許多非同步的遍歷操作。這樣,在有多個線程主要對鏈接表數(shù)據(jù)結(jié)構(gòu)20進行遍歷操作的程序中,就能由大量的這種線程同時地訪問數(shù)據(jù)結(jié)構(gòu)20。通過規(guī)定由線程對元素22的指針26的原子讀寫操作,方便了非同步遍歷操作的實現(xiàn)。具體來說,原子操作是功能上不能分割的操作,因此是有完成保證的操作?,F(xiàn)在具體參照圖3a和3b來說明本發(fā)明的方法。圖3a所示的插入方法是(與其它同步方法)同步的,主要包含如下步驟1.檢查要插入的元素是否在鏈接表數(shù)據(jù)結(jié)構(gòu)20中已經(jīng)存在。如果是,則插入操作中止。
2.在一個原子操作中,將被插入元素22(n+1)的指針更新為指向下一個順序元素22(n+2)。此步驟完成時,兩個元素22(n)和22(n+1)的指針都指向元素22(n+2)。
3.在一個原子操作中,將元素22(n)的指針更新為指向被插入元素22(n+1)。
與此類似,從鏈接表數(shù)據(jù)結(jié)構(gòu)20刪除元素22的同步方法主要包含如下步驟
1.執(zhí)行檢查操作,確定鏈接表中是否確實存在有關(guān)數(shù)據(jù)項;2.在一個原子操作中,元素22(n)的指針更新為指向元素22(n+2)。
應(yīng)當注意的是在上述執(zhí)行的操作中,對元素22的指針26的修改操作包含原子操作。因此就能保障在插入或刪除操作期間任何對鏈接表數(shù)據(jù)結(jié)構(gòu)20進行的遍歷操作的方法都能檢查有效的數(shù)據(jù)路徑。正是這種對有效數(shù)據(jù)路徑的保障,便利了采用非同步遍歷操作的方法對鏈接表數(shù)據(jù)結(jié)構(gòu)20的訪問。然而,在一個實施例中,要理解的是仍然需要同步的修改操作來防止這些修改操作之間的沖突。這樣,采用非同步遍歷操作的方法就能允許包含這些非同步遍歷方法的多個線程同時訪問單一的鏈接表數(shù)據(jù)結(jié)構(gòu)20,從而優(yōu)化了計算機程序的性能。
本發(fā)明進一步特別適合應(yīng)用于能夠?qū)崿F(xiàn)所謂的“標記與清除無用存儲單元收集”(mark and sweep garbage collection)的程序設(shè)計語言。具體來說,這種標記與清除無用存儲單元收集技術(shù),不要求采用引用計數(shù)器機制來保持對某特定對象的引用的跟蹤。采用引用計數(shù)的無用存儲單元收集收集方案,要求用同步操作,并會因此限制用本發(fā)明方法執(zhí)行同步無用存儲單元收集操作而取得的性能優(yōu)點。
現(xiàn)在參見圖4,圖中表示了一種按照本發(fā)明管理含有許多元素22的鏈接表數(shù)據(jù)結(jié)構(gòu)的方法30。該方法從步驟32開始后,并行地執(zhí)行兩組操作。具體來說,方法30允許第一個線程在步驟34通過插入或刪除元素22來修改鏈接表數(shù)據(jù)結(jié)構(gòu)20。然后,方法30繼續(xù)到步驟36,原子地修改數(shù)據(jù)結(jié)構(gòu)20中有關(guān)元素22的指針,以反映步驟34所作的修改。在本發(fā)明的一個實施例中,用于對指針26進行原子修改操作和讀取操作的程序設(shè)計語言是JavaTM程序設(shè)計語言。在執(zhí)行步驟34和36的同時,本發(fā)明的方法30允許在步驟38同時執(zhí)行任意次數(shù)的對鏈接表數(shù)據(jù)結(jié)構(gòu)20的非同步遍歷操作。
圖5表示一種散列表40,該表中有許多項或散列表元,每個散列表元分別指向一個鏈接表數(shù)據(jù)結(jié)構(gòu)20。在散列表數(shù)據(jù)結(jié)構(gòu)中,作為對象的數(shù)據(jù)項(例如雇員紀錄)是用鍵字來標識的。例如,鏈接表數(shù)據(jù)結(jié)構(gòu)20a的第一個元素22的數(shù)據(jù)項是由鍵字“AAA”標識的。散列表40由鍵字計算出一個整數(shù)值,稱為散列碼。因此由示例中的鍵字“AAA”生成的散列碼為零(0)。因此用散列表40便于生成緊湊的陣列索引。所含鍵字生成了相同散列碼的數(shù)據(jù)項被視為包容在同一個散列表元中,并且可能包含諸如圖5所示的任一種鏈接表數(shù)據(jù)結(jié)構(gòu)20。本發(fā)明可用于管理散列表40所引用的鏈接表數(shù)據(jù)結(jié)構(gòu)20。
圖6表示根據(jù)本發(fā)明的一系列對象50,它們包含類52的對象。圖中的每個對象50都包含一個指向許多鏈接表數(shù)據(jù)結(jié)構(gòu)20的散列表數(shù)據(jù)結(jié)構(gòu)40。每個對象進一步包括三個非同步遍歷方法,即“CONTAINS”(包含)方法60、“CONTAINS KEY”(包含鍵字)方法62和“GET”(讀取)方法64?!癈ONTAINS”方法60測試線程提供的鍵字是否與散列表數(shù)據(jù)結(jié)構(gòu)40中的特定值匹配?!癈ONTAINSKEY”方法62測試特定對象是否是散列表數(shù)據(jù)結(jié)構(gòu)40中的鍵字,而“GET”方法64向其鍵字在散列表數(shù)據(jù)結(jié)構(gòu)40有匹配值的線程返回一個數(shù)據(jù)項。每個對象進一步包括一個同步“PUT”(插入)方法66,它負責按照上文所述方法向鏈接表數(shù)據(jù)結(jié)構(gòu)20插入元素22。每個對象50還包括一個同步“REMOVE”(刪除)方法68,它負責按照上文所述方法從鏈接表數(shù)據(jù)結(jié)構(gòu)20刪除元素22。當然應(yīng)當明白,上述的對象50僅僅是示例性的,本發(fā)明原理可以運用到任意數(shù)量、種類各異的結(jié)構(gòu)中。
現(xiàn)在參見圖7,圖中的計算機系統(tǒng)70包括處理器72、靜態(tài)存儲器74和主存儲器76。處理器72與存儲器74及76通過總線78互相通訊,并與許多外圍設(shè)備通訊。外圍設(shè)備包括視頻顯示器80(諸如陰極射線管CRT或液晶顯示器LCD)、字母數(shù)字輸入設(shè)備82(諸如鍵盤)、光標控制設(shè)備84(諸如鼠標器)、驅(qū)動單元86及其容納的計算機可讀介質(zhì)88、信號發(fā)生設(shè)備90(例如一對揚聲器)、網(wǎng)絡(luò)接口設(shè)備94。本發(fā)明中的“計算機可讀介質(zhì)”一詞系指可容納在驅(qū)動器單元86的磁性存儲介質(zhì)、主存儲器76、靜態(tài)存儲器74、處理器72或任何能從其中讀取數(shù)據(jù)用于處理器72執(zhí)行的其它介質(zhì)。散列表對象92中包含諸如上文討論的方法,如圖所述,散列表對象92全部或部分地駐留在計算機可讀介質(zhì)88、主存儲器76或處理器72本身中。散列表對象92包括一個指令序列,該指令序列被處理器72執(zhí)行時,使處理器72至少執(zhí)行上文介紹圖4時所述的步驟。
網(wǎng)絡(luò)接口設(shè)備94可以是調(diào)制解調(diào)器、網(wǎng)絡(luò)適配器卡或其它任何將計算機系統(tǒng)70與計算機網(wǎng)絡(luò)連接的設(shè)備。網(wǎng)絡(luò)接口設(shè)備94可用于生成或接收所編碼的計算機數(shù)據(jù)信號的載波。計算機數(shù)據(jù)信號可被翻譯后生成執(zhí)行時實現(xiàn)本發(fā)明的程序碼。
本文至此描述了一種管理鏈接表數(shù)據(jù)結(jié)構(gòu)的方法。盡管本發(fā)明是結(jié)合具體的示范性實施例說明的,顯然,在不偏離本發(fā)明的精神和范圍的情況下能對這些實施例作出各種修改和改進。所以本說明書和各附圖應(yīng)視為是示例性的而不是限制性的。
權(quán)利要求
1.一種計算機實現(xiàn)的管理鏈接表數(shù)據(jù)結(jié)構(gòu)的方法,其中,鏈接表數(shù)據(jù)結(jié)構(gòu)包括由數(shù)據(jù)部分和指針部分組成的第一個元素,該方法包括下列步驟修改鏈接表數(shù)據(jù)結(jié)構(gòu);更新第一個元素的指針部分以反映對鏈接表數(shù)據(jù)結(jié)構(gòu)的修改,更新步驟包含一個原子操作;在對鏈接表數(shù)據(jù)結(jié)構(gòu)修改的同時,執(zhí)行對鏈接表數(shù)據(jù)結(jié)構(gòu)的非同步遍歷。
2.權(quán)利要求1的計算機實現(xiàn)的方法,包括同時執(zhí)行多個對鏈接表數(shù)據(jù)結(jié)構(gòu)的非同步遍歷的步驟。
3.權(quán)利要求1的計算機實現(xiàn)的方法,其中,修改鏈接表數(shù)據(jù)結(jié)構(gòu)的步驟包括向鏈接表數(shù)據(jù)結(jié)構(gòu)添加第二個元素,其中的原子操作包括將第一個元素的指針部分修改為指向第二個元素。
4.權(quán)利要求1的計算機實現(xiàn)的方法,其中的原子修改操作包括將第一個元素的指針部分修改為指向第三個元素。
5.權(quán)利要求1的計算機實現(xiàn)的方法,其中,修改鏈接表數(shù)據(jù)結(jié)構(gòu)的步驟包括從鏈接表數(shù)據(jù)結(jié)構(gòu)刪除第二個元素,其中的原子操作包括將第一個元素的指針部分從指向第二個元素修改為指向第三個元素。
6.權(quán)利要求1的計算機實現(xiàn)的方法,包括在修改和更新操作的同時對鏈接表數(shù)據(jù)結(jié)構(gòu)執(zhí)行標記與清除無用存儲單元收集操作的步驟。
7.權(quán)利要求1的計算機實現(xiàn)的方法,其中,修改鏈接表數(shù)據(jù)結(jié)構(gòu)的步驟是一個同步操作。
8.權(quán)利要求1的計算機實現(xiàn)的方法,其中,非同步遍歷包含提取鏈接表數(shù)據(jù)結(jié)構(gòu)內(nèi)某元素的數(shù)據(jù)部分的提取操作。
9.在一種面向?qū)ο蟮木幊汰h(huán)境中的鏈接表對象,包括一個包括多個元素的鏈接表數(shù)據(jù)結(jié)構(gòu),其中每個元素各自都有數(shù)據(jù)部分和指針部分;一種通過插入或刪除第一個元素來修改鏈接表數(shù)據(jù)結(jié)構(gòu)的修改方法;一種為反映對鏈接表數(shù)據(jù)結(jié)構(gòu)的修改而用原子修改操作更新第二個元素的指針部分的更新方法;一種在用修改方法對鏈接表數(shù)據(jù)結(jié)構(gòu)修改的同時,執(zhí)行對鏈接表數(shù)據(jù)結(jié)構(gòu)的非同步遍歷的遍歷方法。
10.一種計算機可讀介質(zhì),其上存儲的指令序列被處理器執(zhí)行時,使處理器執(zhí)行以下步驟通過插入或刪除第二個元素,修改含有由數(shù)據(jù)部分和指針部分組成的第一個元素的鏈接表數(shù)據(jù)結(jié)構(gòu);更新第一個元素的指針部分,以反映對鏈接表數(shù)據(jù)結(jié)構(gòu)的修改,更新步驟包含一個原子操作;在對鏈接表數(shù)據(jù)結(jié)構(gòu)修改的同時,執(zhí)行對鏈接表數(shù)據(jù)結(jié)構(gòu)的非同步遍歷。
11.權(quán)利要求10的計算機可讀介質(zhì),其存儲的指令序列使處理器在對鏈接表數(shù)據(jù)結(jié)構(gòu)修改的同時,執(zhí)行多個對鏈接表數(shù)據(jù)結(jié)構(gòu)的非同步遍歷。
12.權(quán)利要求10的計算機可讀介質(zhì),其存儲的指令序列使處理器向鏈接表數(shù)據(jù)結(jié)構(gòu)添加第二個元素,其中的原子操作包括將第一個元素的指針部分修改為指向第二個元素。
13.權(quán)利要求10的計算機可讀介質(zhì),其中的原子操作包括將第一個元素的指針部分修改為指向第三個元素。
14.權(quán)利要求10的計算機可讀介質(zhì),其存儲的指令序列使處理器從鏈接表數(shù)據(jù)結(jié)構(gòu)刪除第二個元素,更新步驟包含原子地將第一個元素的指針部分從指向第一個元素修改為指向第三個元素的步驟。
15.權(quán)利要求10的計算機可讀介質(zhì),包括在修改和更新操作的同時對鏈接表數(shù)據(jù)結(jié)構(gòu)執(zhí)行標記與清除無用存儲單元收集的操作的步驟。
16.權(quán)利要求10的計算機可讀介質(zhì),其中的修改鏈接表數(shù)據(jù)結(jié)構(gòu)的步驟是同步操作。
17.一種計算機實現(xiàn)的管理鏈接表數(shù)據(jù)結(jié)構(gòu)的方法,其中鏈接表數(shù)據(jù)結(jié)構(gòu)一個由數(shù)據(jù)部分和指針部分組成的元素,該方法包括下列步驟對鏈接表數(shù)據(jù)結(jié)構(gòu)執(zhí)行第一種操作;在執(zhí)行第一種操作的同時,執(zhí)行對鏈接表數(shù)據(jù)結(jié)構(gòu)的非同步遍歷,其中非同步遍歷包括執(zhí)行對元素的指針部分的讀操作,該讀操作按原子操作執(zhí)行。
18.權(quán)利要求17的計算機實現(xiàn)的方法,其中的第一種操作是對鏈接表數(shù)據(jù)結(jié)構(gòu)的進一步非同步遍歷。
19.權(quán)利要求17的計算機實現(xiàn)的方法,其中的第一種操作是對鏈接表數(shù)據(jù)結(jié)構(gòu)的進一步同步修改。
20.一種計算機可讀介質(zhì),其上存儲的指令序列被處理器執(zhí)行時,使處理器執(zhí)行以下步驟對鏈接表數(shù)據(jù)結(jié)構(gòu)執(zhí)行第一種操作;在執(zhí)行第一種操作的同時,執(zhí)行對鏈接表數(shù)據(jù)結(jié)構(gòu)的非同步遍歷,其中非同步遍歷包括執(zhí)行對元素的指針部分的讀操作,該讀操作按原子操作執(zhí)行。
21.權(quán)利要求20的計算機可讀介質(zhì),其中的第一種操作是對鏈接表數(shù)據(jù)結(jié)構(gòu)的非同步遍歷。
22.權(quán)利要求20的計算機實現(xiàn)的方法,其中的第一種操作是對鏈接表數(shù)據(jù)結(jié)構(gòu)的進一步同步修改。
23.一種體現(xiàn)為載波并代表一個指令序列的計算機數(shù)據(jù)信號,該指令序列被處理器執(zhí)行時,使處理器執(zhí)行以下步驟通過插入或刪除第二個元素來修改鏈接表數(shù)據(jù)結(jié)構(gòu),其中鏈接表數(shù)據(jù)結(jié)構(gòu)包括含有數(shù)據(jù)部分和指針部分的第一個元素;更新第一個元素的指針部分以反映對鏈接表數(shù)據(jù)結(jié)構(gòu)的修改,更新步驟包含一個原子操作;在對鏈接表數(shù)據(jù)結(jié)構(gòu)修改的同時,執(zhí)行對鏈接表數(shù)據(jù)結(jié)構(gòu)的非同步遍歷。
24.一種體現(xiàn)為載波并代表一個指令序列的計算機數(shù)據(jù)信號,該指令序列被處理器執(zhí)行時,使處理器執(zhí)行以下步驟對包含一個由數(shù)據(jù)和指針部分組成的元素的鏈接表數(shù)據(jù)結(jié)構(gòu)執(zhí)行第一種操作;在執(zhí)行第一種操作的同時,執(zhí)行對鏈接表數(shù)據(jù)結(jié)構(gòu)的非同步遍歷,其中非同步遍歷包括執(zhí)行對元素的指針部分的讀操作,該讀操作按原子操作執(zhí)行。
全文摘要
本文介紹一種管理鏈接表數(shù)據(jù)結(jié)構(gòu)(20)的方法。鏈接表數(shù)據(jù)結(jié)構(gòu)(20)有許多元素(22a、22b…22n),每個元素包括數(shù)據(jù)項(24a、24b… 24n)和順序指向下一個元素的指針(26a、26b…26n)。該方法允許通過插入或從中刪除元素來修改鏈接表數(shù)據(jù)結(jié)構(gòu)(20),并允許同時執(zhí)行對鏈接表數(shù)據(jù)結(jié)構(gòu)(20)的非同步遍歷操作。具體來說,該方法要求用原子操作(36)來修改鏈接表數(shù)據(jù)結(jié)構(gòu)(20)內(nèi)元素(24a、24b…24n)的指針(26a、26b…26n),以反映對鏈接表數(shù)據(jù)結(jié)構(gòu)(20)的任何修改。采用原子操作(36)來更新指針(26a、26b…26n),能保障非同步遍歷操作(38)檢查的是有效的數(shù)據(jù)路徑。
文檔編號G06F9/46GK1236453SQ98801186
公開日1999年11月24日 申請日期1998年6月30日 優(yōu)先權(quán)日1997年6月30日
發(fā)明者K·L·克魯格 申請人:太陽微系統(tǒng)有限公司