DULO:一種利用時間和空間局部性的高效緩存置換策略

一篇值得好好研究的cache buffer置換策略論文,一個星期的時間翻譯。

DULO:一種利用時間和空間局部性的高效緩存置換策略

摘要:

磁盤上的被請求的塊的Sequentiality,即他們的spatial locality,對於磁盤的效率是非常的關鍵的,因爲磁盤的throughput在訪問順序塊時會一階的高於訪問隨機塊。不幸的是,塊的spatial locality被大大的忽略了,只有temporal locality在緩存管理中被考慮。因此,不是以sequential訪問爲主導的磁盤工作效率會被大大削弱。爲了解決這個問題,我們提出一種叫做DULO的策略(Dual Locality),在緩存管理中temporal和spatial locality。平衡了buffer cache的filtering effect後,DULO可以通過使傳遞到磁盤的請求更sequential,來影響I/O request stream,進而顯著提高I/O scheduling和prefetching的效率。

DULO已經通過trace-driven模擬 和在linux2.6.11中的prototype實現被廣泛證實。在模擬和系統測量中,各種application的工作量都被測試過,包括WebServer,TPC 基準,和科學程序。我們的實驗顯示DULO可以顯著提高系統throughput,減少程序的運行時間。

1.       說明

硬盤驅動器是最通用的賦存設備,它們支持文件訪問和virtual memory。容量增長的符合了急劇增長的數據存儲需求,但它的electromechanical (機電)本質導致它的效率改善遠遠落後於處理器的速度改善。明顯的磁盤瓶頸在現在的計算機系統中在惡化,但硬盤作爲主流輔存的角色在可以預見的未來是不會改變的,然而application對磁盤數據的請求繼續增長。

磁盤的效率被機械操作所限制,包括disk platterrotation(spinning)和disk arm movement(seeking)。Disk head必須通過seeking到達正確的track,通過spinning到達正確的sector,來讀寫想要的數據。在這兩個動作之間,硬盤驅動器的部件影響了效率,disk arm是Achille’sHeel。因爲actuator必須通過一系列動作包括acceleration,coast,deceleration,settle精確移動arm到想要的track。因此,訪問同一個track上的sequential block與訪問幾個random block會有一個更大的磁盤throughput.

目前有幾種共同打破disk瓶頸的方法。一種是通過memory caching降低磁盤訪問。通過使用replacement 算法來利用數據訪問的temporal locality,因爲被訪問的數據在不久的將來會被再次訪問,磁盤訪問request沒有實際上傳遞到disk就被滿足了,爲了減小磁盤活動,所有當前的replacement算法都是把減少block miss作爲唯一目標。但是這會成爲一種誤導的準則,可能不能精確地反映怔怔的系統效率。例如,disk seeking被考慮後,請求10個sequential disk block會比請求3個random disk blocks更快。改善真正系統的效率,spatial locality必須被考慮,它可以一階的改變磁盤效率。但是,在當前的緩存管理中spatial locality 不幸的被忽略了,這篇paper的context中,spatial locality 特指接連不斷的requested block的replacement 形成的sequentiality。

另一種打破瓶頸的方法是降低disk arm seeks通過I/O request scheduling。I/O scheduler記錄block的requeste queue上的掛起請求 到一個dispatching order,能得到一個最小的seeks和最大的global disk throughput。作爲例子的Schedulers包括Shortesst-Seek-Time-First(SSTF),CSCAN,以及 Deadline 和被當前Linux Kernel接受的 anticipatory I/O schedulers.

第三個方法是prefetching。Prefetching manager 通過一個進程打開的文件預測未來的request patterns 。如果一個sequential access pattern 被探測到,那麼PM 代表process對當前on-demand的下一個blocks發出requests。因爲文件通常順序放置在磁盤上,所以那麼些prefetching request在幾次disk seeks後就會被迅速滿足。

儘管I/O scheduling 和prefetching可以有效地利用spatial locality並且可以戲劇性的改善那些工作量主要爲sequential access的disk throughput,它們處理混雜着sequential和random access的能力,比如web service,database,和科學計算application,是非常有限的。這是因爲兩種schemes都在一個低於buffer cache的等級上。儘管buffer cache 直接從應用接受I/O requests並且有能力把requests變成需要的I/O requests stream,I/O scheduling和prefetching只能在那些由buffer cache傳來的request stream並且recatch在buffer cache management中丟失的opportunity的能力非常有限。因此,在最壞的情況下,一個充滿random access的stream阻止I/O scheduling和prefetching來幫忙,因爲沒有spatial locality可以供他們利用。

聯繫到失去了利用spatial locality的能力,我們減弱disk瓶頸的方法是一種能利用temporal和spatial locality新的buffer cache management scheme,我們可以叫這種Dual locality scheme DULO。DULO 通過跟蹤和利用in-memory pages中的disk placement在操作系統的caching component中引入了dual locality,我們的目標是最大化磁盤提供的I/O request的sequentiality。爲了這個目的,我們優先考慮在cache中的random blocks,因爲temporal locality與random blocks相當的sequential blocks首先被替換。由於cache在I/O requests上的filtering effects,我們影響application的I/O requests使更多的sequential block request和更少的random block request傳遞到磁盤。磁盤就可以通過更多的spatial locality來高效的處理request。

2dual locality caching

2.1 一個描述性例子

爲了描述當配備了dual locality能力後傳統caching scheme的不同,讓我們考慮一個混合了sequential和random blocks的reference stream的例子。被訪問過的塊中,我們假定塊A,B,C,和D是散佈在不同的track中的隨機塊。塊X1,X2,X3和X4以及塊Y1,Y2,Y3和Y4是位於各自tracks上的sequential block。此外,兩個各自由由塊X1,X2,X3,X4和塊Y1,Y2,Y3,Y4組成的不同的文件。假設buffer cache有足夠八個block的空間。我們假定應用了LRU replacement 算法和一個類Linux的prefetching 策略。在這個簡單的描述中,我們用了average seek time來代表任何一個seek operation的花費,並且使用average rotation time來代表任何一個rotation operation的花費。我們忽略了其他微不足道的花費,比如read和transfer時間。6.5ms的average seek time和3.0ms的average rotation time來自Hitachi Ultrastar 18ZX 10K RPM drive。

Table1顯示了reference stream和正在發生的cache states的改變,以及花費在每次傳統caching和prefetching策略下的訪問與dual locality conscious alternative。在第5次訪問中,prefetching被激活並且所有的四個sequential blocks被取到,因爲prefetcher知道了reference(to block X1)是從文件頭部開始的。兩種策略Cache states的不同點是傳統的按照嚴格的LRU order列出了塊,然而dual 重新安排了block並且把隨機塊放到隊列的MRUend。所以,當第九次訪問引發一個four-block prefetching時,4個random blocks A,B,C和D在traditional中被替換,然而sequential blocks X1,X2,X3和X4在dual中被替換。這兩種選擇的後果是兩個不同的miss streams轉變成real disk request。對於traditional來說,來自第17次訪問的{A,B,C,D},一個4 random block 磁盤request stream,總時間花費是95.0ms。對於dual,來自第13次訪問的{X1,X2,X3,X4},一個four sequential blocks,總的時間花費只有66.5ms。

如果我們不使用prefetching,這兩個策略有同樣數量的misses。使用prefetching,traditional有10個miss,但是dual只有7個miss,這是因爲dual產生了更高質量的I/O request(包括了更多的sequential accesses)來提供更多的prefetching opportunity。

2.2dual locality的挑戰

Cache management中引入dual locality帶來了traditional所不存在的挑戰,並且在上面簡單的描述性例子中都很明顯。

在當前的cache management中,replacement算法只考慮temporal locality(LRU下隊列中的位置)來做出一個替換決定。但是引入了spatial locality後不得不使temporal localit的在替換決定中的權重做出妥協,Temporal locality的角色必須在決定中有作用。Table1中的例子,通過根據weak spatiall locality(weak sequentiality)把他們放到隊列的MRU end我們給了random blocks A,B,C,D更多的停留在cache中的權利,儘管他們的有很差的temporal locality(large recency).但是,如果他們幾乎沒有被再次訪問來證明他們有足夠的temporal locality,我們肯定不能把他們永遠保存到cache中。否則,他們將會用inactive data浪費cache減少cache的效率。同樣的考慮也適用於不同size的block sequence。我們偏向於保存一個短的sequence因爲僅有少量block來緩衝幾乎一個I/O operation的固定耗費。但是,當遇到一個最近沒有被訪問的short sequence和一個最近訪問的long sequence時,我們怎麼才能做出一個replacement decision?這個挑戰是如何以最大化disk performance爲目的在temporal locality(recency)和spatial locality(sequence size)中權衡。

3DULO策略

我們現在把我們的DULO策略同時無縫利用在temporal和spatial locality中。因爲LRU或它的變種是最廣泛使用的replacement算法,我們使用LRU算法和他的數據結構-LRU stack建立DULO scheme。

在LRU中,剛被取進來的blocks進入stack top,被更換的block從stack bottom離開。在DULO中有兩個關鍵的操作:(1)forming sequence。一個sequence被定義爲各自的disk locations臨近的blocks並且在一個有限的時間內被訪問過。因爲一個sequence是從有限大小的stack segment中形成的,並且所有的block根據他們的reference進入stack,定義的第二個條件是自然被滿足的。特殊的,random block是一個大小爲1的sequence。(2)根據他們的recency(temporal locality)和size(spatial locality)來排列在LRU stack中的順序,目標是具有large recency和size的sequence放置到LRU stack的stack bottom。因爲當新的sequence加入時,sequence的recency在改變,sorted sequence的順序將會動態的被改變來反映這些變化。

3.1 Structuring LRU stack

爲了便利上述的操作,我們把LRU stack分爲兩個section。Top part被叫做staging section,用來接受新取得的block,bottom part被叫做evicting section,用來存儲sorted sequence。我們再次劃分stagin section爲兩個segment。第一個segment被叫做correlation buffer,第二個segment被叫做sequencing bank。DULO中的Correlation buffer類似於LRU-K中的correlation reference period。它的作用是過濾high frequency reference並且組織他們進入sequencing bank,爲了減少後來的operational cost。Buffer的大小是固定的。Sequencing bank來作爲一個集合來存放blocks to be sequenced,大小從0到最大值BANK_MAX.

假設我們從一個staging section只有correlation buffer(sequencing bank的大小爲0)組成的LRU stack開始,並且evicting section保存了stack剩下的部分。當一個block離開evicting section的bottom,一個block進入correlation buffer的top,correlation buffer的bottom block 進入sequencing bank。當有BANK_MAX個block離開evicting section時,sequencing bank的大小是MAX_MAX,我們refill evicting section通過取得bank裏的block,從中形成sequences,並且把他們按順序插入evicting sequences。有三個原因來維持兩個interacting section並且使用bank來完成sequences forming:(1)新被接受的block有一個buffering area爲形成potential sequences來積累。(2)同時形成的sequences必須共享一個共同的recency,因爲組成他們的block是從同一個block pool-staging section中的sequencing bank。通過限制bank大小,我們確定block recency因爲spatial locality過分妥協。(3)將要離開stack的block在evicting section中被排序,反映他們的sequentiality和recency來替換。

3.2 Block table:dual的數據結構

爲了補充traditional的spatial locality方面不足,我們在OS Kernel裏引入了叫做block table的一種數據結構。Block table結構上類似於進程地址轉換的multi-level page table。但是有明顯的不同在他們之間,因爲他們爲不同的目的:(1)page table以頁爲單位包括了進程的virtual address space,page address是table的索引,但block table以block爲單位包括了disk space,block locations是table的索引。(2)page table是用來將一個virtual address轉換爲physical address的,但block table是用來提供對於一個給定block的最近訪問次數的。(3)與block table的lookupefficiency相比,page table的lookup efficiency的要求更苛刻,因爲page table支持指令執行,而block table應用於I/O operation。那就是爲什麼一個TLB不得不用來促進page table lookup,但是block table沒有這樣一個需求。(4)每一個進程有自己的一個page table,每一個disk drive在內存中只有一個block table。

在系統中我們設置一個global variable叫做bank block,每次staging section中的bank被用來forming sequences它就嘀嗒一次。每一個bank中的block把current clock time作爲一個timestamp,來代表它最近的訪問時間。我們在相應的block disk location在block table的leaf level的entry(BTE,Page Table Entry)記錄這個timestamp。BTE結構類似於page table的PTE(Page Table Entry)。每一個BTE允許最多兩個最近訪問時間記錄在裏邊。當一個新的時間加入,如果BTE滿了,最老的時間被替換。另外,爲了更高效的管理內存空間,一個timestamp在directory level(相當於linux page table中的PGD(Page Global Directory)和PMD(Page Middle Directory))上在每一個table entry被設置。每次block table在分層查找時記錄一個訪問時間,時間也在每一個經過的directory entry中被記錄爲一個timestamp。通過這種方式,當table被當做tree來view時每一個directory entry在那些直接或不直接的children entry維持最新的timestamp。

Block table的內存consumption可以被彈性控制。當系統內存壓力大時,系統需要收回table佔據的內存,它在一個指定地clock time threshold中遍歷table。因爲最近訪問的時間記錄在directory中,一旦找到timestamp小於threshold系統會刪除一個directory,並且它之下所有的subdirectory和BTE都會被刪除。

3.3Forming sequences

一提到從一個full bank中form sequences,bank clock是一個一個遞增的。Bank中的每一個block記錄了clock time作爲clock table中的一個timestamp。然後,我們遍歷table來收集所有的由current block time的block組成的sequences。這是一個低耗費的operation,因爲block table中任意level的directory包含了它之下所有BTE的最近的timestamp。這個遍歷只進入那些包含了bank中塊的directory。爲了保證sequences的穩定性,算法決定了具有developing sequence的最後一個塊不應該與table中的下一個block合併,如果下一個block屬於一下情況之一:

1.       BTE顯示當前的clock time它被訪問過。這包括了從未被訪問過的情況(例如,有一個空的timestamp field)。它屬於next block是spare的或者defective block。

2.       current和next兩個block中只有一個在current clock time之前沒被訪問過(例如,只有一個timestamp)。

3.       兩個block在current clock time之前都沒有被訪問過,但他們的last access time有超過一個不同。

4.       current sequence大小達到了允許最大的128,我們認爲這足夠緩衝一個disk operation耗費。

如果這些條件之一被滿足,一個完整的sequence就被form並且一個新的sequence開始被form。否則,next block成爲sequence的部分,下面的block連續被test。

3.4 DULO置換算法

DULO置換算法的設計中有兩個挑戰。

第一個是潛在的巨大開銷。在嚴格的LRU算法中,missed blocks和hit blocks都需要移到stack top。這意味着evicting section中的hit關聯了一個bank sequencing cost和一個evicting section中的sequencing ordering cost。這些附加cost會在一個幾乎沒有memory miss的系統中發生,不能被接受。事實上,嚴格的LRU算法是幾乎不被使用的,因爲與每一個memory reference聯繫過於緊密。它的變種,CLOCK置換算法,在實際上被廣泛使用。在CLOCK算法中,當一個blocks命中,只會被標誌爲一個young block,而不會被移到stack top。當一個block不得不被置換,stack bottom的block會被檢查。如果是一個young block,會被移到stack top並且young block 狀態刪除。否則,這個block被置換。CLOCK很好的模擬了LRU的行爲而且它的命中率非常接近於LRU。因爲這個原因,我們在CLOCK算法的基礎上建立DULO置換算法。也就是它推遲了一個hit block的行動直到它達到stack bottom。通過這種方式,只有block miss可以出發sequencing和evicting section refilling。與miss penalty相比較,這些耗費是非常小的。

第二個是evicting section中的sequences如何根據temporal和spatial locality被order。我們接受了一種應用於Web file caching中近似GreedyDual-Size的算法。GreedyDual-Size最初從GreedyDual中派生出來。通過考慮recency,size還有cached files的fetching cost來做出置換決策。它被證明爲在線最優算法,k(cache的size與最小文件的size的比例)-competitive。在我們的案例中,file size等同於sequences size,file fetching cost等同於一個訪問sequences的I/O operation cost。對於size變化範圍(由bank size限制)很大的sequences,我們假定他們的fetching cost是相等的。我們的算法將來必要時可以改變來適應這種cost變化。

DULO算法爲每一個sequence關聯一個value H,一個相對較小的數值表示將會被首先evicte。算法有一個global inflation value L,記錄了最近被evict的sequence的H value。當一個new sequences加入evicting section,H value被設置爲H(s)=L+1/size(s),size(s)是s中block的數目。Evicting section中的sequences和LRUstack bottom中小H value的sequences根據H value排序。算法中一個大size的sequences傾向於stay在stack bottom並且首先被evict。但是,如果一個小size的sequences在相當長時間不被訪問就會被replace。因爲一個剛被admit的long sequence會由於L value有一個比較大的H value,L value會被evicted block不斷地膨脹。當所有的sequences爲random blocks(size爲1),這個算法退化爲LRU算法。

正如我們之前提到的,一旦a bank size of blocks被從evicting section中替換出後,我們用sequencing bank中的blocks來形成sequences並且通過H value來order sequences。注意所有的sequences計算H value時共享同一個L value。新order的sequence list和evicting section中的ordered sequences歸併排序,完成evicting section的refilling,staging section僅以那些

Correlation buffer結尾。

4 Performance Evaluation

我們使用trace-driven 模擬和prototype implementation來評價DULO scheme並且展示在應用的不同的access patterns引入spatial locality到置換據側中的反響。

4.1   DULO simulation

4.1.1Experiment Settings

我們建立一個模擬器來實現DULO scheme,linux prefetching policy,還有Linux Deadline I/O scheduler。我們也實現了Disksim3.0(一個精確地disk simulator),來模擬disk behavior。做的模型是Seagate ST39102LW,10KRPM,9.1GB容量。最大read/write seek time是12.2ms,average rotation time是2.99ms。我們選了五個具有代表性的request patterns的trace來驅動simulator。這裏簡單介紹這些traces。

Trace viewperf基本上全是由sequential access組成的。Trace通過運行SPEC 2000 benchmark viewperf來採集。在這個trace中,超過99%的reference都是對於幾個大文件裏的consecutive blocks。相反,trace tpc-h基本上由all-random-access組成。是由支持TPC-decision 的benchmark在MySQL database system上運行時。TPC-H的對於幾個大database file的random reference,導致了只有3%的reference在consecutive blocks中。

另外三個是混合的I/O request patterns。Trace glimpse通過使用indexing和query tool“glimpse”在usr目錄下text files中搜索text string。Trace multi1通過並行運行cscope,gcc,還有viewperf。Cscope十一哥source code examination tool,gcc是一個GNU compiler。都把Linux Kernel 2.4.20 source code作爲他們的input。Cscope和glimpse給出了一個相似的access pattern。他們各自包含了76%和%74%的sequential access。Trace multi2通過並行運行glimpse和tpc-h。multi2的sequential access比multi1少(16%對75%)。

在模擬中,我們設置sequencing bank size爲8MB,大多數情況下evicting section size爲64MB,只有demanded memory size小於80MB時,設置sequencing bank size爲4MB,evicting sequences size爲16MB。這些choices基於section 4.1.3中的parameters sensitivity studies的。在這個Evaluation中,我們比較DULO Performance和CLOCK算法。爲了普遍適用性,我們仍把它叫做LRU。

4.1.2 Evaluation Results

圖3、4顯示了LRU和DULO的caching schemes在五個workload下改變memory size時的

execution times,hit ratios,disk access sequences size distributions。因爲DULO改善系統效率的effort是來影響對disk的request的質量—sequential block access的數量(sequences size),我們展示出運行在LRU和DULO caching scheme下五種workload的sequences size的不同。因爲這個原因,我們使用CDF curves來展示requested block出現在那些size小於一個特定threshold的sequences中的percentage。對於每一個Trace,我們選擇兩個memory size來畫相應的LRU和DULO的CDF curves。我們根據execution time figure中LRU和DULO的execution time gaps選擇memory size--一個memory size取決於small gap另一個取決於large gap。Memory size在CDF figure的圖例中有。

首先,考察Figure3,CDF curves展示了almost-all-sequential的workload viewperf,超過80%的requested block在size大於120的sequences中。儘管DULO可以增加short sequences的size,因此降低4.4%的execution time,但作用是有限的。對於almost-all-random workload tpc-h,明顯DULO不能從由純random blocks組成的application requests建立sequential disk requests。所以我們看到DULO幾乎沒有改善。

DULO對於混合requests patterns有大量的效率改善。從圖中可以觀察出。首先,sequences size的increase跟execution time和hit ratio improvement是直接關聯。我們把multi1作爲一個例子,80MB的memory size,DULO使16.1%requested blocks出現在size大於40的sequences中,而LRU是13.7%。據此,有8.5%的execution time reduction和3.8%的hit ratio increase。相反,160MB的memory size,DULO使24.9%的requested blocks出現在size大於40的sequences中,而LRU是14.0%。據此,55.3%的execution time reduction和29.5%的hit ratio increase。這個關係明顯的表明requested sequences size是一個影響disk Performance的關鍵因素,並且DULO通過增加sequences size做出了貢獻。DULO可以通過對long sequences更有效的prefetching和產生更多hits on prefetched blocks來增加hit ratio。第二,sequential access在DULO中平衡buffer cache的filtering effects時是非常重要的。我們看到DULO在glimpse和multi1中做的比較好。我們知道了glimpse和multi1有74%和75%的sequential access,而multi2中有16%的sequential access。Multi2中的小部分sequential access使DULO防止random blocks被置換的能力降低,因爲沒有足夠的sequentially accessed blocks被置換。第三,multi1在DULO中與glimpse相比有更多的pronounced Performance improvement。這個不同主要因爲DULO通過循環access pattern(大家都知道LRU在這方面做得很差)更好的利用temporal locality順便改善了LRU hit ratios。相比之下,在multi2的情況下,DULO幾乎不能改善hit ratio,但是可以客觀的降低execution time,明顯的表現出在利用spatial locality中的效率。

4.1.3 Parameter Sensitivity和overhead Study

DULO中有兩個Parameter,(最大)sequencing bank size和(最小)evicting size。這兩個size應該與workload access patterns相關聯而不是memory size,因爲他們用來manage accessed blocks的sequentiality。我們使用四個workload來研究,派出了viewperf因爲memory demand很小。

Table3 表示了execution time在不同sequencing size下的變化。我們觀察到不同access patterns的workload中,從4mb到16mb有一個最佳的bank size。原因是太small size的bank幾乎沒有機會形成long sequences。同時,bank size必須小於evicting section size。當bank size接近section size時,效率將會降低。因爲large bank size導致了evicting section被太晚refill而且導致evicting section中的random blocks不得不evicted。所以在我們的實驗中,我們選擇8mb作爲bank size。

Table4 展示了隨着不同的evicting section size,execution time的改變。明顯的,section size越大,DULO就會對section中的blocks的eviction order有更多的control,經常意味着更好的Performance。圖確實顯示了這種趨勢。與此同時,圖也顯示了一旦size超過64mb到128mb範圍,增大的evicting section發生飽和。我們的試驗中,我們選取64mb作爲section size因爲我們的workload的memory demand相對較小。

DULO的空間開銷是它的block table,它的size增長與compulsory miss的數目對應。只有一波compulsory miss可以導致table size迅速增加。但是,table space可以被系統reclaim(section3.2)。DULO的time overhead很瑣碎,因爲與miss有聯繫。我們的模擬表現了miss與一個block sequencing operation(把block放入block table並且與最近的block比較,1.7merge sort comparison operation)。

4.2   DULO的implementation

爲了展示DULO對於運行在一個modern OS上的效率改善,我們在最新的Linux Kernel 2.6.11上實現了DULO。Real system Evaluation比Trace simulation的一個好處是它可以把所有的memory usage計算在內,包括process memory還有file-mapped memory pages。例如,由於time和space耗費的限制,幾乎不可能忠實記錄所有的memory page access爲一個trace。因此,我們在模擬實驗中使用的trace只能通過system calls來反映file access activities。爲了展現一個全面綜合的DULO Evaluation,我們的Kernel implementation和system measurement有效的補充了我們的trace simulation results。

讓我們從一個簡單Linux replacement policy-LRU變體的實現開始。

4.2.1          Linux caching

linux使用了一個類似2Q replacement的LRU變體。Linux2.6 kernel把所有的process pages和file pages分爲兩個叫做active list和inactive list的LRU lists。正如名字暗示的,active list被用來store最近actively被訪問的page,inactive list用來store那些有些時間沒被access的page。一個faulted-in page經常在inactive list的tail被select。一個inactive page當被作爲一個file page訪問時進入active list(mark_page_accessed()),或者作爲一個process page訪問時,它的引用在inactive list tail被檢測。一個active page進入inactive list如果它被決定最近不被access(refill_inactive_zone())。

4.2.2          Implementation Issues

在我們的DULO的prototype implementation中,我們不根據忠實的DULO scheme實現replace原始original linux page frame。相反,我們選擇保持existing data structure和policies基本不變,無縫的把DULO編入。我們做出這個選擇,不得不忍受一些original DULO design的compromise,來服務於一個目的,展示考慮在不改變基本replacement policy的情況下dual locality可以帶給一個existing spatial-locality-unaware系統的改善。

在linux中,我們把inactive list分成一個staging section和一個evicting section,因爲list中new block被add並且old block被replace。兩個LRU list在Linux中使用而不是DULO中假定的一個,這條站了使用一個staging section中的一個bank來form a sequence。我們知道DULO中的sequencing bank是用來連續收集accessed pages並且爲他們形成sequences的,所以sequence中的pages可以被同時requested並且被fetch sequentially。在兩個list中,剛被訪問的page和從active list中demote的最近未訪問的page可能被加入到inactive list中並且可能在the same bank中被sequence。因此,兩個spatially sequential但是temporally remote的page可能被分如一個sequence,這明顯的與section4開頭描述的sequence definition有衝突。我們通過mark那些demoted的active page並且獨立sequence每一類page來解決這個問題。明顯的,跟那些任何hit page對一個有faulted-in pages的possible sequencing是available的  的一個stack case中相比,Linux two-list structure 提供了少的機會使DULO來identify 這些sequences。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章