專利名稱:一種基于狀態(tài)機(jī)的Cache并發(fā)訪問管理方法
技術(shù)領(lǐng)域:
本發(fā)明涉及存儲(chǔ)系統(tǒng)管理領(lǐng)域,具體涉及一種基于狀態(tài)機(jī)的Cache并發(fā)訪問管 理方法
背景技術(shù):
Cache狹義上指處理器內(nèi)部的高速緩沖存儲(chǔ)器,即將根據(jù)程序運(yùn)行的時(shí)間局部 性和空間局部性原理,將最近訪問的數(shù)據(jù)及其鄰近的數(shù)據(jù)放入一個(gè)高性能的緩沖區(qū)中, 這些數(shù)據(jù)將來很可能被用到。廣義上來講,數(shù)據(jù)流在計(jì)算機(jī)中的移動(dòng)過程不僅僅包括從 內(nèi)存到處理器,還包括從磁盤到內(nèi)存或從其它外設(shè)到內(nèi)存的過程,而這些過程中的數(shù)據(jù) 訪問都具有時(shí)間局部性和空間局部性的特征,因此將最近訪問過的數(shù)據(jù)放入速度更高一 級(jí)的緩存中,是一種通用的加速方法,也常常稱為Cache。本文所指的Cache是廣義的 Cache,尤其是從磁盤到內(nèi)存數(shù)據(jù)通路上的Cache。如前所述,Cache機(jī)制將最近訪問的數(shù)據(jù)或其物理位置上鄰近的數(shù)據(jù)放入高速緩 存中,那么對(duì)高速緩存來講,就分為四種類型的操作 讀操作讀命中的情況下,本次讀請(qǐng)求被定向到高速緩存,因此高速緩存需 要做一次讀取數(shù)據(jù)的操作。 寫操作寫命中的情況,和讀操作類似。眷緩存操作讀或?qū)懖幻?,而本次讀或?qū)懖僮鞯牡刂酚衷贑ache范圍之內(nèi), 因此需要從磁盤讀取最新的數(shù)據(jù)并填充到高速緩存中,為將來使用。 刷新操作在Cache容量不足的情況下,則需要替換現(xiàn)有Cache中的數(shù)據(jù)到磁 盤上,并從磁盤讀取新的數(shù)據(jù)到Cache中。如果原Cache上的內(nèi)容為寫操作所更新的最 新內(nèi)容,通常稱為臟數(shù)據(jù)(Dirty Data),則需要將臟數(shù)據(jù)刷回到磁盤上去。以上四種操作中,除了對(duì)Cache中的具體數(shù)據(jù)進(jìn)行操作外,對(duì)Cache中的用來管 理數(shù)據(jù)的控制信息也需要進(jìn)行相應(yīng)的更新。由于上述各種更新操作都可能同時(shí)作用于同一個(gè)高速緩存單元上,因此實(shí)際操 作中就需要對(duì)每個(gè)高速緩存單元做保護(hù)操作,使得不同的更新操作之間不會(huì)發(fā)生沖突, 確保高速緩沖中的數(shù)據(jù)信息和狀態(tài)信息都處于一致狀態(tài)。常用的保護(hù)機(jī)制是使用鎖,即每次操作時(shí)對(duì)該高速緩存單元加鎖,使用后將鎖 釋放。但通常一個(gè)高速存儲(chǔ)器上會(huì)有非常多的存儲(chǔ)單元,如果對(duì)每個(gè)存儲(chǔ)單元都單獨(dú)做 鎖操作,開銷較大。如果將多個(gè)存儲(chǔ)單元共用一個(gè)鎖,則會(huì)造成鎖的偽共享,即原本可 以并發(fā)的操作,由于共享一個(gè)鎖而造成無法并發(fā)的情況,帶來系統(tǒng)性能的損失。
發(fā)明內(nèi)容
為解決上述問題,本發(fā)明能夠提供了一種Cache基于狀態(tài)機(jī)的管理方法。一種基于狀態(tài)機(jī)的Cache并發(fā)訪問管理方法,將多個(gè)基本存儲(chǔ)單元?jiǎng)潥w為一個(gè) 基本的Cache分區(qū),本分區(qū)內(nèi)所有存儲(chǔ)單元共享存儲(chǔ)狀態(tài),存儲(chǔ)狀態(tài)劃分為多個(gè)細(xì)粒度
3子狀態(tài),子狀態(tài)間通過狀態(tài)機(jī)轉(zhuǎn)換;包括四種操作查找分區(qū)操作,讀操作,緩存操作 和寫操作。本發(fā)明的第一種優(yōu)選技術(shù)方案在于所述子狀態(tài)間轉(zhuǎn)換不需要互斥或僅需要基 于原子指令的同步原語。本發(fā)明的第二種優(yōu)選技術(shù)方案在于所述子狀態(tài)包括EMPTY,CLEAN, DIRTY, FETCH, FILLFLUSH 和 INVAL。本發(fā)明的第三種優(yōu)選技術(shù)方案在于所述查找分區(qū)操作過程為傳入磁盤上分 區(qū)編號(hào),若無制定空閑分區(qū)時(shí)重新分配;查找過程中若發(fā)現(xiàn)有分區(qū)的引用計(jì)數(shù)為0,其 狀態(tài)為CLEAN,而且DIRTY位圖非全0,則清空DIRTY位圖;若分配過程中,發(fā)現(xiàn)本 應(yīng)被分配的目標(biāo)狀態(tài)為DIRTY,則啟動(dòng)一次刷新操作。本發(fā)明的第四種優(yōu)選技術(shù)方案在于所述讀操作過程中,每個(gè)讀操作的請(qǐng)求可 以有三個(gè)流向,分別為重定向至后端存儲(chǔ)設(shè)備,讀完即止;從緩存設(shè)備讀基本塊,或者 從后端存儲(chǔ)設(shè)備讀基本塊并緩存;重定向到后端存儲(chǔ)讀取基本塊,并嘗試預(yù)取整個(gè)分 區(qū)。本發(fā)明的第五種優(yōu)選技術(shù)方案在于所述緩存操作過程如下A、檢測(cè)分區(qū)是否為空,若是轉(zhuǎn)D;B、測(cè)試并嘗試EMPTY至FETCH轉(zhuǎn)換,保證只有一個(gè)緩存者執(zhí)行后續(xù)操作,若 失敗,轉(zhuǎn)D;C、讀后端存儲(chǔ),開始緩存過程,若返回非0,則出錯(cuò),釋放分區(qū),置分區(qū)變量 為空,轉(zhuǎn)D;若后端存儲(chǔ)返回0,直接返回;D、檢查基本分區(qū)是否非空,若非空,則轉(zhuǎn)化為讀操作;E、若BIO為空,則釋放分區(qū)。本發(fā)明的第六種優(yōu)選技術(shù)方案在于所述寫操作在多數(shù)情況下都是無條件將分 區(qū)狀態(tài)改為DIRTY,并寫入緩存,其過程為F、檢測(cè)分區(qū)是否為空,若是則直接轉(zhuǎn)至后端存儲(chǔ);G、檢查分區(qū)狀態(tài),若為CLEAN,則表明之前為有效數(shù)據(jù)的讀數(shù)據(jù),需要先將 其無效,設(shè)置狀態(tài)為INVAL ;H、檢查分區(qū)的狀態(tài),若為FILL則一直循環(huán)等待;I、當(dāng)狀態(tài)不是FILL時(shí)將狀態(tài)設(shè)置為DIRTY ;J、寫緩存結(jié)束,開始對(duì)高速緩存設(shè)備操作。本發(fā)明在保證系統(tǒng)穩(wěn)定的前提下有效提高了緩存的訪問效率。
圖1為緩存模塊內(nèi)I/O路徑細(xì)分圖2為緩存中分區(qū)狀態(tài)轉(zhuǎn)換圖
具體實(shí)施例方式本發(fā)明中將多個(gè)基本存儲(chǔ)單元?jiǎng)潥w為一個(gè)基本的Cache分區(qū),本分區(qū)內(nèi)的所有 存儲(chǔ)單元共享存儲(chǔ)狀態(tài)。進(jìn)一步,將存儲(chǔ)狀態(tài)劃分為多個(gè)細(xì)粒度的子狀態(tài),子狀態(tài)間通過狀態(tài)機(jī)的方式實(shí)現(xiàn)轉(zhuǎn)變,使得狀態(tài)間的轉(zhuǎn)換不需要互斥或僅需要基于原子指令的同步 原語。具體來講,每個(gè)分區(qū)都有一個(gè)狀態(tài),該狀態(tài)表明了當(dāng)前分區(qū)中數(shù)據(jù)是否有效以 及是否處于緩存操作過程中等信息。主要包括如下幾種狀態(tài)· EMPTY表示本分區(qū)中無任何有效數(shù)據(jù),可重新使用。此處的有效數(shù)據(jù)指可 供文件系統(tǒng)讀取的正確數(shù)據(jù),包括臟數(shù)據(jù)和從磁盤讀出來并寫至高速存儲(chǔ)設(shè)備的數(shù)據(jù)。 CLEAN:表示本分區(qū)中沒有臟數(shù)據(jù),此處的臟數(shù)據(jù)指只存在于高速緩存而不 存在于后端存儲(chǔ)的最新數(shù)據(jù)。但此狀態(tài)并不代表此分區(qū)所有的基本存儲(chǔ)單元都含有有效 數(shù)據(jù)(比如之前只發(fā)生過部分寫入)。^DIRTY:表示分區(qū)中有臟數(shù)據(jù)?!?FETCH 表示一個(gè)緩存操作已經(jīng)開始了 IO過程,最多已經(jīng)完成了讀后端存 儲(chǔ),但還沒開始寫高速緩存?!?FILL 表示緩存操作已經(jīng)在寫高速緩存(讀后端存儲(chǔ)完畢)· FLUSH 表示一個(gè)寫回操作處理一個(gè)分區(qū)的全部過程(未被寫者打擾)· INVAL 在緩存狀態(tài)為CLEAN的情況下,有寫操作發(fā)生于該分區(qū)上.除了上述狀態(tài)外,狀態(tài)間的轉(zhuǎn)換操作可細(xì)分為更多的步驟,如圖1所示。細(xì)分 有利于簡(jiǎn)化分區(qū)的狀態(tài)管理,并盡可能在合適的時(shí)機(jī)確定下一步動(dòng)作,減少不必要的等 待、放棄以及冗余操作等可能性?;谏鲜鰻顟B(tài)及細(xì)分后的路徑動(dòng)作,狀態(tài)轉(zhuǎn)換如圖2所示。需要說明的幾點(diǎn)·實(shí)線箭頭為正常的狀態(tài)轉(zhuǎn)換·點(diǎn)虛線箭頭為設(shè)備驅(qū)動(dòng)返回error或者資源分配失敗等情況下導(dǎo)致的狀態(tài)轉(zhuǎn)換 路徑,為了顯眼在文字上加了( !)·粗斜體+下劃線文字表示相應(yīng)線程將放棄后續(xù)I/O步驟·帶disaster的表明sysCache已經(jīng)無法恢復(fù)數(shù)據(jù)或保證數(shù)據(jù)正確性操作過程為查找分區(qū)查找一個(gè)分區(qū),傳入?yún)?shù)idx為磁盤上以分區(qū)為單位的分區(qū)編號(hào)。若指定無空 閑分區(qū)時(shí)重新分配,那么在查找失敗的情況下,盡力分配一個(gè)分區(qū)。查找過程中,若發(fā) 現(xiàn)有分區(qū)的引用計(jì)數(shù)為0,其狀態(tài)為CLEAN,而且dirty位圖非全0,那么則清空dirty位 圖。在分配過程中,如果發(fā)現(xiàn)本來應(yīng)該被分配的目標(biāo),其狀態(tài)為DIRTY,則啟動(dòng)一次對(duì) 它的刷新操作。讀操作讀請(qǐng)求入口,在這里,每個(gè)讀請(qǐng)求有三個(gè)去向1)重定向至后端存儲(chǔ)設(shè)備,讀完即止。2)從緩存設(shè)備讀基本塊,或者從后端存儲(chǔ)設(shè)備讀基本塊并緩存。3)重定向到后端存儲(chǔ)讀取基本塊,并且嘗試預(yù)取整個(gè)分區(qū).緩存操作流程如下1.檢測(cè)分區(qū)是否為NULL,若是轉(zhuǎn)42.test_and_set(EMPTY, FETCH),保證只有一個(gè)緩存者執(zhí)行后續(xù)操作。若test_and_set成功,對(duì)應(yīng)于狀態(tài)機(jī)Cl從EMPTY到FETCH的轉(zhuǎn)換;若失敗,轉(zhuǎn)43.讀后端存儲(chǔ),開始緩存過程(C2階段),若返回非0,表示很早出錯(cuò),則test_ and_set (FETCH, EMPTY),對(duì)應(yīng)于狀態(tài)機(jī)中C2 ( !)從FETCH到EMPTY的轉(zhuǎn)換。若 TAS失敗,對(duì)應(yīng)于狀態(tài)機(jī)中C2(!)在DIRTY,CLEAN, FLUSH等狀態(tài)上向自身的轉(zhuǎn)
換。然后釋放分區(qū),置分區(qū)變量為NULL,轉(zhuǎn)4;若讀后端存儲(chǔ)返回為0,至少當(dāng)前上下 文未出錯(cuò),直接返回。4.檢查基本分區(qū)是否為空,若非空,則退化為讀操作。5.若bio為空,則釋放分區(qū)寫操作大多數(shù)情況下,寫操作都是無條件地將分區(qū)狀態(tài)改為DIRTY,并開始寫入高速 緩存,原型如下1.檢測(cè)分區(qū)是否為空,若是則直接轉(zhuǎn)至后端存儲(chǔ)。2.檢查分區(qū)狀態(tài),如果為CLEAN,則表明之前為有效數(shù)據(jù)的讀數(shù)據(jù),需要首先 將其無效掉,設(shè)置狀態(tài)為INVAL。3.檢查分區(qū)的狀態(tài),若為FILL則一直循環(huán)等待4.將狀態(tài)設(shè)置為DIRTY,對(duì)應(yīng)于狀態(tài)機(jī)中所有經(jīng)Wl向DIRTY的轉(zhuǎn)換。這里要 注意的是需要原子地對(duì)狀態(tài)進(jìn)行檢測(cè)如果不是FILL才能設(shè)置成DIRTY。5.過程轉(zhuǎn)入W2.開始對(duì)高速緩存設(shè)備操作。
權(quán)利要求
1.一種基于狀態(tài)機(jī)的Cache并發(fā)訪問管理方法,其特征在于將多個(gè)基本存儲(chǔ)單元 劃歸為一個(gè)基本的Cache分區(qū),本分區(qū)內(nèi)所有存儲(chǔ)單元共享存儲(chǔ)狀態(tài),存儲(chǔ)狀態(tài)劃分為 多個(gè)細(xì)粒度子狀態(tài),子狀態(tài)間通過狀態(tài)機(jī)轉(zhuǎn)換;包括四種操作查找分區(qū)操作,讀操 作,緩存操作和寫操作。
2.如權(quán)利要求1所述一種基于狀態(tài)機(jī)的Cache并發(fā)訪問管理方法,其特征在于所述 子狀態(tài)間轉(zhuǎn)換不需要互斥或僅需要基于原子指令的同步原語。
3.如權(quán)利要求1所述一種基于狀態(tài)機(jī)的Cache并發(fā)訪問管理方法,其特征在于所述 子狀態(tài)包括 EMPTY, CLEAN, DIRTY, FETCH, FILLFLUSH 和 INVAL。
4.如權(quán)利要求1所述一種基于狀態(tài)機(jī)的Cache并發(fā)訪問管理方法,其特征在于所 述查找分區(qū)操作過程為傳入磁盤上分區(qū)編號(hào),若無制定空閑分區(qū)時(shí)重新分配;查找過 程中若發(fā)現(xiàn)有分區(qū)的引用計(jì)數(shù)為0,其狀態(tài)為CLEAN,而且DIRTY位圖非全0,則清空 DIRTY位圖;若分配過程中,發(fā)現(xiàn)本應(yīng)被分配的目標(biāo)狀態(tài)為DIRTY,則啟動(dòng)一次刷新操 作。
5.如權(quán)利要求1所述一種基于狀態(tài)機(jī)的Cache并發(fā)訪問管理方法,其特征在于所述 讀操作過程中,每個(gè)讀操作的請(qǐng)求可以有三個(gè)流向,分別為重定向至后端存儲(chǔ)設(shè)備,讀 完即止;從緩存設(shè)備讀基本塊,或者從后端存儲(chǔ)設(shè)備讀基本塊并緩存;重定向到后端存 儲(chǔ)讀取基本塊,并嘗試預(yù)取整個(gè)分區(qū)。
6.如權(quán)利要求1所述一種基于狀態(tài)機(jī)的Cache并發(fā)訪問管理方法,其特征在于所述 緩存操作過程如下A、檢測(cè)分區(qū)是否為空,若是轉(zhuǎn)D;B、測(cè)試并嘗試EMPTY至FETCH轉(zhuǎn)換,保證只有一個(gè)緩存者執(zhí)行后續(xù)操作,若失 敗,轉(zhuǎn)D;C、讀后端存儲(chǔ),開始緩存過程,若返回非0,則出錯(cuò),釋放分區(qū),置分區(qū)變量為 空,轉(zhuǎn)D;若后端存儲(chǔ)返回0,直接返回;D、檢查基本分區(qū)是否非空,若非空,則轉(zhuǎn)化為讀操作;7E、若BIO為空,則釋放分區(qū)。
7.如權(quán)利要求1所述一種基于狀態(tài)機(jī)的Cache并發(fā)訪問管理方法,其特征在于所述 寫操作在多數(shù)情況下都是無條件將分區(qū)狀態(tài)改為DIRTY,并寫入緩存,其過程為F、檢測(cè)分區(qū)是否為空,若是則直接轉(zhuǎn)至后端存儲(chǔ);G、檢查分區(qū)狀態(tài),若為CLEAN,則表明之前為有效數(shù)據(jù)的讀數(shù)據(jù),需要先將其無 效,設(shè)置狀態(tài)為INVAL ;H、檢查分區(qū)的狀態(tài),若為FILL則一直循環(huán)等待;I、當(dāng)狀態(tài)不是FILL時(shí)將狀態(tài)設(shè)置為DIRTY;J、寫緩存結(jié)束,開始對(duì)高速緩存設(shè)備操作。
全文摘要
本發(fā)明提供了一種基于狀態(tài)機(jī)的Cache并發(fā)訪問管理方法,將多個(gè)基本存儲(chǔ)單元?jiǎng)潥w為一個(gè)基本的Cache分區(qū),本分區(qū)內(nèi)所有存儲(chǔ)單元共享存儲(chǔ)狀態(tài),存儲(chǔ)狀態(tài)劃分為多個(gè)細(xì)粒度子狀態(tài),子狀態(tài)間通過狀態(tài)機(jī)轉(zhuǎn)換;包括四種操作查找分區(qū)操作,讀操作,緩存操作和寫操作。本發(fā)明在保證系統(tǒng)穩(wěn)定的前提下有效提高了緩存的訪問效率。
文檔編號(hào)G06F9/38GK102023845SQ20101061179
公開日2011年4月20日 申請(qǐng)日期2010年12月17日 優(yōu)先權(quán)日2010年12月17日
發(fā)明者袁清波, 許建衛(wèi), 鄭規(guī) 申請(qǐng)人:曙光信息產(chǎn)業(yè)(北京)有限公司