專利名稱:一種基于文件系統(tǒng)緩存的自適應(yīng)預(yù)讀取方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種對磁盤進行讀寫搮作的方法,尤其是一種在讀寫過程 中,基于文件系統(tǒng)緩存的預(yù)讀取方法。
背景技術(shù):
無論是讀操作還是寫操作,磁盤驅(qū)動器存取通常比內(nèi)存存取慢得多。 對于一般的設(shè)備操作,當(dāng)用戶需要進行讀寫操作時,直接對磁盤進行數(shù)據(jù) 讀寫,這種磁盤操作方式非常慢,因此容易阻塞應(yīng)用程序,同時由于沒有 優(yōu)化磁頭,需要頻繁的移動磁頭,效率也很低。文件系統(tǒng)緩存層就是為了解決這個問題而設(shè)計的。它的基本思想是在上層用戶的磁盤操作與實際 的設(shè)備操作之間添加了 一個數(shù)據(jù)緩沖區(qū),利用這個緩沖區(qū)來實現(xiàn)磁盤操作 性能的優(yōu)化。文件系統(tǒng)緩存層的主要功能有三個保存最近使用的數(shù)據(jù)塊, 減少讀取塊設(shè)備的次數(shù);優(yōu)化寫操作,減少磁頭移動次數(shù);提供預(yù)讀取功能。由于上層文件系統(tǒng)組織文件時盡量把同 一個文件安排在連續(xù)的空間 中,因此應(yīng)用程序從塊設(shè)備中讀取當(dāng)前扇區(qū)時,鄰接扇區(qū)的內(nèi)容也有很大 可能下次被使用到。使用預(yù)讀取功能,可以在獲取當(dāng)前扇區(qū)的數(shù)據(jù)時,把 鄰接的指定個數(shù)的扇區(qū)數(shù)據(jù)也獲取并存放在緩存區(qū)中,以免下次需要使用 這些數(shù)據(jù)時再把硬盤磁頭移動到指定位置進行獲取,以減少磁頭移動次 數(shù)。這個功能在緩存足夠大的情況下,對于多任務(wù)訪問不同的連續(xù)文件時 性能有很大提高。但是,如果預(yù)讀取算法使用不當(dāng),則會對性能有一定負面影響。因為 被預(yù)讀取的數(shù)據(jù)并不一定^皮使用到,此時預(yù)讀取的這些無用數(shù)據(jù)反而會增 加上層應(yīng)用等待從磁盤獲取數(shù)據(jù)的時間。并且緩存區(qū)的大小并不是無限大 的,在緩存滿的情況下,需要淘汰緩存中的其它數(shù)據(jù)來存放預(yù)取的數(shù)據(jù),因此可能發(fā)生預(yù)取的址圾數(shù)據(jù)替換了緩存中的有用數(shù)據(jù)的情況。在嵌入式文件系統(tǒng)中,預(yù)取操作實現(xiàn)得比較簡單,通常是按照預(yù)先分 配的緩存區(qū)大小來確定預(yù)讀取區(qū)的大小,每次進行預(yù)取搡作時從磁盤中讀 取的扇區(qū)數(shù)在初始化時就已經(jīng)確定好了 。這種預(yù)取操作沒有復(fù)雜的算法設(shè) 計,在讀取連續(xù)文件時效率很高,但是當(dāng)文件比較零散時,有可能預(yù)讀取 到過多的垃圾數(shù)據(jù)。發(fā)明內(nèi)容本發(fā)明的目的在于提供一種基于文件系統(tǒng)緩存的自適應(yīng)預(yù)讀取管理 用以減少預(yù)讀取的垃圾扇區(qū)數(shù)。本發(fā)明的技術(shù)方案包括一種基于文件系統(tǒng)緩存的自適應(yīng)預(yù)讀取方法,包括以下步驟(1) 建立預(yù)讀取扇區(qū)使用記錄;(2) 每次執(zhí)行預(yù)讀取操作時,在所述預(yù)讀取扇區(qū)使用記錄中,記錄 預(yù)讀取的扇區(qū)數(shù);(3) 使用預(yù)讀取的扇區(qū)時,在所述預(yù)讀取扇區(qū)使用記錄中,記錄使 用的預(yù)讀取扇區(qū)數(shù);(4) 根據(jù)以前的預(yù)讀取扇區(qū)數(shù)和預(yù)讀取扇區(qū)的使用數(shù),計算出以前 預(yù)讀取扇區(qū)的使用率,并才艮據(jù)該使用率來確定當(dāng)前預(yù)讀取操作中預(yù)讀取的 扇區(qū)數(shù)。進一步,上述步驟(l)中,建立N個預(yù)讀取扇區(qū)使用記錄,分別記 錄最接近當(dāng)前預(yù)讀取操作的以前N次預(yù)讀取操作的預(yù)讀取扇區(qū)的使用情 況。進一步,所述每個記錄至少包括預(yù)讀取扇區(qū)數(shù)和預(yù)讀取扇區(qū)使用數(shù)兩 個字段,并且所述步驟(2)中,在預(yù)讀取扇區(qū)數(shù)字段中,記錄某次預(yù)讀 取操作預(yù)讀取的扇區(qū)數(shù)量;所述步驟(3)中,在預(yù)讀取扇區(qū)使用數(shù)字段 中,記錄對該次預(yù)讀取扇區(qū)的使用數(shù)量。進一步,所述步驟(2)包括預(yù)先設(shè)定預(yù)讀取扇區(qū)數(shù)的最大值,首 次執(zhí)行預(yù)讀取操:作時預(yù)讀取的扇區(qū)數(shù)不大于該最大值。進一步,所述步驟(2)還包括將每次預(yù)讀取的扇區(qū)存放在一個緩 存塊中,并在緩存塊控制結(jié)構(gòu)中,給每個存放預(yù)讀取扇區(qū)的緩存塊賦予一 個索引值,記錄該緩存塊存放的扇區(qū)是通過哪次預(yù)讀取操作預(yù)讀取的;所 述步驟(3)包括在使用存放預(yù)讀取扇區(qū)的緩存塊時,根據(jù)所述索引值 確定所使用的扇區(qū)是通過哪次預(yù)讀取操作預(yù)讀取的,并在記錄該次預(yù)讀取 操作預(yù)讀取的扇區(qū)數(shù)的記錄中,記錄使用的預(yù)讀取扇區(qū)數(shù)。進一步,上述方法包括所述步驟(4)中,計算出每個記錄中預(yù)讀 取扇區(qū)使用數(shù)和預(yù)讀取扇區(qū)數(shù)的比值,作為一次預(yù)讀取操作預(yù)讀取的扇區(qū) 的使用率;計算出N次預(yù)讀取操作預(yù)讀取的扇區(qū)的平均使用率,再乘以 所述預(yù)先設(shè)定的預(yù)讀取扇區(qū)數(shù)的最大值,得出當(dāng)前預(yù)讀取操作的預(yù)讀取扇 區(qū)數(shù)。上述方法中,所述步驟(1)進一步可包括每個記錄還有一個權(quán)值 字段,并為每個記錄分配一個權(quán)值,權(quán)值的分配原則是離當(dāng)前預(yù)讀取操作 越近的記錄的權(quán)值越大,并且使所有權(quán)值的和為100%。進一步,所述步驟(4)中,計算出每個記錄中預(yù)讀取扇區(qū)使用數(shù)和 預(yù)讀取扇區(qū)數(shù)的比值,并乘以該記錄對應(yīng)的權(quán)值,得出每次預(yù)讀取操作預(yù) 讀取的扇區(qū)的加權(quán)使用率;將N次預(yù)讀取的扇區(qū)的加權(quán)使用率相加,并 乘以預(yù)先設(shè)定的預(yù)讀取扇區(qū)數(shù)的最大值,得出當(dāng)前預(yù)讀取操作的預(yù)讀取扇 區(qū)數(shù)。本發(fā)明所提供的方法,由于在每次預(yù)讀取時都會通過前面多次預(yù)讀取 數(shù)據(jù)的使用比率來確定本次預(yù)讀取數(shù)據(jù)的大小,因此相比現(xiàn)有技術(shù)使用一 個固定預(yù)取值的算法,減少了垃圾扇區(qū)數(shù)的讀取。而且本發(fā)明記錄的歷史 信息內(nèi)敘艮少,計算邏輯簡單,比較適合嵌入式系統(tǒng)中文件系統(tǒng)緩存的管 理。附困說明圖l是預(yù)讀取扇區(qū)使用記錄的數(shù)據(jù)結(jié)構(gòu)示意圖; 圖2是文件系統(tǒng)緩存塊控制結(jié)構(gòu)示意圖; 圖3是采用本發(fā)明方法的讀寫搡作流程圖; 圖4是一種離散文件的分布示意圖。
具體實施方式
以下結(jié)合附圖及較佳實施例,對本發(fā)明的實施方式進行較為詳細的說明。本發(fā)明的方法能對基于文件系統(tǒng)緩存的預(yù)讀取數(shù)據(jù)大小進行自適應(yīng) 調(diào)整,其包括以下基本處理步驟建立預(yù)讀取扇區(qū)使用記錄;每次執(zhí)行預(yù)讀取操作時,在所述預(yù)讀取數(shù)據(jù)使用記錄中,記錄預(yù)讀取 的扇區(qū)數(shù);使用預(yù)讀取的扇區(qū)時,在所述預(yù)讀取數(shù)據(jù)使用記錄中,記錄使用的預(yù) 讀取扇區(qū)數(shù);根據(jù)以前的預(yù)讀取扇區(qū)數(shù)和預(yù)讀取扇區(qū)的使用數(shù),計算出以前預(yù)讀取 扇區(qū)的使用率,并根據(jù)該使用率來確定當(dāng)前預(yù)讀取操作中預(yù)讀取的扇區(qū)數(shù)。本發(fā)明的預(yù)讀取扇區(qū)使用記錄的數(shù)據(jù)結(jié)構(gòu)至少包括預(yù)讀取扇區(qū)數(shù)和 預(yù)讀取扇區(qū)使用數(shù)兩個字段。圖l是預(yù)讀取扇區(qū)使用記錄的數(shù)據(jù)結(jié)構(gòu)示意圖,其中有預(yù)讀取的扇區(qū)字段。圖l所示的實施例中,數(shù)據(jù)結(jié)構(gòu)還包括有權(quán)值(adcPreReadPower)字段。adcPreReadBlocks表示每次執(zhí)行預(yù)讀取操作時預(yù)讀取的扇區(qū)數(shù), adcPreReadUsedBlocks表示adcPreReadBlocks個扇區(qū)中被使用的扇區(qū)數(shù), adcPreReadUsedBlocks與adcPreReadBlocks的比值就是預(yù)讀取扇區(qū)的使用率。本發(fā)明為了使預(yù)讀取的扇區(qū)數(shù)盡可能接近實際使用的扇區(qū)數(shù)量,可記 錄并統(tǒng)計多次以前的預(yù)讀取操作的預(yù)讀取扇區(qū)的使用率。
圖1所示的實施例中,設(shè)定預(yù)讀取扇區(qū)使用記錄的個數(shù)共有N個,分別記錄最接近當(dāng)前 預(yù)讀取操作的以前N次預(yù)讀取操作的預(yù)讀取扇區(qū)的使用情況。上層用戶創(chuàng)建塊設(shè)備時,對塊設(shè)備的控制結(jié)構(gòu)進行初始化,同時對預(yù) 讀取扇區(qū)使用記錄的數(shù)據(jù)結(jié)構(gòu)進行初始化。當(dāng)有N個記錄時,首先對N 個記錄的數(shù)據(jù)結(jié)構(gòu)進行初始化。預(yù)讀取扇區(qū)4吏用記錄初始化時,將adcPreReadBlocks和 adcPrcReadUsedBlocks的值都i殳置為1,即歷史的預(yù)讀取扇區(qū)使用率為 100%。可以為每個記錄分配一個權(quán)值來表示其在總的使用率中占的比重, 權(quán)值的分配原則是離當(dāng)前預(yù)取操作越近的記錄的權(quán)值越大,并且N個權(quán) 值的和應(yīng)為100%。如圖l所示,權(quán)值共有N個,從權(quán)值l、權(quán)值2到權(quán) 值N按遞減的順序排列,指針l總是指向權(quán)值l,表示最近一次預(yù)讀取操 作預(yù)讀取的扇區(qū)的使用率的權(quán)值。根據(jù)文件系統(tǒng)緩存區(qū)的大小,設(shè)定一個 預(yù)讀取的最大值MAX—READ AHEAD,首次預(yù)讀取扇區(qū)的數(shù)量不大于 MAX_READAHEAD。圖1中,指針2總是指向最近一次預(yù)讀取扇區(qū)使用記錄所在的位置。 指針2的值在0到N-1之間循環(huán)遞增,達到N-1后,重新從O開始。 從磁盤中預(yù)讀取塊后,把預(yù)讀取的扇區(qū)數(shù)填入指針2當(dāng)前值加1的位置上 的記錄的adcPreReadBlocks字段中,并把該記錄的adcPreReadUsedBlocks 字段設(shè)置為O,然后指針2的當(dāng)前值加1,使指針2繼續(xù)指向最近一次預(yù) 讀取數(shù)據(jù)使用記錄所在的位置。在文件系統(tǒng)緩存的控制結(jié)構(gòu)中有一個總的索引值globallndex,該值初 始化時為0,每次執(zhí)行預(yù)讀取操作后該值就遞增1。圖2是文件系統(tǒng)緩存塊控制結(jié)構(gòu)示意圖,每個緩存塊控制結(jié)構(gòu)中都有 一個索引值index,及一個預(yù)讀取屬性字段bPreRead。當(dāng)把該緩存塊用來 存儲預(yù)讀取的扇區(qū)時,把globallndex賦給該緩存塊控制結(jié)構(gòu)的index,標(biāo) 記該緩存塊是在哪次預(yù)讀取操作時獲取的,并且把該緩存塊控制結(jié)構(gòu)中的預(yù)讀取屬性字段.bPreRead i殳為TRUE,表示該緩存塊是通過預(yù)讀取獲取 的。圖3是本發(fā)明的讀寫操作流程圖。對于讀緩存塊搡作,首先判斷所讀 的緩存塊的控制結(jié)構(gòu)的bPreRead字段是否為TRUE,如果不為TRUE,表 示該緩存塊不是通過預(yù)讀取方式獲取的,不用把該緩存塊使用信息記錄到 預(yù)讀取扇區(qū)使用記錄中;如果bPreRead字段為TRUE,還要繼續(xù)判斷 globallndex與緩存塊控制結(jié)構(gòu)中的index差值是否小于等于N,如杲大于 N,則這個緩存塊的使用信息不在統(tǒng)計的范圍之內(nèi);如果小于等于N,則 把index模上N,就可以得到該緩存塊使用信息記錄的位置。把該位置上 的adcPreReadUse犯locks字段加1,并把該緩存塊控制結(jié)構(gòu)的bPreRead 字段設(shè)為FALSE,表示該緩存塊的使用信息已記錄到預(yù)讀取扇區(qū)使用記 錄中,下次使用時不再記錄。對于寫緩存塊操作,首先判斷是否按扇區(qū)方式來寫。如果是按字節(jié)方 式寫,則該緩存塊的使用信息與上述的讀操作一樣記錄在預(yù)讀取扇區(qū)使用 記錄中;如果是按扇區(qū)邊界對齊寫,則該預(yù)讀取的緩存塊是屬于預(yù)讀取的 垃圾數(shù)據(jù),把該緩存塊控制結(jié)構(gòu)中的bPreRead字段設(shè)為FALSE。在發(fā)起預(yù)讀取搮作時,要計算本次預(yù)讀取扇區(qū)的數(shù)量。 首先要計算以前預(yù)讀取扇區(qū)的使用率,將該使用率乘以預(yù)先設(shè)定的預(yù)讀取扇區(qū)數(shù)的最大值MAX—READ AHEAD,即得出本次預(yù)讀取扇區(qū)的數(shù)量。當(dāng)有N個記錄時,可以計算出N個記錄的預(yù)讀取扇區(qū)的平均使用率 將該平均使用率乘以預(yù)先設(shè)定的預(yù)讀取扇區(qū)數(shù)的最大值,即得出本次預(yù)讀 取扇區(qū)的數(shù)量。為了使預(yù)讀取的扇區(qū)數(shù)盡可能接近實際使用的扇區(qū)數(shù),還可以計算出 N個記錄的加權(quán)使用率adcUseRate,計算公式如下所示adcUseRate=adcPreReadUsedBlocks(i)/adcPreReadBlocks(i)* adcPreReadPower(j)其中i是從圖1所示的指針2作為起始值,每次遞減該值,當(dāng)遞減到O后再從N - 1開始遞減;j是從指針1作為起始值,每次遞增該值,當(dāng)遞 增到N - 1后再從0開始遞增。按上迷公式計算N次,可得到N個使用率,N個使用率的和便是預(yù) 讀取數(shù)據(jù)的加權(quán)使用率。把加權(quán)使用率乘上預(yù)先設(shè)定的預(yù)讀取扇區(qū)數(shù)的最 大值MAX—READ AHEAD,就得到本次預(yù)讀取的扇區(qū)數(shù)。圖4所示為硬盤一段連續(xù)的空間,其中白色部分是某文件占用的空 間,上面的數(shù)字是文件的邏輯扇區(qū)號,灰色部分不屬于該文件空間。圖4 中的文件屬于占用空間不連續(xù)的文件。采用現(xiàn)有技術(shù)的固定值預(yù)讀取方 法,如果把預(yù)讀取大小固定設(shè)為16,則每次預(yù)讀取時都會讀取12個扇區(qū) 的垃圾數(shù)據(jù);采用本發(fā)明的方法,如果把MAX一READAHEAD設(shè)為16, 使用上述的自適應(yīng)算法,則會慢慢收斂到合適的預(yù)讀取大小,減少了垃圾 數(shù)據(jù)的讀取??梢?,采用本發(fā)明的自適應(yīng)預(yù)讀取方法,在文件內(nèi)容分布離散的情況 下,可以顯著減少垃圾數(shù)據(jù)的讀取。而且由于計算方法簡單,即使在文件 內(nèi)容連續(xù)的情況下,相比使用固定預(yù)讀取大小的方法,性能也不會下降。應(yīng)當(dāng)說明的是,上述具體實施例僅僅是為闡述本發(fā)明的方法而列舉的 較佳實施方式,不應(yīng)理解為對本發(fā)明的專利保護范圍的限制,本發(fā)明的專 利保護范圍應(yīng)以所附權(quán)利要求為準(zhǔn)。
權(quán)利要求
1. 一種基于文件系統(tǒng)緩存的自適應(yīng)預(yù)讀取方法,包括以下步驟(1)建立預(yù)讀取扇區(qū)使用記錄;(2)每次執(zhí)行預(yù)讀取操作時,在所述預(yù)讀取扇區(qū)使用記錄中,記錄預(yù)讀取的扇區(qū)數(shù);(3)使用預(yù)讀取的扇區(qū)時,在所述預(yù)讀取扇區(qū)使用記錄中,記錄使用的預(yù)讀取扇區(qū)數(shù);(4)根據(jù)以前的預(yù)讀取扇區(qū)數(shù)和預(yù)讀取扇區(qū)的使用數(shù),計算出以前預(yù)讀取扇區(qū)的使用率,并根據(jù)該使用率來確定當(dāng)前預(yù)讀取操作中預(yù)讀取的扇區(qū)數(shù)。
2. 如權(quán)利要求l所述的方法,其特征在于所述步驟(l)中,建立 N個預(yù)讀取扇區(qū)使用記錄,分別記錄最接近當(dāng)前預(yù)讀取操作的以前N次 預(yù)讀取操作的預(yù)讀取扇區(qū)的使用情況。
3. 如權(quán)利要求2所述的方法,其特征在于所述每個記錄至少包括 預(yù)讀取扇區(qū)數(shù)和預(yù)讀取扇區(qū)使用數(shù)兩個字段。
4. 如權(quán)利要求3所述的方法,其特征在于所述步驟(2)中,在預(yù) 讀取扇區(qū)數(shù)字段中,記錄某次預(yù)讀取操作預(yù)讀取的扇區(qū)數(shù)量;所述步驟(3 ) 中,在預(yù)讀取扇區(qū)使用數(shù)字段中,記錄對該次預(yù)讀取扇區(qū)的使用數(shù)量。
5. 如權(quán)利要求4所述的方法,其特征在于所述步驟(2)進一步包 括,預(yù)先設(shè)定預(yù)讀取扇區(qū)數(shù)的最大值,首次執(zhí)行預(yù)讀取操作時預(yù)讀取的扇 區(qū)數(shù)不大于該最大值。
6. 如權(quán)利要求4所述的方法,其特征在于所述步驟(2)進一步包 括,將每次預(yù)讀取的扇區(qū)存放在一個緩存塊中,并在緩存塊控制結(jié)構(gòu)中, 給每個存放預(yù)讀取扇區(qū)的緩存塊賦予一個索引值,記錄該緩存塊存放的扇 區(qū)是通過哪次預(yù)讀取操作預(yù)讀取的。
7. 如權(quán)利要求6所述的方法,其特征在于所述步驟(3)中,在使 用某個緩存塊中存放的預(yù)讀取扇區(qū)時,根據(jù)該緩存塊的索引值確定所使用的扇區(qū)是通過哪次預(yù)讀取操作預(yù)讀取的,并在記錄該次預(yù)讀取操作預(yù)讀取 的扇區(qū)數(shù)的記錄中,記錄使用的預(yù)讀取扇區(qū)數(shù)。
8. 如權(quán)利要求7所述的方法,其特征在于所述步驟(4)中,計算 出每個記錄中預(yù)讀取扇區(qū)使用數(shù)和預(yù)讀取扇區(qū)數(shù)的比值,作為 一次預(yù)讀取 操作預(yù)讀取的扇區(qū)的使用率;計算出N次預(yù)讀取操作預(yù)讀取的扇區(qū)的平 均使用率,再乘以所述預(yù)先設(shè)定的預(yù)讀取扇區(qū)數(shù)的最大值,得出當(dāng)前預(yù)讀 取操作的預(yù)讀取扇區(qū)數(shù)。
9. 如權(quán)利要求7所述的方法,其特征在于所述步驟(1)進一步包 括,每個記錄還包括一個權(quán)值字段,并為每個記錄分配一個權(quán)值,權(quán)值的 分配原則是離當(dāng)前預(yù)讀取操作越近的記錄的權(quán)值越大,并且使所有權(quán)值的 和為100%。
10. 如權(quán)利要求9所述的方法,其特征在于所述步驟(4)中,計 算出每個記錄中預(yù)讀取扇區(qū)使用數(shù)和預(yù)讀取扇區(qū)數(shù)的比值,并乘以該記錄 對應(yīng)的權(quán)值,得出每次預(yù)讀取操作預(yù)讀取的扇區(qū)的加權(quán)使用率;將N次 預(yù)讀取的扇區(qū)的加權(quán)使用率相加,并乘以預(yù)先設(shè)定的預(yù)讀取扇區(qū)數(shù)的最大 值,得出當(dāng)前預(yù)讀取操作的預(yù)讀取扇區(qū)數(shù)。
全文摘要
一種基于文件系統(tǒng)緩存的自適應(yīng)預(yù)讀取方法,包括以下步驟(1)建立預(yù)讀取扇區(qū)使用記錄;(2)每次執(zhí)行預(yù)讀取操作時,在所述預(yù)讀取扇區(qū)使用記錄中,記錄預(yù)讀取的扇區(qū)數(shù);(3)使用預(yù)讀取的扇區(qū)時,在所述預(yù)讀取扇區(qū)使用記錄中,記錄使用的預(yù)讀取扇區(qū)數(shù);(4)根據(jù)以前的預(yù)讀取扇區(qū)數(shù)和預(yù)讀取扇區(qū)的使用數(shù),計算出以前預(yù)讀取扇區(qū)的使用率,并根據(jù)該使用率來確定當(dāng)前預(yù)讀取操作中預(yù)讀取的扇區(qū)數(shù)。
文檔編號G06F17/30GK101231637SQ200710002448
公開日2008年7月30日 申請日期2007年1月22日 優(yōu)先權(quán)日2007年1月22日
發(fā)明者周立超, 童小九, 陸小飛, 黃文偉 申請人:中興通訊股份有限公司