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

用于對數(shù)據(jù)結構的實例進行操作的方法和系統(tǒng)的制作方法

文檔序號:6466680閱讀:210來源:國知局

專利名稱::用于對數(shù)據(jù)結構的實例進行操作的方法和系統(tǒng)的制作方法
技術領域
:本發(fā)明涉及對多線程軟件的開發(fā)和處理,尤其涉及對數(shù)據(jù)結構的實例進行操作的方法和系統(tǒng)。
背景技術
:在過去的二十多年的時間里,隨著微電子技術的迅猛發(fā)展,計算機系統(tǒng)的性能和容量發(fā)生了爆炸性的增長。較多的計算資源意味著可以按并行的方式來同時執(zhí)行更多的操作。因此,并行的體系結構以及并行的軟件開發(fā),在信息處理中發(fā)揮越來越核心的作用。一個進程是在計算機系統(tǒng)上運行的一個程序或程序的一部分,或者是被某個程序執(zhí)行的步驟的相關序列。每個進程包括一個或多個線程。線程是一組指令的集合,或者是程序的特殊段,它可以在程序里獨立執(zhí)行。所以線程基本上是輕量級的進程,它負責在單個程序里執(zhí)行任務。通常由操作系統(tǒng)負責多個線程的調度和執(zhí)行。數(shù)據(jù)結構是一種數(shù)據(jù)的組織方案,例如記錄或數(shù)組,籍此有助于解釋數(shù)據(jù)或執(zhí)行對數(shù)據(jù)的操作。一數(shù)據(jù)結構的一實例,是指一種數(shù)據(jù)結構的具體實施對象。對凄大據(jù)結構的實例的處理,在進程或程序中經(jīng)常采用多線程處理,這可以充分利用系統(tǒng)資源,縮短程序響應時間,改善用戶體驗;如果程序中只使用單線程,那么程序的速度和響應無疑會大打折扣。多線程軟件使得多個線程可以并行的工作以完成多項任務,以提高系統(tǒng)的效率。線程是在同一時間需要完成多項任務的時候被實現(xiàn)的。但是,程序采用了多線程后,就必須認真考慮線程調度的問題。如果調度不當,要么造成程序出錯,要么造成荒謬的結果。眾所周知,與順序執(zhí)行的軟件相比,多線程軟件更加難以開發(fā)。由于多個線程之間可能存在的未預料到的沖突,具有并行體系結構的程序經(jīng)常包含程序缺陷。尤其是,如果沒有合適的同步機制,并行地訪問共享的數(shù)據(jù)結構將產(chǎn)生無法預料的錯誤。到目前為止,人們通常使用兩種方法來開發(fā)多線程軟件?;阪i(lock-based)的方式和無鎖(lock-free)的方式。對于多線程編程和多線程并行處理,基于鎖的方式是一種傳統(tǒng)的方法。該6方法利用加鎖來實現(xiàn)同步,以便對共享資源進行訪問。常用的同步原語(Synchronizationprimitives)如互斥體(mutexes)、旗語(semaphores)和關4建部件(criticalsections)。這些同步原語通常#1用于確保某些特定的部分代碼不會被同時執(zhí)行,否則將會破壞共享存儲結構。如果一個線程試圖獲取已經(jīng)被其它線程持有的鎖,則該一個線程將會被阻塞(block)直至該鎖被釋放為止。例如,在程序中,很多任務必須以確定的先后秩序執(zhí)行,對于兩個線程必須以先后秩序執(zhí)行的情況,可以用線程鎖來處理。線程鎖的大致思想是如果線程A和線程B會分別執(zhí)行實例的兩個函數(shù)a和b,如果A必須在B之前運行,那么可以在B進入b函數(shù)時讓B進入waitset,直到A執(zhí)行完a函數(shù)再把B從waitset中激活。這樣就保證了B必定在A之后運行,無論在之前它們的時間先后順序是怎樣的。互斥鎖(mutual-exclusionlocks)是目前常用的一種機制,用于進程或線程間的同步。其簡單并且容易實施。在高性能應用的并行計算環(huán)境里,這種簡易性則無法實現(xiàn)。當使用大量的鎖并且有許多線程并行執(zhí)行時,互斥鎖的可擴展性不佳。對于共享數(shù)據(jù)的并行訪問,需要復雜的細粒度的鎖策略,來將沒有沖突的操作設置為并行執(zhí)行。要保持良好的性能,這種策略很難設計,并且可能隱含問題,如死鎖或優(yōu)先級倒置。由于多種已知的原因,使得不希望線程:帔阻塞。一個明顯的原因是,如果一個線程被阻塞,則該線程在該期間無法完成任何任務。如果被阻塞的線程正在執(zhí)行一個高優(yōu)先級的任務,或者正在執(zhí)行一個實時的任務,就更加不希望該線程被阻塞。此外,多個鎖之間的某些沖突還可能導致一些錯誤的狀態(tài),如死鎖、活鎖或優(yōu)先級倒置(deadlock,live-lock,orpriorityinversion)。使用鎖還涉及在粗粒度的鎖和細粒度的鎖兩個方面之間進行折衷,粗粒度的鎖可能會顯著減少并行執(zhí)行的機會,細粒度的鎖需要更加細致的設計并且容易程序缺陷。不加鎖(lock-free)的方式是多線程軟件的開發(fā)和處理的另一種選擇。Lock-free和wait-free才幾制,主要4吏用由硬/f牛才是供的原子原語。大部分通用的硬件均提供這種原子原語指令集。"比較并交換(compareandswap,即CAS)"是最常用的原子原語之一。該原子原語使用三個參數(shù)(argument):—個內存地址、一個原始值(已有值)和一個新的值。如果上述內存地址存有一個原始值,則用新的值替換該原始值,否則存儲的值不變。重要的是,硬件確保"比較并交換"操作被原子地執(zhí)行。該操作的成功才丸行將返回一個值1或0,并^皮匯報給程序。這允許一個算法從內存中讀取數(shù)據(jù),修改該數(shù)據(jù),然后只有在沒有其它線程同時修改該內存的數(shù)據(jù)的情況下寫回修改后的數(shù)據(jù)。上述基于鎖的方法和不加鎖的方法,各有如下優(yōu)缺點?;阪i的方法(Lock-basedapproach)無鎖的方法(Lock-freeapproach)可擴展性不好。在進入和離開程序關鍵部分時,線程需要等待。好。有多個線程在執(zhí)行。魯棒性不好。一個線程的異常退出可能會阻礙其它線程。例如,死鎖。好。即使一個線程死掉,其它線程仍然得以執(zhí)行。容易開發(fā)性相對容易。線程的算法(機制)與順序執(zhí)行的線程相似。獲得鎖的線程可以阻塞其它未得到鎖的線程的執(zhí)行。非常困難。線程的算法(機制)與順序執(zhí)行的線程經(jīng)常完全不同。并且,有些操作效率非常低。經(jīng)常需要i正明線程之間的復雜邏輯的正確性。此外,F(xiàn)raser提到了一種基于MCAS和W-Locks的混合機制(見Practicallock-freedom,byKeirFraser,2004)。運行時的性能反饋被用于根據(jù)當前的竟爭水平動態(tài)選擇使用哪種機制。該機制中使用了運行時概要和同步原語之間的切換。
發(fā)明內容鑒于已有技術的不足,本發(fā)明提供了一種新的對數(shù)據(jù)結構的實例進行操作的方法和系統(tǒng)。對數(shù)據(jù)結構的實例進行操作的方法包括為至少一可無鎖的操作請求獲取一第一鎖的弱鎖,以便對該數(shù)據(jù)結構的所述實例進行4喿作;響應于該至少一可無鎖的操作完成獲取弱鎖,執(zhí)行該至少一可無鎖的操作對該數(shù)據(jù)結構的實例進行的操作;為一不應無鎖的操作請求獲取所述第一鎖的強鎖,以便對該數(shù)據(jù)結構的所述實例進行操作;以及響應于該不應無鎖的操作完成獲取該強鎖,執(zhí)行該不應無鎖的操作對該數(shù)據(jù)結構的實例進行的操作。本發(fā)明還提供了一種對數(shù)據(jù)結構的實例進行操作的系統(tǒng)。該系統(tǒng)包括弱8鎖裝置,用于為至少一可無鎖的操作請求獲取一第一鎖的弱鎖,以便對該數(shù)據(jù)結構的所述實例進行操作;可無鎖的操作執(zhí)行裝置,用于響應于該至少一可無鎖的操作完成獲取弱鎖,執(zhí)行該至少一可無鎖的操作對該數(shù)據(jù)結構的實例進行的操作;強鎖裝置,用于為一不應無鎖的操作請求獲取所述第一鎖的強鎖,以便對該數(shù)據(jù)結構的所述實例進行操作;以及不應無鎖的操作執(zhí)行裝置,用于響應于該不應無鎖的操作完成獲取該強鎖,執(zhí)行該不應無鎖的操作對該數(shù)據(jù)結構的實例進行的操作。與已有技術相比,根據(jù)本發(fā)明的上述方法和系統(tǒng)可以提高對數(shù)據(jù)結構的實例進行操作的效率。圖la示意性地示出了已有技術中基于鎖的方法的機制。圖lb示意性地示出了已有技術中無鎖實現(xiàn)的方法。圖2a示意性地示出了已有技術中基于鎖的方法的異常退出的情況。圖2b示意性地示出了已有技術中無鎖實現(xiàn)的方法的異常退出的情況。圖3示出了根據(jù)本發(fā)明一實施例的用于數(shù)據(jù)結構的實例進行操作的方法。圖4a和圖4b示出了根據(jù)本發(fā)明一實施例的操作執(zhí)行情況。圖5a和圖5b示出了與本發(fā)明實施例相對比根據(jù)已有技術的一實施例的操作執(zhí)行情況。具體實施例方式數(shù)據(jù)結構是一種數(shù)據(jù)的組織方案,例如記錄或數(shù)組,籍此有助于解釋數(shù)據(jù)或執(zhí)行對數(shù)據(jù)的操作。一數(shù)據(jù)結構的一實例,是指一種數(shù)據(jù)結構的具體實施對象。對于涉及多線程處理的一數(shù)據(jù)結構或數(shù)據(jù)結構實例,為了確保在多線程之間該數(shù)據(jù)結構的一致性(Coherence)或對該數(shù)據(jù)結構實例操作的正確性,對該數(shù)據(jù)結構加鎖是一種常用的方法。本發(fā)明也采用加鎖的方式來確保對數(shù)據(jù)結構操作的正確性。本發(fā)明所利用的鎖的原理本身或用鎖來保護數(shù)據(jù)結構的鎖機制本身,與已有技術相比是相似的。例如,對于需要獲取鎖才能處理的數(shù)據(jù)結構實例,只有一操作獲取鎖之后才能進行處理。對于何種操作進行加鎖,附加何種類型的鎖,本發(fā)明的一實施例在這兩方面與已有技術是不同的。此外,根據(jù)本發(fā)明的另一實施例,在獲取不同類型的鎖之后,持有鎖的操作所允許執(zhí)行的操作與已有技術相比是不同的。以下結合附圖詳細說明。不同的已有技術在何種情況下需要鎖,采取了不同的策略。例如,基于鎖的方法,所有的進程或操作都用鎖來保護。這樣,能夠確保所涉及的數(shù)據(jù)結構的安全性,但是,可擴展性較低。如圖la和圖2a所示。圖la示意性地示出了已有技術中基于鎖的方法的機制。其中,有四個線程al、a2、a3和a4需要執(zhí)行。如果線程al獲取了鎖并開始執(zhí)行,則其它三個線程被阻塞。在線程al完成執(zhí)行后,釋放所持有的鎖。這時,其它三個線程嘗試獲取鎖。與線程al類似,獲取鎖的進程執(zhí)行,其它線程被阻塞。這樣,在進入和離開程序關^l建部分時,多個線程需要等待。線程的算法或機制與順序執(zhí)行的線程相似。獲得鎖的線程可以阻塞其它未得到鎖的線程的執(zhí)行。但是,如圖2a所示,這種基于鎖的方式的魯棒性確不好。圖2a示意性地示出了已有技術中基于鎖的方法的異常退出的情況。其中,一個持有鎖的線程,如線程la,異常退出可能會阻礙其它線程。例如,線程la發(fā)生死鎖,其持有的鎖未被釋放,則其它等待的線程就會長時間處于不必要的等待狀態(tài)。根據(jù)已有技術對于鎖的一個具體應用如下例l。例如,一個傳統(tǒng)的堆棧具有如下的布局。對于已有技術的多線程或多操作的并行處理,這樣的堆棧是不安全的。例lStackinstance:__top:Node_size:int為確保對該堆棧操作的正確性,根據(jù)已有技術可以采用如下例2加鎖(lock:LockType)的方式來進行。例如,在堆棧的實例上加鎖。這樣,在對該堆棧進行操作前,首先請求獲取該鎖。獲取鎖的操作或線程,可以對該堆棧進行操作,并在操作完成后釋放鎖。這時,其它需要對該線程進行的操作被阻塞,這些被阻塞的線程可以反復嘗試獲取鎖,直至得到鎖為止。例2Stackinstance:__lock丄ockType_top:Node_size:int對于每個堆棧的操作,如push()、pop()或clone()等等,可以調用lock.lock()來請求獲取鎖,調用lock.unlock()來釋^:鎖。這樣,可以確保每次只有一個線程對堆棧進行操作。在根據(jù)本發(fā)明的一實施例中,如下例3所示,可以采用與已有技術中設置讀鎖和寫鎖類似的方法,將該鎖設置為包括弱鎖rLock:WeakLock和強鎖wLock:StrongLock。其中,可以允許有多個操作/線程同時分別持有該鎖的多個弱鎖,但是只允許一個操作/線程持有該鎖的強鎖,不允許該鎖的弱鎖和強鎖同時被持有。持有弱鎖或強鎖的操作可以對該堆棧進行操作,操作完成之后,釋放其持有的鎖。此外,持有所述該弱鎖的多個操作可以并行執(zhí)行,如圖lb、圖2b和圖4a所示。而持有強鎖的一操作對該堆棧進行操作時,其它需要對該堆棧進行的操作將被阻塞。這些被阻塞的操作可以嘗試獲取鎖,如周期性地進行嘗試。持有弱鎖的操作對該堆棧進行搡作時,其它請求獲取強鎖的搡作將被阻塞,而其它請求獲取弱鎖的操作可以繼續(xù)獲得弱鎖。同樣,這些被阻塞的操作可以嘗試獲取強鎖,如周期性地進行嘗試。例3<table>tableseeoriginaldocumentpage11</column></row><table>圖lb示意性地示出了已有技術中無鎖(Lock-free)實現(xiàn)的方法。無鎖的方法的出發(fā)點是為了克服基于鎖的方法擴展性不好的缺陷。如圖lb所示,在無鎖的方法中,多個線程bl、b2、b3和b4可以并行執(zhí)行,從而提高進程或程序的執(zhí)行效率。無鎖方法不但可擴展性好,而且魯棒性也好,如圖2b所示。圖2b示意性地示出了已有技術中無鎖實現(xiàn)的方法的異常退出的情況。如圖2b所示,即使一個線程bl死掉,其它線程b2、b3和b4仍然得以執(zhí)行。但是,無鎖方法的開發(fā)卻非常困難。無鎖方法的線程的算法或執(zhí)行機制與順序執(zhí)行的線程經(jīng)常完全不同。因此,經(jīng)常需要證明無鎖線程之間的復雜邏輯的正確性。并且,有些操:作采用無鎖的方法,其執(zhí)行效率非常低。根據(jù)本發(fā)明的一實施例,將無鎖的并行執(zhí)行機制和加鎖順序執(zhí)行機制結合來進行多線程軟件的處理。本領域的技術人員可以理解,可以在硬件上、操作系統(tǒng)中或應用程序中設置鎖的保護范圍或作用域。如已有技術中,通過設置讀鎖rLock:ReadLock和寫鎖wLock:WrUeLock的保護范圍或作用域,4吏得持有讀鎖的操作可以并行執(zhí)行讀取操作,而持有寫鎖的操作可以排他性地執(zhí)行其操作。本領域的技術人員可以理解,可以采取與已有技術類似的方法,在硬件上、操作系統(tǒng)中或應用程序中設置弱鎖和強鎖的保護范圍或作用域,使得持有弱鎖的多個操作可以并行執(zhí)行其操作,而持有強鎖的一操作排他性地執(zhí)行其操作。如在上述例3中,通過設置弱鎖wLock:WeakLock和強鎖sLock:StrongLock的保護范圍或作用域,使得持有弱鎖的多個操作可以并行地執(zhí)行其操作,而持有強鎖一操作則排他性地執(zhí)行其操作。在這種情況下,多線程程序或進程的可擴展性、魯棒性或容易開發(fā)性,可以通過進一步的機制來確保。圖3示出了根據(jù)本發(fā)明一實施例的用于數(shù)據(jù)結構的實例進行操作的方法。在步驟S100,開始該方法。在步驟S110,將對it據(jù)結構的一實例的操作劃分為可無鎖'的才乘4乍(lock—freecapableoperation)和不應無4貞的才喿4乍(lock-freeincapableoperation)。如下文所述,可以采用多種方式將對凄t據(jù)結構的一實例的操作劃分為可無鎖的操作和不應無鎖的操作。本領域的技術人員可以理解,該步驟的實施可以由軟件的開發(fā)工具或程序的執(zhí)行環(huán)境來實施,而獨立于其它步驟S120-S160。此外,如上文所述可以程序之中,或程序的^l行環(huán)境中(如上文所述的在硬件上、操作系統(tǒng)中或應用程序中)設置鎖的作用方式。其中,允許有多個操作/線程同時分別持有第一鎖的多個弱鎖,只允許一個操作/線程持有第一鎖的強鎖,不允許第一鎖的弱鎖和強鎖同時^皮持有;其中,持有所述第一鎖的弱鎖的多個可無鎖的操作并行執(zhí)行。其中,一可無鎖的操作所執(zhí)行的操作可以包括寫操作。亦即,根據(jù)本發(fā)明的一實施例,允許有的可無鎖的操作只包括讀操作而有的可無鎖的操作包括寫操作。另,在本發(fā)明的上述描述中使用的術語"第一鎖"的實質含義是指一鎖,使用"第一"是為了指代的需要。如文中使用"該第一鎖"指代前述的"第一鎖",以避免在相應的上下文中使用"該鎖"時不易指明是指代前述的"一鎖"還是指代前述的"弱鎖"等。在步驟S120,為至少一可無鎖的操作請求獲取一第一鎖的弱鎖,以便對該數(shù)據(jù)結構的所述實例進行操作。如果其它操作已經(jīng)持有該第一鎖的弱鎖,則允許該至少一可無鎖的操作獲取該第一鎖的另一弱鎖。如果其它操作已經(jīng)持有該第一鎖的強鎖,則該至少一可無鎖的操作將被阻塞,直至該強鎖被釋放為止。本領域的技術人員可以理解,根據(jù)本發(fā)明實施例的鎖的使用方法,還可以與其它鎖的分配機制相結合,如與根據(jù)優(yōu)先級來分配鎖的機制相結合,等等。在步驟S130,響應于該至少一可無鎖的操作完成獲取弱鎖,執(zhí)行該可無鎖的操作對該數(shù)據(jù)結構的實例進行的操作。根據(jù)本發(fā)明的一實施例,允許有的可無鎖的操作只進行讀操作而有的可無鎖的操作進行寫操作。根據(jù)本發(fā)明的另一12實施例該方法還可以進一步包括響應于該可無鎖的才喿作完成對該數(shù)據(jù)結構的實例的纟喿作,釋放該弱鎖。在步驟S140,為一不應無鎖的操作請求獲取所述第一鎖的強鎖,以便對該數(shù)據(jù)結構的所述實例進行操作。如果其它操作已經(jīng)持有該第一鎖的弱鎖或強鎖,則該不應無鎖的操作將被阻塞,直至該弱鎖或強鎖被釋放為止。在步驟150,響應于該不應無鎖的操作完成獲取該強鎖,執(zhí)行該不應無鎖的操作對該數(shù)據(jù)結構的實例進行的操作。根據(jù)本發(fā)明的另一實施例該方法還可以進一步包括響應于該不能無鎖的操作完成對該數(shù)據(jù)結構的實例的操作,釋放該強鎖。在步驟160,該方法結束。本領域的技術人員可以理解,步驟S120-S160本身已經(jīng)構成了一個完整的技術方案,而直接在相應的具有上述強鎖和弱鎖的運行環(huán)境或工具軟件上實施。一數(shù)據(jù)結構的一實例,是指一種數(shù)據(jù)結構的具體實施對象。鏈表是一種常用的數(shù)據(jù)結構,其它常用的數(shù)據(jù)結構還包括順序表、樹、圖、跳表等等。"鏈表"是一個鏈表結構,鏈表中的每個節(jié)點都含有指向下一個節(jié)點的指針。數(shù)據(jù)結構"鏈表"的操作通常有增加元素,刪除元素,查詢元素,遍歷元素,排序。在本發(fā)明的實施例中對一鏈表的實例list進行舉例說明,該list中包括多個元素。根據(jù)本發(fā)明的一實施例,可以使用強鎖和弱鎖來保護List類。通過設置弱鎖和強鎖的保護范圍或作用域,使得持有弱鎖的多個操作可以并行地執(zhí)行其操作,而持有強鎖一操作則排他性地執(zhí)行其操作。對于可無鎖的操:作add()和remove(),可以使用弱鎖以便多個可無鎖的操作可以并行執(zhí)行。對于不應無鎖的操作使用一強鎖,來排他性地訪問List,阻塞其它操作對于List的訪問。下面舉例說明可無鎖的操作和不應無鎖的操作。在下述實施例中,操作add是可無鎖的操作,操作remove是可無鎖的操作,而操作sort是不應無鎖的操作。操作add獲取針對List的弱鎖之后,操作remove依然可以獲取針對List的弱鎖。因此,操作add和操作remove可以并行執(zhí)行。操作sort不能與操作add或操作remove并行執(zhí)行。classIist{privateLockweaklock,stronglock;publicList(){WeakStrongLockwslock=newWeakStrongLock();weaklock=wslock.weaklock();stronglock=wslock.stronglock();義List類,然后privateLockweaklock,stronglock為針對該List類的操作定義一鎖。在該程序被初始化時將派生一鎖WeakStrongLockwslock=newWeakStrongLock(),該鎖包括一個或多個弱鎖weaklock=wslock.weaklock()和一個強鎖stronglock=wslock.stronglock()。publicvoidadd(Objectobj){try{weaklock.lock();〃dothelock-freeaddJfinally{weaklock.unlock();在上述程序中,將對象obj加入List的操作add,可以由一個或多個原子操作組成。因此,操作add是可無鎖的操作。在執(zhí)行時,首先使用weaklock.lock()請求弱鎖。獲取弱鎖之后,執(zhí)行可無鎖的操作add,將對象obj加入List;執(zhí)行完成后,weaklock,unlock()釋放弱鎖。如果該鎖的強鎖被其它的操作或線程持有,add操作將被阻塞。然后,在該鎖的強鎖被釋放后,該add搡作才能獲取所請求的弱鎖。publicvoidremove(Objectobj){try{weaklock.lock();〃dothelock-freeremove}fmally{weaklock.unlock();在上述程序中,將對象obj從List刪除的操作remove,可以由一個或多個原子操作組成。因此,操作remove是可無鎖的操作。在執(zhí)行時,首先使用weaklock.lock()請求弱鎖,獲取弱鎖之后,執(zhí)行可無鎖的l喿作remove;執(zhí)行完成后,weaklock.unlock()釋放弱鎖。如果該鎖的強鎖;故其它的操作或線程持有,則該remove操作將被阻塞。然后,在該鎖的強鎖被釋放后,該remove操作才能獲取所請求的弱鎖。但是,如果該鎖的一弱鎖被其它的操作或線程持有,則該14remove操作可以獲取該鎖的另一弱鎖。publicvoidsort(){try{stronglock.lock();〃dosorting}fmally{stronglock.unlock();在上述程序中,將類List的對象obj排序的操作sort,不能分解為一個或多個原子操作。其所需的原子操作數(shù)量將隨著List中元素數(shù)量變化而變化。因此,操作sort是不應無鎖的操作。在執(zhí)行時,首先使用stronglock.lock()請求強鎖,獲取強鎖之后,執(zhí)行不應無鎖的操作sort;執(zhí)行完成后,stronglock.unlock()釋放強鎖。如果該鎖的強鎖或弱鎖被其它的操作或線程持有,則該sort操作將被阻塞。然后,在該鎖的強鎖或弱鎖其它操作或線程被釋放后,該sort操作才能獲取所請求的強鎖。上述圖3的方法中,步驟S110將對數(shù)據(jù)結構的實例的操作劃分為可無鎖的操作和不應無鎖的操作可以采用多種方法來進行。才艮據(jù)本發(fā)明的一實施例,如果一個操作的無鎖算法需要的原子操作的數(shù)目是一個常數(shù),則將該纟喿作劃分為可無鎖的操作;如果一個^喿作的無鎖算法需要的原子操作的數(shù)目不是一個常數(shù),則將該操作劃分為不應無鎖的操作。在本發(fā)明的進一步實施例中,如果一個操作的無鎖算法需要的原子操作的數(shù)目是一個常數(shù),并且該常數(shù)與數(shù)據(jù)結構的實例中元素的數(shù)目不相關,則將該操作劃分為可無鎖的操作;如果一個操作的無鎖算法需要的原子操作的數(shù)目不是一個常數(shù),該數(shù)目與數(shù)據(jù)結構的實例中元素的數(shù)目相關,則將該操作劃分為不應無鎖的操作。其中,可無鎖的操作對數(shù)據(jù)結構的實例的才喿作可以分解為由預定數(shù)量的原子操作組成的操作。優(yōu)選地,可無鎖的操作對數(shù)據(jù)結構的實例的操作可以分解為由l-5個原子操作組成的操作。其中,不應無鎖的操作對數(shù)據(jù)結構的實例的一操作,不能分解為由一個或多個原子操作組成的操作。如上述處理List的例子中,元素的添加#:作只需要一個原子操作,而元素的刪除操作只需要一個或兩個原子操作。因此,這兩種操作可以劃分為可無鎖的操作。而List的排序操作和數(shù)據(jù)結構中的元素數(shù)目相關,因而屬于不應無鎖才喿作。再如,在堆?;虺鰲?pushorpopinstack)可以劃分為可無鎖的搮:作;而為圖形加邊框的操作應劃分為不應無鎖操:作。在本發(fā)明之前的已有技術中,對于基于鎖的方法都用鎖保護。這樣數(shù)據(jù)結構是安全的,但是可擴展性較低。而如果數(shù)據(jù)結構中的部分操作是無鎖而且是多線程安全的,例如List的add()和remove()方法。而其他操:作不是多線程安全的,如List的sort()方法。這樣數(shù)據(jù)結構的使用將相當受限。程序員使用非線程安全的方法需要非常小心,必須等待直到一個安全的時間,并在這個安全的時間之內調用非線程安全的方法。這種方式需要程序員過多的介入,不管是開發(fā)效率還是執(zhí)行效率都受到影響。根據(jù)本發(fā)明的另一實施例,如果一個操作需要修改的內存單元的數(shù)目是一個常數(shù),則將該操作劃分為可無鎖的操作;如果一個操作的需要修改的內存單元的數(shù)目不是常數(shù),則將該操作劃分為不應無鎖操作。根據(jù)本發(fā)明的進一步實施例,可無鎖的操作需要修改的內存單元的數(shù)目與數(shù)據(jù)結構中元素的數(shù)目不相關,不應無鎖才喿作需要修改的內存單元的數(shù)目與數(shù)據(jù)結構的實例中元素數(shù)目相關。優(yōu)選地,可無鎖的操作的內存單元訪問少于一個字或者一個雙字;不應無鎖操作的內存單元訪問多于一個雙字或兩個不連續(xù)的字。對于上述處理List的例子,元素的添加操作只需要修改原List中的一個指針變量,List的刪除操作只需要修改List中一個或兩個指針變量。因此,這兩種搡作被劃分為可無鎖的操作。而List的排序操作需要修改的指針數(shù)量正比于List中的元素數(shù)目,因而屬于不應無鎖搡作。根據(jù)本發(fā)明的另一實施例,在單線程執(zhí)行時,對于同一個數(shù)據(jù)結構實例的每一個操作,如果以無鎖的方式實現(xiàn)時的執(zhí)行效率,與基于鎖的方式實現(xiàn)時的執(zhí)行效率相差小于預定的值,則將該操作劃分為可無鎖的操作;否則,將該操作劃分為不應無鎖的操作。優(yōu)選地,在單線程執(zhí)行時,如果對于同一個數(shù)據(jù)結構實例的每一個#:作,以無鎖的方式實現(xiàn)時的執(zhí)行效率,與基于鎖的方式實現(xiàn)時的執(zhí)行效率相差小于1.5倍,則將該操作劃分為可無鎖的操作;否則,將該操作劃分為不應無鎖的操作。對于同一個凝:據(jù)結構的每一個操作都可以實現(xiàn)兩個版本,一個為無鎖實現(xiàn),令一個為基于鎖的實現(xiàn)。在上述處理List的例子中,元素的添加操作和刪除操作的效率和基于鎖的實現(xiàn)差不多。所以劃分為可無鎖操作。而List的排序操作的無鎖實現(xiàn)相當?shù)托?,所以劃分為不應無鎖操作。此外,為圖形加邊框的操作,如果采用無鎖的方式,效率也非常低。才艮據(jù)本發(fā)明的另一實施例,在圖3所示的方法中,允許有多個操作/線程同時分別持有第一鎖的多個弱鎖,只允許一個操作/線程持有第一鎖的強鎖,不允許第一鎖的弱鎖和強鎖同時4皮持有;其中,持有所述第一鎖的弱鎖的多個可無鎖的操作并行執(zhí)行。其中,圖3所示的方法進一步包括響應于該可無鎖的操作完成對該數(shù)據(jù)結構的實例的操作,釋放該弱鎖;響應于該不能無鎖的操作完成對該數(shù)據(jù)結構的實例的操作,釋放該強鎖。圖4a和圖4b示出了根據(jù)本發(fā)明一實施例的操作執(zhí)行情況。在圖4a中,兩個或多個可無鎖的才喿作被并行執(zhí)行,此時,一個或多個不應無鎖的操作被阻塞。如圖4a中所示的操作add()和remove()等操作被并行執(zhí)行,此時不應無鎖的操作size()等被阻塞。在圖4b中,一個或多個不應無鎖的操作被順序執(zhí)行,此時,其它不應無鎖的操作以及可無鎖的操作被阻塞。如圖4b中所示的操作size()等操作被順序執(zhí)行,此時其他不應無鎖的操作以及可無鎖的操作add()和remove()等被阻塞。在本發(fā)明之前的已有技術中,無鎖的方法具有多種優(yōu)點,但是卻難以開發(fā)。因此,無鎖機制經(jīng)常被用于簡單的操作。例如,參見以下采用已有技術對于一數(shù)據(jù)結構的實例-鏈表List類一的操作。classList(publicvoidadd(Objectobj);publicvoidremove(Objectobj);publicvoidsort();}將無鎖機制用于add()和remove()方法并不難。add()用于增加一元素,publicvoidadd(Objectobj)表示為List類增加一對象元素,并且該List的add可以被其它線程的操作訪問。remove()用于刪除一元素,publicvoidremove(Objectobj)表示為List類刪除一對象元素,并且該List的remove可以被其它線程的操作訪問。sort()用于對元素進行排序操作,publicvoidsort()表示將List的對象元素進行排序,并且該List的sort可以被其它線程的操作訪問。但是,將無鎖機制用于sort()方法就很難。原因數(shù)據(jù)結構實例List—般包括多個元素。這樣,在執(zhí)行List元素排序操作的過程中,如果其它線程對List的對象元素進行增加或刪除操作,將引起沖突。因此,自然的方法是使用鎖來保護sort()。這樣,重寫后的代碼如下。classList{publicvoidadd(Objectobj);publicvoidremove(Objectobj);publicsynchronizedvoidsort();publicsynchronizedvoidsort()表示在sort執(zhí)行時需要力口鎖和釋放鎖(lockunlockpair)的操作。在此,將sort()修改為同步的方法,在執(zhí)行時,首先嘗試獲取一鎖;在獲取鎖之后,執(zhí)行排序操作;在排序操作完成后,釋放該鎖。這樣,在任何時候只有一個線程被允許進入該方法調用sort。但是,上述方法并非正確。如果一個線程進入sort()方法,這時另一個線程使用remove()方法來刪除一個節(jié)點,sort方法將可能失效。因為,add()方法可能在某個時刻與sort()方法交叉。并且,盡管sort()方法加鎖;但是,add是無鎖的。這就允許add在任何時刻都可以執(zhí)行,從而由可能產(chǎn)生沖突。因此,安全的版本將采用如下方式,其中對所有操作采取同步(或加鎖)的方式進行。classList{publicsynchronizedvoidadd(Objectobj);publicsynchronizedvoidremove(Objectobj);publicsynchronizedvoidsort();}publicsynchronizedvoidadd(Objectobj)表示在add執(zhí)行時需要力口鎖和釋放鎖(lockunlockpair)的操作。publicsynchronizedvoidremove(Objectobj)表示在remove執(zhí)行時需要加鎖和釋放鎖(lockunlockpair)的操作?,F(xiàn)在,得到了安全的List。但是,其中的全部三個方法都使用鎖來保護。這樣,如圖1和圖2所示,在任何時刻,只允許一個線程進入上述三個方法之一。在圖1中,簡單操作獲取一個互斥鎖,并阻止其它操作獲取該互斥鎖。在圖2中,復雜操作獲取一個互斥鎖,并阻止其它操作獲取該互斥鎖。這種方式妨礙了軟件并行執(zhí)行。圖5a和圖5b示出了與本發(fā)明實施例相對比根據(jù)已有技術的一實施例的操作執(zhí)行情況。該已有技術采用加鎖操作。在圖5a中,由于add()需要執(zhí)行寫操作,而并非單純的讀操作,因此,得到鎖的操作add()被執(zhí)行時,其它的操作將被阻塞。在圖5b中,由于size()需要執(zhí)行寫操作,而并非單純的讀操作,因此,得到鎖的操作size()被執(zhí)行時,其它的操作將被阻塞。與上述一種對數(shù)據(jù)結構的實例進行操作的方法相對應,本發(fā)明還提供了一種對數(shù)據(jù)結構的實例進行操作的系統(tǒng),包括弱鎖裝置,用于為至少一可無鎖的操作請求獲取一第一鎖的弱鎖,以便對該數(shù)據(jù)結構的所述實例進行操作;可18無鎖的操作執(zhí)行裝置,用于響應于該至少一可無鎖的操作完成獲取弱鎖,執(zhí)行該至少一可無鎖的操作對該數(shù)據(jù)結構的實例進行的操作;強鎖裝置,用于為一不應無鎖的操作請求獲取所述第一鎖的強鎖,以便對該數(shù)據(jù)結構的所述實例進行操作;以及不應無鎖的操作執(zhí)行裝置,用于響應于該不應無鎖的操作完成獲取該強鎖,執(zhí)行該不應無鎖的操作對該數(shù)據(jù)結構的實例進行的操作。其中,弱鎖裝置和強鎖裝置進一步配置為允許有多個操作同時分別持有該第一鎖的多個弱鎖,只允許一個^J喿作持有該第一鎖的強鎖,不允許該第一鎖的弱鎖和強鎖同時被持有;可無鎖的操作執(zhí)行裝置配置為允許持有該第一鎖的弱鎖的多個可無鎖的操作并行執(zhí)行。其中,上述系統(tǒng)進一步包括阻塞裝置,該阻塞裝置配置為響應于執(zhí)行該不應無鎖的操作,阻塞請求該第一鎖的強鎖的操作;響應于執(zhí)行該不應無鎖的^操作,阻塞請求該第一鎖的弱鎖的操作或其它請求該第一鎖的強鎖的才喿作。其中,所述弱鎖裝置進一步配置為響應于該可無鎖的操:作完成對該數(shù)據(jù)結構的實例的操作,釋放該弱鎖;所述強鎖裝置進一步配置為響應于該不能無鎖的操作完成對該數(shù)據(jù)結構的實例的操作,釋放該強鎖。其中,可無鎖的操作所執(zhí)行的操作可以包括寫操作。其中,上述系統(tǒng)進一步包括操作劃分裝置,用于將對數(shù)據(jù)結構的一實例的操作劃分為可無鎖的操作和不應無鎖的操作。操作劃分裝置可以進一步配置為使用根據(jù)上文所述的多種方法的一種或多種,將對數(shù)據(jù)結構的一實例的操作劃分為可無鎖的操作和不應無鎖的操作。與已有技術相比,本發(fā)明將基于鎖的方法和無鎖的方法的并行處理進行整合。如上文所述,無鎖的代碼并行執(zhí)行可擴展性好,但是難以編程。與此相反,基于鎖的方法可擴展性差,但是卻容易理解和編程。當多個可無鎖的操作在多個線程中并行執(zhí)行時,可無鎖的操作能夠確保原子操作特性和共享變量的一致狀態(tài)。當一個不應無鎖的操作與其它不應無鎖操作或可無鎖操作需要執(zhí)行時,用一個強鎖來確保原子操作特性和共享變量的一致狀態(tài)。根據(jù)本發(fā)明的一個實施例,當只有簡單的方法而沒有復雜操作執(zhí)行時,可無鎖操作就可以并行執(zhí)行??梢葬槍θ繑?shù)據(jù)結構安全地并行執(zhí)行操作。當復雜方法執(zhí)行時,仍然可以利用強鎖來針對全部數(shù)據(jù)結構安全地執(zhí)行線程??蔁o鎖操作不會受到不必要的阻止。本發(fā)明還提供了一種存儲介質或信號載體,其中包括用于執(zhí)行根據(jù)本發(fā)明的方法的指令。以上結合優(yōu)選法方案對本發(fā)明進行了詳細的描述,但是可以理解,以上實施例僅用于說明而非限定本發(fā)明。本領域的技術人員可以對本發(fā)明的所示方案進行修改而不脫離本發(fā)明的范圍和精神。權利要求1.一種對數(shù)據(jù)結構的實例進行操作的方法,包括為至少一可無鎖的操作請求獲取一第一鎖的弱鎖,以便對該數(shù)據(jù)結構的所述實例進行操作;響應于該至少一可無鎖的操作完成獲取弱鎖,執(zhí)行該至少一可無鎖的操作對該數(shù)據(jù)結構的實例進行的操作;為一不應無鎖的操作請求獲取所述第一鎖的強鎖,以便對該數(shù)據(jù)結構的所述實例進行操作;以及響應于該不應無鎖的操作完成獲取該強鎖,執(zhí)行該不應無鎖的操作對該數(shù)據(jù)結構的實例進行的操作。2.根據(jù)權利要求l所述的方法,其中,允許有多個操作同時分別持有該第一鎖的多個弱鎖,只允許一個操作持有該第一鎖的強鎖,不允許該第一鎖的弱鎖和強鎖同時被持有;其中,持有該第一鎖的弱鎖的多個可無鎖的操作并行執(zhí)行。3.根據(jù)權利要求2所述的方法,其中進一步包括響應于執(zhí)行該不應無鎖的操作,阻塞請求該第一鎖的強鎖的操作;響應于執(zhí)行該不應無鎖的操作,阻塞請求該第一鎖的弱鎖的操作或其它請求該第一鎖的強鎖的操作。4.根據(jù)權利要求l所述的方法,其中進一步包括響應于該可無鎖的操作完成對該it據(jù)結構的實例的l喿作,釋^i亥弱鎖;響應于該不能無鎖的操作完成對該數(shù)據(jù)結構的實例的操作,釋放該強鎖。5.根據(jù)權利要求1所述的方法,其中可無鎖的操作所執(zhí)行的操作可以包括寫操作。6.根據(jù)權利要求l所述的方法,其中進一步包括將對數(shù)據(jù)結構的一實例的操作劃分為可無鎖的操作和不應無鎖的操作。7.根據(jù)權利要求1至6任一項所述的方法,其中,如果一個操作的無鎖算法需要的原子操作的數(shù)目是一個常數(shù),則將該操作劃分為可無鎖的操作;如果一個操作的無鎖算法需要的原子操作的數(shù)目不是一個常數(shù),則將該操作劃分為不應無鎖的操作。8.根據(jù)權利要求7所述的方法,其中,如果一個操作的無鎖算法需要的原子才喿作的數(shù)目是一個常數(shù),并且該常數(shù)與數(shù)據(jù)結構的實例中元素的數(shù)目不相關,則將該操作劃分為可無鎖的操作;如果一個操作的無鎖算法需要的原子操作的數(shù)目不是一個常數(shù),該數(shù)目與數(shù)據(jù)結構的實例中元素的數(shù)目相關,則將該操作劃分為不應無鎖的操作。9.根據(jù)權利要求7所述的方法,其中,可無鎖的操作對數(shù)據(jù)結構的實例的操作可以分解為由預定數(shù)量的原子操作組成的操作。10.根據(jù)權利要求7所述的方法,其中,可無鎖的操作對數(shù)據(jù)結構的實例的操作可以分解為由l-5個原子操作組成的操作。11.根據(jù)權利要求1至6任一項所述的方法,其中,如果一個操作需要修改的內存單元的數(shù)目是一個常數(shù),則將該操作劃分為可無鎖的操作;如果一個操作的需要修改的內存單元的數(shù)目不是常數(shù),則將該操作劃分為不應無鎖操作。12.根據(jù)權利要求11所述的方法,其中,可無鎖的操作需要修改的內存單元的數(shù)目與數(shù)據(jù)結構中元素的數(shù)目不相關,不應無鎖操作需要修改的內存單元的數(shù)目與數(shù)據(jù)結構的實例中元素數(shù)目相關。13.根據(jù)權利要求11所述的方法,其中,可無鎖的操作的內存單元訪問少于一個字或者一個雙字;不應無鎖操作的內存單元訪問多于一個雙字或兩個不連續(xù)的字。14.根據(jù)權利要求1至6任一項所述的方法,其中,在單線程執(zhí)行時,對于同一個數(shù)據(jù)結構實例的每一個操作,如果以無鎖的方式實現(xiàn)時的執(zhí)行效率,與基于鎖的方式實現(xiàn)時的執(zhí)行效率相差小于預定的值,則將該操作劃分為可無鎖的操作;否則,將該操作劃分為不應無鎖的操作。15.根據(jù)權利要求14所述的方法,其中,在單線程執(zhí)行時,如果對于同一個數(shù)據(jù)結構實例的每一個操作,如果以無鎖的方式實現(xiàn)時的執(zhí)行效率,與基于鎖的方式實現(xiàn)時的執(zhí)行效率相差小于1,5倍,則將該操作劃分為可無鎖的操作;否則,將該操作劃分為不應無鎖的操作。16.—種對數(shù)據(jù)結構的實例進行操作的系統(tǒng),包括弱鎖裝置,用于為至少一可無鎖的操作請求獲取一第一鎖的弱鎖,以便對該數(shù)據(jù)結構的所述實例進行操作;可無鎖的操作執(zhí)行裝置,用于響應于該至少一可無鎖的操作完成獲取弱鎖,執(zhí)行該至少一可無鎖的操作對該數(shù)據(jù)結構的實例進行的操作;強鎖裝置,用于為一不應無鎖的操作請求獲取所述第一鎖的強鎖,以便對該數(shù)據(jù)結構的所述實例進行操作;以及不應無鎖的操作執(zhí)行裝置,用于響應于該不應無鎖的操作完成獲取該強鎖,執(zhí)行該不應無鎖的操作對該數(shù)據(jù)結構的實例進行的操作。17.根據(jù)權利要求16所述的系統(tǒng),其中,弱鎖裝置和強鎖裝置進一步配置為允許有多個操作同時分別持有該第一鎖的多個弱鎖,只允許一個操作持有該第一鎖的強鎖,不允許該第一鎖的弱鎖和強鎖同時被持有;可無鎖的操作執(zhí)行裝置進一步配置為允許持有該第一鎖的弱鎖的多個可無鎖的操作并行執(zhí)行。18.根據(jù)權利要求17所述的系統(tǒng),其中進一步包括阻塞裝置,該阻塞裝置配置為響應于執(zhí)行該不應無鎖的操作,阻塞請求該第一鎖的強鎖的操作;響應于執(zhí)行該不應無鎖的操作,阻塞請求該第一鎖的弱鎖的操作或其它請求該第一鎖的強鎖的操作。19.根據(jù)權利要求16所述的系統(tǒng),其中所述弱鎖裝置進一步配置為響應于該可無鎖的操作完成對該數(shù)據(jù)結構的實例的操作,釋放該弱鎖;所述強鎖裝置進一步配置為響應于該不能無鎖的操作完成對該數(shù)據(jù)結構的實例的操作,釋放該強鎖。20.根據(jù)權利要求16所述的系統(tǒng),其中可無鎖的操作所執(zhí)行的操作可以包括寫操作。21.根據(jù)權利要求16所述的系統(tǒng),其中進一步包括操作劃分裝置,用于將對數(shù)據(jù)結構的一實例的操作劃分為可無鎖的操作和不應無鎖的操作。22.根據(jù)權利要求21所述的系統(tǒng),其中操作劃分裝置進一步配置為使用根據(jù)方法權利要求7-15所述的方法的一種或多種,將對數(shù)據(jù)結構的一實例的操作劃分為可無鎖的操作和不應無鎖的操作。全文摘要本發(fā)明提供了一種對數(shù)據(jù)結構的實例進行操作的方法和系統(tǒng)。該方法包括為至少一可無鎖的操作請求獲取一第一鎖的弱鎖,以便對該數(shù)據(jù)結構的所述實例進行操作。響應于該至少一可無鎖的操作完成獲取弱鎖,執(zhí)行該至少一可無鎖的操作對該數(shù)據(jù)結構的實例進行的操作。為一不應無鎖的操作請求獲取所述第一鎖的強鎖,以便對該數(shù)據(jù)結構的所述實例進行操作。響應于該不應無鎖的操作完成獲取該強鎖,執(zhí)行該不應無鎖的操作對該數(shù)據(jù)結構的實例進行的操作。根據(jù)本發(fā)明的上述方法和系統(tǒng)可以提高對數(shù)據(jù)結構的實例進行操作的效率。文檔編號G06F9/46GK101685406SQ20081014982公開日2010年3月31日申請日期2008年9月27日優(yōu)先權日2008年9月27日發(fā)明者戴曉君,王遠洪,志甘,邱模炯,堯齊申請人:國際商業(yè)機器公司
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1