專利名稱:一種自動(dòng)將緩存在易失介質(zhì)中的數(shù)據(jù)寫回方法
技術(shù)領(lǐng)域:
本發(fā)明涉及磁盤緩存技術(shù),具體來(lái)說(shuō),涉及一種自動(dòng)將緩存在易失介質(zhì)中的數(shù)據(jù)寫回方法。
背景技術(shù):
在Linux操作系統(tǒng)中,當(dāng)應(yīng)用程序需要讀取文件中的數(shù)據(jù)時(shí),操作系統(tǒng)先分配一些內(nèi)存,將數(shù)據(jù)從存儲(chǔ)設(shè)備讀入到這些內(nèi)存中,然后再將數(shù)據(jù)分發(fā)給應(yīng)用程序;當(dāng)需要往文件中寫數(shù)據(jù)時(shí),操作系統(tǒng)先分配內(nèi)存接收用戶數(shù)據(jù),然后再將數(shù)據(jù)從內(nèi)存寫到磁盤上。文件Cache管理指的就是對(duì)這些由操作系統(tǒng)分配,并用來(lái)存儲(chǔ)文件數(shù)據(jù)的內(nèi)存的管理。Cache 管理的優(yōu)劣通過(guò)兩個(gè)指標(biāo)衡量一是Cache命中率,Cache命中時(shí)數(shù)據(jù)可以直接從內(nèi)存中獲取,不再需要訪問(wèn)低速外設(shè),因而可以顯著提高性能;二是有效Cache的比率,有效Cache 是指真正會(huì)被訪問(wèn)到的Cache項(xiàng),如果有效Cache的比率偏低,則相當(dāng)部分磁盤帶寬會(huì)被浪費(fèi)到讀取無(wú)用Cache上,而且無(wú)用Cache會(huì)間接導(dǎo)致系統(tǒng)內(nèi)存緊張,最后可能會(huì)嚴(yán)重影響性能。當(dāng)系統(tǒng)中物理內(nèi)存減少時(shí),Linux內(nèi)存管理子系統(tǒng)必須釋放物理頁(yè)面。這個(gè)任務(wù)由核心交換后臺(tái)進(jìn)程(kswapd)來(lái)完成。核心交換后臺(tái)進(jìn)程是一種特殊的核心線程,它是沒(méi)有虛擬內(nèi)存的進(jìn)程,在物理地址空間上以核心態(tài)運(yùn)行,其目標(biāo)是保證系統(tǒng)中有足夠的空閑頁(yè)面來(lái)維持內(nèi)存管理系統(tǒng)運(yùn)行效率。此進(jìn)程由核心的init進(jìn)程在系統(tǒng)啟動(dòng)時(shí)運(yùn)行,被核心交換定時(shí)器周期性的調(diào)用。當(dāng)定時(shí)器到時(shí)后,交換后臺(tái)進(jìn)程將檢查系統(tǒng)中的空閑頁(yè)面數(shù)是否太少。它使用兩個(gè)變量free_pages_high和free_page_l0W來(lái)判斷是否該釋放一些頁(yè)面。只要系統(tǒng)中的空閑頁(yè)面數(shù)大于free_pageS_high,核心交換后臺(tái)進(jìn)程不做任何工作; 它將睡眠到下一次定時(shí)器到時(shí)。如果系統(tǒng)中的空閑頁(yè)面數(shù)在free_pageS_high甚至free_ pages_low以下時(shí),核心交換后臺(tái)進(jìn)程將會(huì)選擇一部分頁(yè)面將其交換出去。以上是將磁盤數(shù)據(jù)緩存在內(nèi)存中時(shí)操作系統(tǒng)將數(shù)據(jù)寫回的機(jī)制,這些緩存的數(shù)據(jù)操作系統(tǒng)以及讀寫這些數(shù)據(jù)的應(yīng)用程序是知道其沒(méi)有被寫入磁盤的,所以在系統(tǒng)掉電的情況下即便數(shù)據(jù)沒(méi)有被寫入磁盤影響也不大。現(xiàn)在存在另外一種情況,某些程序使用device mapper機(jī)制將高速設(shè)備作為慢速設(shè)備的緩存,并向上提供與磁盤完全一致的接口,這樣當(dāng)數(shù)據(jù)寫入此接口后,操作系統(tǒng)與應(yīng)用程序確信已經(jīng)不會(huì)丟失了,但實(shí)際情況卻是這些數(shù)據(jù)被緩存到了一個(gè)高速易失設(shè)備上,在掉電時(shí)這些數(shù)據(jù)將會(huì)丟失,而操作系統(tǒng)和應(yīng)用程序完全不知道這種情況,這時(shí)的數(shù)據(jù)丟失是比較嚴(yán)重的。所以必須提供一種相對(duì)及時(shí)的自動(dòng)寫回機(jī)制來(lái)減少數(shù)據(jù)丟失發(fā)生的幾率。
發(fā)明內(nèi)容
為解決上述問(wèn)題,本發(fā)明提出了一種自動(dòng)將緩存在易失介質(zhì)中的數(shù)據(jù)寫回方法。一種自動(dòng)將緩存在易失介質(zhì)中的數(shù)據(jù)寫回方法,將低速設(shè)備與高速設(shè)備分別劃分 region管理,管理region的數(shù)據(jù)結(jié)構(gòu)在內(nèi)存中,對(duì)一個(gè)region的操作首先調(diào)用讀取接口,操作完成后調(diào)用釋放接口釋放;在系統(tǒng)建立時(shí)創(chuàng)建后臺(tái)沖洗線程,沖洗線程在沒(méi)有任務(wù)時(shí)處于睡眠狀態(tài),在對(duì) region操作完成后喚醒沖洗線程,沖洗線程根據(jù)策略將region寫回低速設(shè)備。優(yōu)選的,所述沖洗線程在被喚醒后的工作過(guò)程為判斷是否存在臟region,如果沒(méi)有則繼續(xù)睡眠;如果存在臟region,根據(jù)策略寫回臟region ;如果臟region的數(shù)量大于零,從高速設(shè)備中讀出臟region寫入低速設(shè)備;如果策略暫時(shí)不允許寫回,則延遲,之后再重新執(zhí)行沖洗線程。優(yōu)選的,所述策略包括只考慮安全不考慮性能的強(qiáng)制寫回,兼顧安全和性能的無(wú) 10訪問(wèn)時(shí)寫回和只考慮性能不考慮安全的不寫回。優(yōu)選的,所述沖洗線程存在一個(gè)運(yùn)行標(biāo)志位,用于避免兩個(gè)沖洗線程同時(shí)執(zhí)行。優(yōu)選的,所述沖洗線程存在一個(gè)執(zhí)行標(biāo)志位,用于判斷是否沖洗線程剛剛執(zhí)行完畢;如果執(zhí)行標(biāo)志位為空,則繼續(xù)執(zhí)行;如果執(zhí)行標(biāo)志位不為空,則延遲后,再重新執(zhí)行時(shí)判斷是否有臟region ;如果沒(méi)有則清空運(yùn)行和執(zhí)行標(biāo)志位,進(jìn)入休眠,如果有則寫回。優(yōu)選的,所述沖洗線程在寫回時(shí)判斷臟region是否為連續(xù)區(qū)域,如果為連續(xù)區(qū)域,則只讀這一區(qū)域;如果不為連續(xù)區(qū)域,則讀整個(gè)region區(qū)域,再?gòu)拇疟P中讀入整個(gè) region區(qū)域,根據(jù)臟位圖將高速設(shè)備上的臟數(shù)據(jù)寫回磁盤。
圖1是本發(fā)明的緩存映射圖
具體實(shí)施例方式本發(fā)明的一種使用場(chǎng)景如圖1所示,低速設(shè)備與高速設(shè)備分別劃分為若干個(gè) region,他們之間通過(guò)組相連方式映射,管理每個(gè)region的數(shù)據(jù)結(jié)構(gòu)為struct region,位于內(nèi)存中。每次對(duì)一個(gè)region進(jìn)行操作時(shí)必須調(diào)用接口——get_regi0n (),用完后必須調(diào)用 put_region()釋放。在系統(tǒng)建立的時(shí)候創(chuàng)建后臺(tái)進(jìn)程flush_WOrk,此進(jìn)程沒(méi)有任務(wù)的時(shí)候處于睡眠狀態(tài),在需要其做寫回操作的時(shí)候再將其喚醒。考慮到將臟數(shù)據(jù)寫入高速緩存設(shè)備的時(shí)候必然存在get_regi0n()和put_regi0n()的操作,而調(diào)用put_regi0n()時(shí)臟數(shù)據(jù)已經(jīng)寫入緩存,所以本發(fā)明在put_regi0n()操作里將flush_Work喚醒并執(zhí)行如下操作1、判斷是否有臟region,如果沒(méi)有則繼續(xù)睡眠;2、如果有臟數(shù)據(jù),則可以根據(jù)之前設(shè)定的策略計(jì)算需要寫回的臟region的數(shù)量a)強(qiáng)制寫回——只考慮安全性,不考慮性能;b)無(wú)10訪問(wèn)時(shí)寫回——兼顧安全性和性能;c)不寫回——只考慮性能,不考慮安全性;3、如果臟region數(shù)量大于零則啟動(dòng)寫回過(guò)程a)從高速設(shè)備上讀出臟數(shù)據(jù);b)寫入低速設(shè)備;4、如果策略暫時(shí)不允許寫回則延遲一定時(shí)間后再重新執(zhí)行flush_Work ;
4
對(duì)于一對(duì)設(shè)備只需要啟動(dòng)一次flush_Work,但是一對(duì)設(shè)備存在著很多的region, 對(duì)每一個(gè)region執(zhí)行put_region()時(shí)都會(huì)試圖執(zhí)行flush_work,為了避免同時(shí)執(zhí)行多次 flush_work,采用如下策略if (test_and_set_bit(0, &flushing))return ;通過(guò)設(shè)置flushing第0位來(lái)防止兩個(gè)以上流程執(zhí)行下面的流程,如果此位為0, 那么設(shè)置成功,繼續(xù)執(zhí)行;如果此為為1,則失敗,直接返回,現(xiàn)在的flush_WOrk已經(jīng)在運(yùn)行了,不必?fù)?dān)心臟數(shù)據(jù)無(wú)法寫回低速設(shè)備。進(jìn)入flush_W0rk后,也要執(zhí)行類似的操作
if(test—and—set—bit (1,&flushing)) { if (!reg_dirty) {
SCINFO(0, "bits cleared"); clear—bit(1, &flushing); clear_bit(0, &flushing);
return;
}
}此操作試圖將flushing的第1為設(shè)置為1并返回其原來(lái)的值,如果原來(lái)為0表明是第一遍進(jìn)入flush_WOrk,則繼續(xù)往下執(zhí)行;如果為1則表示之前執(zhí)行過(guò)flush_WOrk,且延遲一定時(shí)間后再次執(zhí)行,這時(shí)判斷是否有臟region,如果沒(méi)有則清空f(shuō)lushing的第0位和第1位,flush_work重新進(jìn)入睡眠狀態(tài)。如果沒(méi)有進(jìn)入睡眠狀態(tài),則根據(jù)用戶的寫回策略判斷現(xiàn)在有多少需要寫回的 region,只要數(shù)量大于0則進(jìn)入寫回流程。寫回的第一步是從高速設(shè)備讀所有的臟數(shù)據(jù)。 若臟數(shù)據(jù)為單一連續(xù)區(qū)域,則只讀這個(gè)區(qū)域,讀回來(lái)無(wú)誤則直接寫入磁盤;否則讀整個(gè) region (可優(yōu)化為只讀多個(gè)臟數(shù)據(jù)區(qū)的最左邊界至最右邊界),讀回來(lái)無(wú)誤,再?gòu)拇疟P讀入整個(gè)region,然后根據(jù)dirty位圖將高速設(shè)備上最新的數(shù)據(jù)拷貝至磁盤回來(lái)的bio中,再將此bio寫回磁盤。準(zhǔn)備過(guò)程1.分配一個(gè)xinfo結(jié)構(gòu)和一個(gè)rbio,若成功轉(zhuǎn)2,否則set_state (DIRTY);2.此處資源分配成功,檢測(cè)當(dāng)前dirty位圖,確定左右邊界,以及是否為單一連續(xù)區(qū)域,然后執(zhí)行如下二選一路徑a)若為單一連續(xù)區(qū)域在region或者xinfo中標(biāo)記其為連續(xù)的,設(shè)置rbio的左右邊界禾口 sizeb)否則為多個(gè)連續(xù)區(qū)域設(shè)置左右邊界為region的左右邊界
3.設(shè)置 xinfo 和 rbio 其它相關(guān)域,以 wb_read_cache_endio 作為 bi_end_io,將 rbio發(fā)送至高速設(shè)備。從高速設(shè)備中讀出數(shù)據(jù)后(Wb_read_CaChe_endi0)1.記錄 error 于 xinfo- > err2.檢查xinfo- > err,若不為0,則轉(zhuǎn)6,若為0表示沒(méi)有出現(xiàn)錯(cuò)誤3.若此region上dirty數(shù)據(jù)構(gòu)成單一連續(xù)區(qū)域,則修改bio相關(guān)域,以wb_write_ disk_end_io作為其bi_end_io函數(shù),轉(zhuǎn)發(fā)至磁盤,然后return4.此region上dirty數(shù)據(jù)不連續(xù),需要讀disk,分配一個(gè)rbio,若失敗,轉(zhuǎn)65.設(shè)置此 bio,從 disk 讀整個(gè) region.以 wb_read_disk_endio 作為 bi_end_io, 轉(zhuǎn)發(fā)至磁盤,然后return6. set_state(DIRTY)7·解鎖 flush_loCk,釋放資源臟數(shù)據(jù)不連續(xù),從磁盤讀出數(shù)據(jù)后(Wb_read_disk_endi0)1.記錄 error 于 xinfo- > err ;檢查 bi_size,若大于 0,貝U return2.檢查 xinfo- > err,若非 0,轉(zhuǎn) 73.無(wú)錯(cuò)誤發(fā)生,記錄一份region的dirty位圖拷貝,測(cè)試region當(dāng)前狀態(tài),若為 DIRTY,轉(zhuǎn) 74.讀cache數(shù)據(jù)有效,依據(jù)dirty位圖拷貝,將cache bio中的dirty數(shù)據(jù)copy 至剛返回的disk bio中5.釋放 cache bio,修改 disk bio 相應(yīng)域,以 wb_write_disk_endio 作為 bi_end_ io,轉(zhuǎn)發(fā)至磁盤6. return7. set_state (DIRTY)8·釋放資源,解鎖 flush_loCk所有數(shù)據(jù)準(zhǔn)備完畢,寫入磁盤后(Wb_Write_diSk_endi0)1.記錄 error 于 xinfo-> err ;檢查 bi_size,若大于 0,貝U return2.檢查 xinfo- > err,若非 0,則按嚴(yán)重錯(cuò)誤處理,set_state (DIRTY),轉(zhuǎn) 43.無(wú) error, test_and_set_state (FLUSH, CLEAN)4.釋放相應(yīng)資源,解鎖fluSh_lock。
權(quán)利要求
1.一種自動(dòng)將緩存在易失介質(zhì)中的數(shù)據(jù)寫回方法,其特征在于將低速設(shè)備與高速設(shè)備分別劃分region管理,管理region的數(shù)據(jù)結(jié)構(gòu)在內(nèi)存中,對(duì)一個(gè)region的操作首先調(diào)用讀取接口,操作完成后調(diào)用釋放接口釋放;在系統(tǒng)建立時(shí)創(chuàng)建后臺(tái)沖洗線程,沖洗線程在沒(méi)有任務(wù)時(shí)處于睡眠狀態(tài),在對(duì)region 操作完成后喚醒沖洗線程,沖洗線程根據(jù)策略將region寫回低速設(shè)備。
2.如權(quán)利要求1所述的方法,其特征在于所述沖洗線程在被喚醒后的工作過(guò)程為判斷是否存在臟region,如果沒(méi)有則繼續(xù)睡眠;如果存在臟region,根據(jù)策略寫回臟region ;如果臟region的數(shù)量大于零,從高速設(shè)備中讀出臟region寫入低速設(shè)備;如果策略暫時(shí)不允許寫回,則延遲,之后再重新執(zhí)行沖洗線程。
3.如權(quán)利要求1或2所述的方法,其特征在于所述策略包括只考慮安全不考慮性能的強(qiáng)制寫回,兼顧安全和性能的無(wú)IO訪問(wèn)時(shí)寫回和只考慮性能不考慮安全的不寫回。
4.如權(quán)利要求1所述的方法,其特征在于所述沖洗線程存在一個(gè)運(yùn)行標(biāo)志位,用于避免兩個(gè)沖洗線程同時(shí)執(zhí)行。
5.如權(quán)利要求1所述的方法,其特征在于所述沖洗線程存在一個(gè)執(zhí)行標(biāo)志位,用于判斷是否沖洗線程剛剛執(zhí)行完畢;如果執(zhí)行標(biāo)志位為空,則繼續(xù)執(zhí)行;如果執(zhí)行標(biāo)志位不為空,則延遲后,再重新執(zhí)行時(shí)判斷是否有臟region;如果沒(méi)有則清空運(yùn)行和執(zhí)行標(biāo)志位,進(jìn)入休眠,如果有則寫回。
6.如權(quán)利要求1、2、4、5任一所述的方法,其特征在于所述沖洗線程在寫回時(shí)判斷臟 region是否為連續(xù)區(qū)域,如果為連續(xù)區(qū)域,則只讀這一區(qū)域;如果不為連續(xù)區(qū)域,則讀整個(gè) region區(qū)域,再?gòu)拇疟P中讀入整個(gè)region區(qū)域,根據(jù)臟位圖將高速設(shè)備上的臟數(shù)據(jù)寫回磁ο
全文摘要
本發(fā)明提供了一種自動(dòng)將緩存在易失介質(zhì)中的數(shù)據(jù)寫回方法,將低速設(shè)備與高速設(shè)備分別劃分region管理,管理region的數(shù)據(jù)結(jié)構(gòu)在內(nèi)存中,對(duì)一個(gè)region的操作首先調(diào)用讀取接口,操作完成后調(diào)用釋放接口釋放;在系統(tǒng)建立時(shí)創(chuàng)建后臺(tái)沖洗線程,沖洗線程在沒(méi)有任務(wù)時(shí)處于睡眠狀態(tài),在對(duì)region操作完成后喚醒沖洗線程,沖洗線程根據(jù)策略將region寫回低速設(shè)備。
文檔編號(hào)G06F13/16GK102521173SQ20111036387
公開(kāi)日2012年6月27日 申請(qǐng)日期2011年11月17日 優(yōu)先權(quán)日2011年11月17日
發(fā)明者劉新春, 袁清波, 許建衛(wèi), 邵宗有 申請(qǐng)人:曙光信息產(chǎn)業(yè)(北京)有限公司