本發(fā)明屬于數(shù)據(jù)存儲(chǔ)領(lǐng)域,更具體地,涉及一種面向NAND閃存的頁面置換方法。
背景技術(shù):
NAND閃存(flash memory)是由東芝公司于1989年提出的一種非易失性存儲(chǔ)介質(zhì),具有高性能,高密度,抗震性好,低功耗等優(yōu)點(diǎn)。因此,NAND閃存被廣泛應(yīng)用于嵌入式設(shè)備,便攜式電腦。隨著NAND閃存技術(shù)的飛速發(fā)展,其在企業(yè)級存儲(chǔ)系統(tǒng)中也得到廣泛的應(yīng)用。簡便起見,本文后面提到的閃存如無特別說明都默認(rèn)代表NAND閃存。
緩存在存儲(chǔ)系統(tǒng)中扮演著極為重要的作用,通過將熱點(diǎn)數(shù)據(jù)保存在小容量的高速緩存中,存儲(chǔ)系統(tǒng)性能可以得到明顯的改善。幾十年來,研究人員針對存儲(chǔ)系統(tǒng)緩存管理提出各種各樣的頁面置換算法,例如先進(jìn)先出算法(FIFO)、最久未使用算法(LRU)、最少使用置換算法(LFU)等等。這些算法都是基于存儲(chǔ)介質(zhì)為傳統(tǒng)磁盤的假設(shè)。然而,相比傳統(tǒng)磁盤,閃存有著一些非常獨(dú)特的性質(zhì)。閃存有三種基本操作,讀、寫、擦除。讀/寫是以頁為單位執(zhí)行的,而擦除操作是按塊為單位執(zhí)行的。每個(gè)塊包含若干個(gè)頁。閃存不支持對頁的覆蓋寫操作,而必須先執(zhí)行擦除才能寫入新的數(shù)據(jù)。另外,閃存的三種基本操作的時(shí)延也不同。通常閃存的讀時(shí)延最短,寫時(shí)延其次,而擦除操作最慢。傳統(tǒng)的面向磁盤的頁面置換算法主要致力于提升緩存命中率,而沒有考慮到閃存的這些特性。例如,傳統(tǒng)的算法假設(shè)讀寫開銷是相同的。然而在閃存的寫時(shí)延通常比讀時(shí)延慢,而且隨著寫操作的不斷增加,當(dāng)閃存空閑頁數(shù)量不足時(shí),還會(huì)觸發(fā)更慢的擦除操作。如果不考慮這些因素而僅僅關(guān)注命中率,就無法充分發(fā)揮基于閃存的存儲(chǔ)I/O性能。
考慮到閃存的讀寫不對稱性,研究人員在最久未使用置換算法(LRU)的基礎(chǔ)上,提出了一系列面向閃存的頁面置換算法,如干凈頁優(yōu)先置換算法(CFLRU),冷干凈頁優(yōu)先置換算法(CCFLRU),以及基于概率的三鏈表置換算法(PTLRU)等等。這些算法的核心思想在于盡可能減少開銷較大的閃存寫操作,同時(shí)盡量保證不會(huì)造成命中率的過度下降。然而這些算法仍然存在各自的問題。例如CFLRU沒有充分考慮緩存頁的訪問頻度,可能會(huì)造成冷的干凈頁無法被及時(shí)置換出緩存而造成緩存污染。CCFLRU和PTLRU采用較為激進(jìn)的方式置換干凈頁,然而它們?nèi)菀自斐蔁岬母蓛繇摕o法被識別并保存在緩存,因此可能導(dǎo)致命中率的顯著下降,從而使得最終的I/O性能受損。綜上,現(xiàn)有的各種緩存頁面置換算法有著如上所述的缺陷,不能很好地提升基于閃存的存儲(chǔ)系統(tǒng)I/O性能。
技術(shù)實(shí)現(xiàn)要素:
針對現(xiàn)有技術(shù)的以上缺陷或改進(jìn)需求,本發(fā)明提供了一種面向NAND閃存的頁面置換方法,該方法使用冷的干凈頁鏈表和其他混合頁鏈表分別管理冷干凈頁和其它緩存頁,還使用預(yù)留的幽靈頁鏈表記錄近期被淘汰的緩存頁的元數(shù)據(jù)信息;處理頁訪問時(shí)先初始化,若該頁在其他混合頁鏈表或冷的干凈頁鏈表中命中,則將該頁標(biāo)記為熱頁并移動(dòng)到其他混合頁鏈表的最近訪問端;如果該頁在幽靈頁鏈表命中,則刪除幽靈頁鏈表中該頁的記錄,為該頁分配一個(gè)新的緩存頁并標(biāo)記為熱頁,在將該頁移動(dòng)到其他混合頁鏈表的最近訪問端;最后判斷該頁如果是讀/寫請求,則將數(shù)據(jù)讀出/寫入緩存頁并返回。
為實(shí)現(xiàn)上述目的,提供了一種面向NAND閃存的頁面置換方法,該方法包括如下步驟:
(1)當(dāng)一個(gè)I/O請求P到達(dá)時(shí),首先初始化變量第一標(biāo)志位和第二標(biāo)志位為0,之后在緩存中的CL(冷的干凈頁鏈表)、ML(其他混合頁鏈表)和GL(幽靈頁鏈表)中查詢P;
(2)若沒有在ML和CL中命中P則進(jìn)入步驟(3),否則跳轉(zhuǎn)到步驟(9);
(3)判斷是否在GL中有P的元數(shù)據(jù)信息,若有則進(jìn)入步驟(4),否則跳轉(zhuǎn)到步驟(5);
(4)刪除GL中包含P的元數(shù)據(jù)信息的節(jié)點(diǎn),并且將變量第一標(biāo)志位置為1;
(5)為請求P執(zhí)行緩存分配過程,為其分配緩存頁;
(6)若第一標(biāo)志位等于0并且該請求是讀操作,則跳入到步驟(12),否則進(jìn)入步驟(7);
(7)將新分配的緩存頁P(yáng)移動(dòng)到ML的MRU(最近訪問)端;
(8)若第一標(biāo)志位等于1,進(jìn)入步驟(10)否則跳入步驟(11);
(9)將緩存頁P(yáng)移動(dòng)到ML的MRU端,并將第二標(biāo)志位賦值為1;
(10)將緩存頁P(yáng)標(biāo)記為熱頁;
(11)若是讀請求,則進(jìn)入步驟(13),否則跳轉(zhuǎn)到步驟(16);
(12)將緩存頁P(yáng)加入到CL的MRU端;
(13)若第二標(biāo)志位等于0,則進(jìn)入到步驟(14),否則跳入步驟(15);
(14)將數(shù)據(jù)從閃存讀入到新分配的緩存頁P(yáng);
(15)將緩存頁P(yáng)中的數(shù)據(jù)返回給上層,請求結(jié)束;
(16)將數(shù)據(jù)寫入到新分配的緩存頁P(yáng),并將緩存頁P(yáng)標(biāo)記為臟頁,請求結(jié)束。
進(jìn)一步地,所述步驟(5)中分配緩存頁包括以下子步驟:
(21)判斷是否有空閑的緩存頁,若有則跳轉(zhuǎn)到步驟(211),否則進(jìn)入步驟(22);
(22)初始化將要被回收的緩存頁標(biāo)記為犧牲頁,使之為空;
(23)判斷鏈表CL是否為空,如果為空則進(jìn)入步驟(24),否則跳轉(zhuǎn)到步驟(27);
(24)從鏈表ML的LRU(最久未訪問)端向MRU(最近訪問端)端掃描,依次判斷LRU端的緩存頁P(yáng)是否為冷頁,如果不是冷頁,則轉(zhuǎn)入步驟(25),否則跳轉(zhuǎn)到步驟(28);
(25)將緩存頁P(yáng)標(biāo)記為冷頁,若緩存頁P(yáng)為干凈頁,則將其移動(dòng)到CL的MRU端;否則將緩存頁P(yáng)移動(dòng)到ML的MRU端;
(26)若ML中的頁還沒有掃描完畢,則跳轉(zhuǎn)到步驟(24),否則跳轉(zhuǎn)到步驟(23);
(27)將CL鏈表中的LRU端緩存頁作為犧牲頁,跳轉(zhuǎn)到步驟(29);
(28)將緩存頁P(yáng)作為犧牲頁;
(29)若GL鏈表已滿,則將其LRU端的節(jié)點(diǎn)釋放;將犧牲頁的元數(shù)據(jù)信息加入到GL的MRU端;
(210)若犧牲頁是臟頁,則將該頁的數(shù)據(jù)寫回到閃存;將犧牲頁設(shè)為空閑頁;
(211)選取一個(gè)空閑頁返回,請求結(jié)束。
進(jìn)一步地,所述CL鏈表,用于管理冷的干凈頁;所述ML鏈表,用于管理熱的干凈頁、熱的臟頁和冷的臟頁;所述GL鏈表,用于記錄近期被淘汰的緩存頁的元數(shù)據(jù)信息。
總體而言,通過本發(fā)明所構(gòu)思的以上技術(shù)方案與現(xiàn)有技術(shù)相比,具有以下技術(shù)特征及有益效果:
(1)本發(fā)明減少了NAND閃存的高開銷操作:由于本發(fā)明優(yōu)先替換冷的干凈頁,而盡量推遲熱的臟頁的返回,因此可以在緩存中產(chǎn)生更多的臟頁寫命中,從而減少了對閃存的寫入次數(shù),進(jìn)而也可以減少閃存的擦除操作;
(2)本發(fā)明維持了較好的緩存命中率:由于本發(fā)明細(xì)分了緩存頁的狀態(tài),并且借助于Ghost緩存有效的識別被潛在的熱頁,從而避免造成緩存命中率的過分下降。
附圖說明
圖1是本發(fā)明一種面向NAND閃存的頁面置換方法讀寫操作流程圖;
圖2是本發(fā)明一種面向NAND閃存的頁面置換方法緩存頁分配流程圖;
圖3是本發(fā)明采用的數(shù)據(jù)結(jié)構(gòu)以及緩存頁狀態(tài)示意圖。
具體實(shí)施方式
為了使本發(fā)明的目的、技術(shù)方案及優(yōu)點(diǎn)更加清楚明白,以下結(jié)合附圖及實(shí)施例,對本發(fā)明進(jìn)行進(jìn)一步詳細(xì)說明。應(yīng)當(dāng)理解,此處所描述的具體實(shí)施例僅僅用以解釋本發(fā)明,并不用于限定本發(fā)明。此外,下面所描述的本發(fā)明各個(gè)實(shí)施方式中所涉及到的技術(shù)特征只要彼此之間未構(gòu)成沖突就可以相互組合。
首先給出本發(fā)明相關(guān)概念的定義:
緩存頁:緩存的基本讀寫單位,一般與閃存的物理頁大小一致;
如圖1所示,本發(fā)明的讀寫操作流程分為如下步驟:
(1)當(dāng)一個(gè)I/O請求P到達(dá)時(shí),首先初始化變量glflag=0、realhit=0,之后在緩存中的CL、ML和GL中查詢P;
(2)若沒有在ML和CL中命中P則進(jìn)入步驟(3),否則跳轉(zhuǎn)到步驟(9);
(3)判斷是否在GL中有P的元數(shù)據(jù)信息,若有則進(jìn)入步驟(4),否則跳轉(zhuǎn)到步驟(5);
(4)刪除GL中包含P元數(shù)據(jù)信息的節(jié)點(diǎn),并且使變量glflag=1;
(5)為請求P執(zhí)行緩存分配過程,為其分配緩存頁;
(6)若glflag==0并且該請求是讀操作,則跳轉(zhuǎn)到步驟(12),否則進(jìn)入步驟(7);
(7)將新分配的緩存頁P(yáng)移動(dòng)到ML的MRU端;
(8)若glflag==1,進(jìn)入步驟(10)否則跳入步驟(11);
(9)將緩存頁P(yáng)移動(dòng)到ML的MRU端,并使realhit=1;
(10)將緩存頁P(yáng)標(biāo)記為熱頁;
(11)若是讀請求,則進(jìn)入步驟(13),否則跳轉(zhuǎn)到步驟(16);
(12)將緩存頁P(yáng)加入到CL的MRU端;
(13)若realhit==0,則進(jìn)入到步驟(14),否則跳入步驟(15);
(14)將數(shù)據(jù)從閃存讀入到新分配的緩存頁P(yáng);
(15)將緩存頁P(yáng)中的數(shù)據(jù)返回給上層,請求結(jié)束;
(16)將數(shù)據(jù)寫入到新分配的緩存頁P(yáng),并將緩存頁P(yáng)標(biāo)記為臟頁,請求結(jié)束。
如圖2所示,本發(fā)明分配緩存頁流程分為如下步驟:
(21)判斷是否有空閑的緩存頁,若有則跳轉(zhuǎn)到步驟(211),否則進(jìn)入步驟(22);
(22)初始化將要被回收的緩存頁,標(biāo)記為victim,使之為空;
(23)判斷鏈表CL是否為空,如果為空則進(jìn)入步驟(24),否則跳轉(zhuǎn)到步驟(27);
(24)從鏈表ML的LRU端向MRU端掃描,依次判斷LRU端的緩存頁P(yáng)是否為冷頁,如果不是冷頁,則轉(zhuǎn)入步驟(25),否則跳轉(zhuǎn)到步驟(28);
(25)將緩存頁P(yáng)標(biāo)記為冷頁,若緩存頁P(yáng)為干凈頁,則將其移動(dòng)到CL的MRU端;否則將緩存頁P(yáng)移動(dòng)到ML的MRU端;
(26)若ML中的頁還沒有掃描完畢,則跳轉(zhuǎn)到步驟(24),否則跳轉(zhuǎn)到步驟(23);
(27)將CL鏈表中的LRU端緩存頁作為victim頁,跳轉(zhuǎn)到步驟(29);
(28)將緩存頁P(yáng)作為victim頁;
(29)如果GL鏈表已滿,則將其LRU端的節(jié)點(diǎn)釋放;將victim頁的元數(shù)據(jù)信息加入到GL的MRU端;
(210)如果victim頁是臟頁,則將該頁的數(shù)據(jù)寫回到閃存;將victim頁設(shè)為空閑頁;
(211)選取一個(gè)空閑頁返回,請求結(jié)束。
圖3是本發(fā)明采用的數(shù)據(jù)結(jié)構(gòu)以及緩存頁狀態(tài)的示意圖,CL,用于管理冷的干凈頁;ML,用于管理熱的干凈頁、熱的臟頁和冷的臟頁;GL,用于記錄近期被淘汰的緩存頁的元數(shù)據(jù)信息。
以上所述僅為本發(fā)明的較佳實(shí)施例而已,并不用以限制本發(fā)明,凡在本發(fā)明的精神和原則之內(nèi)所作的任何修改、等同替換和改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。