專利名稱:一種磁盤存儲方法
技術領域:
本發(fā)明涉及計算機應用領域,特別是指一種磁盤存儲方法。
背景技術:
目前,硬盤是計算機的主要存儲介質(zhì)之一。在通常的使用情況下,硬盤的使用壽命一般都在三年以上。如果將硬盤用于頻繁存儲設備時,例如一個嵌入式Linux系統(tǒng)采用硬盤作為存儲介質(zhì),為實現(xiàn)系統(tǒng)易用性,需要設計系統(tǒng)可隨時關機。為保證系統(tǒng)的可靠性,即在任何時候系統(tǒng)都不會遭到破壞,使整個Linux系統(tǒng)以只讀方式啟動,但一些關于應用的配置需要保存,因此通過直接存儲訪問硬盤扇區(qū)并進行雙備份的方式存儲這些數(shù)據(jù)。如果直接對硬盤扇區(qū)進行數(shù)據(jù)存儲,則會導致每次存儲于硬盤的同一區(qū)域,就會在短時間內(nèi)對硬盤的同一扇區(qū)反復進行寫操作,這樣,大大增加硬盤磁道物理損壞的幾率,大大縮短了硬盤的使用壽命。另外,對于軟盤同樣存在頻繁寫入同一扇區(qū)的問題。因此,如何防止對磁盤同一位置的反復寫入,將成為有效延長磁盤使用壽命的首要問題。
發(fā)明內(nèi)容
有鑒于此,本發(fā)明的主要目的在于提供一種磁盤存儲方法,實現(xiàn)對磁盤的均衡存儲訪問,從而有效延長磁盤的使用壽命。
為了達到上述目的,本發(fā)明提供了一種磁盤存儲方法,該方法包含以下步驟A、將存儲區(qū)域劃分為一個以上的塊;B、當前數(shù)據(jù)存儲起始位置相對原數(shù)據(jù)存儲位置偏移一個或一個以上的塊作為當前偏移位置;C、以所述當前偏移位置開始進行數(shù)據(jù)存儲。
所述步驟B進一步包括以下步驟B11、搜索用于標識數(shù)據(jù)存儲起始位置的起始標志扇區(qū),以起始標志扇區(qū)相對存儲區(qū)域起始扇區(qū)偏移的位置作為原偏移位置;B12、當前數(shù)據(jù)存儲起始位置在所述原偏移位置基礎上,再偏移一個或一個以上的塊。
所述步驟B12之前進一步包括刪除起始標志扇區(qū)中存儲的起始標志。
如果以順序存儲方式進行數(shù)據(jù)存儲,則當前數(shù)據(jù)存儲起始位置在原偏移位置基礎上再偏移一個塊。
如果以隨機存儲方式進行數(shù)據(jù)存儲,則當前數(shù)據(jù)存儲起始位置在原偏移位置基礎上再偏移k個塊,k為系統(tǒng)隨機生成的隨機正整數(shù)。
所述步驟B進一步包括步驟B21搜索用于標識數(shù)據(jù)存儲起始位置的起始標志扇區(qū),根據(jù)起始扇區(qū)中存儲的數(shù)據(jù)長度找到數(shù)據(jù)存儲結(jié)束位置所在的塊,以該塊相對存儲區(qū)域起始扇區(qū)偏移的位置作為當前偏移位置。
所述步驟B21之后進一步包括刪除起始標志扇區(qū)中存儲的起始標志。
第一次進行數(shù)據(jù)存儲時,所述起始標志扇區(qū)位于存儲區(qū)域的起始扇區(qū)。
第一次進行數(shù)據(jù)存儲時,所述起始標志扇區(qū)位于存儲區(qū)域中第1個塊的第一個扇區(qū),1為系統(tǒng)隨機生成的隨機正整數(shù)。
所述步驟C之前進一步包括判斷當前偏移位置是否已超過存儲區(qū)域的結(jié)束扇區(qū)位置,如果是,令當前偏移位置為零,然后執(zhí)行步驟C;否則,直接執(zhí)行步驟C。
所述步驟C進一步包括以下步驟C1、存儲數(shù)據(jù)時,判斷當前數(shù)據(jù)存儲位置是否已超出存儲區(qū)域結(jié)束扇區(qū)位置與當前偏移位置的和,如果是,向系統(tǒng)報錯,結(jié)束當前數(shù)據(jù)存儲流程,否則,執(zhí)行步驟C2;C2、判斷當前數(shù)據(jù)存儲位置是否已超出存儲區(qū)域結(jié)束扇區(qū)位置,如果是,令實際的當前數(shù)據(jù)存儲位置為當前數(shù)據(jù)存儲位置與存儲區(qū)域的差,然后執(zhí)行步驟C3,否則,直接執(zhí)行步驟C3;C3、判斷是否完成當前數(shù)據(jù)存儲,如果是,將起始標志存儲于偏移位置之后第一個塊的第一個扇區(qū),結(jié)束當前數(shù)據(jù)存儲流程,否則,返回執(zhí)行步驟C1。
所述步驟C之后進一步包括步驟D讀取存儲的數(shù)據(jù)。
所述步驟D進一步包括以下步驟D1、搜索用于標識數(shù)據(jù)存儲起始位置的起始標志扇區(qū),讀取起始標志扇區(qū)中存儲的起始標志和當前讀取的數(shù)據(jù)長度;D2、讀取存儲的數(shù)據(jù)時,判斷當前數(shù)據(jù)讀取位置是否已超出存儲區(qū)域結(jié)束扇區(qū)位置,如果是,令實際的當前數(shù)據(jù)讀取位置為當前數(shù)據(jù)讀取位置與存儲區(qū)域的差,然后執(zhí)行步驟D3,否則,直接執(zhí)行步驟D3;D3、判斷是否完成當前數(shù)據(jù)讀取,如果是,結(jié)束當前數(shù)據(jù)讀取流程,否則,返回執(zhí)行步驟D1。
所述起始標志扇區(qū)存儲有用于標識起始標志的扇區(qū)識別字符串和當前存儲數(shù)據(jù)的長度。
所述步驟A包括將存儲區(qū)域劃分為20至200個塊。
根據(jù)本發(fā)明提出的方法,將存儲有起始標志的扇區(qū)作為在磁盤中存儲數(shù)據(jù)時的起始位置,通過不斷改變磁盤的數(shù)據(jù)存儲起始位置,保證對磁盤的存儲操作不會總在同一扇區(qū),實現(xiàn)對磁盤的均衡存儲訪問,從而有效延長磁盤的使用壽命。另外,讀取數(shù)據(jù)時,通過搜索起始標志扇區(qū),找到存儲數(shù)據(jù)的起始位置,然后對數(shù)據(jù)進行讀取,從而保證數(shù)據(jù)讀取的正確性。
圖1為本發(fā)明中頻繁存儲區(qū)域結(jié)構(gòu)示意圖;圖2為本發(fā)明中訪問過程示意圖;圖3為本發(fā)明中存儲數(shù)據(jù)流程圖;圖4為本發(fā)明中讀取數(shù)據(jù)流程圖。
具體實施例方式
為使本發(fā)明的目的、技術方案和優(yōu)點更加清楚,下面結(jié)合附圖對本發(fā)明作進一步的詳細描述。
本發(fā)明提供了一種對磁盤均衡存儲訪問的方法,將存儲有起始標志的扇區(qū)作為在磁盤中存儲數(shù)據(jù)時的起始位置,通過不斷改變磁盤的數(shù)據(jù)存儲起始位置,保證對磁盤的存儲操作不會總在同一扇區(qū),從而有效延長磁盤的使用壽命。另外,讀取數(shù)據(jù)時,通過搜索起始標志扇區(qū),找到存儲數(shù)據(jù)的起始位置,然后對數(shù)據(jù)進行讀取,從而保證數(shù)據(jù)讀取的正確性。
由于隨機在每一個可能的扇區(qū)中存儲數(shù)據(jù),會導致讀取時的搜索效率過低,因此本發(fā)明中采用將存儲數(shù)據(jù)的區(qū)域進行分塊的方法,設置一個塊的大小,每次的存儲跳變都以設置的塊為單位,這樣,起始標志扇區(qū)就會出現(xiàn)在塊的整數(shù)倍的位置;相應地,讀取數(shù)據(jù)時,就能夠很快搜索到起始標志扇區(qū)。例如,設置每個塊的大小為100個扇區(qū),存儲數(shù)據(jù)時,起始標志扇區(qū)的位置就在1、2、3……等塊的整數(shù)倍位置,即100、200、300……等100個扇區(qū)的整數(shù)倍位置;相應地,讀取數(shù)據(jù)時,只需在1、2、3……等塊的整數(shù)倍位置進行搜索就可找到起始標志扇區(qū)。
圖1為本發(fā)明中頻繁存儲區(qū)域結(jié)構(gòu)示意圖,如圖1所示,DBeginPos是存儲區(qū)域的起始扇區(qū)位置,DEndPos是存儲區(qū)域的結(jié)束扇區(qū)位置,DBeginPos至DEndPos之間是存儲區(qū)域(DSize),將DSize劃分為n個塊(Block),n為正整數(shù)。根據(jù)上次存儲數(shù)據(jù)的位置,相對DBeginPos偏移JumpBlock進行數(shù)據(jù)存儲,JumpBlock為m個Block,m為從0到n的正整數(shù)。通過不斷改變JumpBlock,實現(xiàn)不斷改變磁盤的數(shù)據(jù)存儲位置。當前存儲數(shù)據(jù)的第一個Block的起始位置是起始標志扇區(qū),即相對DBeginPos偏移JumpBlock的位置為起始標志扇區(qū)。NowPos為當前訪問位置,存儲數(shù)據(jù)的大小為DataSize。
在本發(fā)明中,每個塊的大小的設置是非常重要的,分塊的數(shù)量表示將一個存儲區(qū)域劃分成幾個寫交替。例如,如果設置分塊大小為DSize,則每次的數(shù)據(jù)存儲位置均為DSize的起始位置,即DBeginPos,此時根本沒有達到改變磁盤數(shù)據(jù)存儲起始位置的目的;如果設置分塊大小為每個扇區(qū)的大小,則讀取數(shù)據(jù)時,由于搜索起始標志扇區(qū)需要對每一個扇區(qū)進行搜索,會花費大量時間,導致讀取效率下降。通常,分塊大小由存儲數(shù)據(jù)的頻繁度和設置的存儲區(qū)域的大小決定,可將DSize劃分為20至200個塊,例如,DSize為8000個扇區(qū),則設置每個塊的大小為80個扇區(qū),將該DSize劃分為100個塊。
存儲數(shù)據(jù)的方式包括順序存儲和隨機存儲兩種方式。順序存儲是指連續(xù)兩次存儲數(shù)據(jù)的起始位置是連續(xù)的,即上一次存儲數(shù)據(jù)從第m個Block開始,則當前存儲數(shù)據(jù)從第m+1個Block開始。隨機存儲是指連續(xù)兩次存儲數(shù)據(jù)的起始位置會隨機跳過k個Block,即上一次存儲數(shù)據(jù)從第m個Block開始,則當前存儲數(shù)據(jù)從第m+k個Block開始,k是隨機變化的。
如果在DSize的位置中連續(xù)存儲數(shù)據(jù),則NowPos就是實際的訪問位置,但由于存儲數(shù)據(jù)的起始位置會不斷變化,因此每次存儲數(shù)據(jù)的位置并不是總在DSize的起始位置,這樣,會出現(xiàn)數(shù)據(jù)存儲至DSize的DEndPos時,當前的數(shù)據(jù)存儲還未結(jié)束,此時需要跳轉(zhuǎn)至DSize的DBeginPos繼續(xù)存儲數(shù)據(jù)。
圖2為本發(fā)明中訪問過程示意圖,如圖2所示,NowPos實際為原當前訪問位置,即數(shù)據(jù)進行連續(xù)位置存儲時的NowPos,如果NowPos已超出DSize的DEndPos,即NowPos大于或等于DSize的DEndPos,則實際的當前訪問位置應為NowPos與DSize的差,即將當前訪問位置移至DSize的頭部,實際的當前訪問位置相對DBeginPos的偏移位置等于NowPos相對DEndPos的偏移位置。存儲數(shù)據(jù)時,相當于將應該在DEndPos后面存儲的數(shù)據(jù)移至DBeginPos后進行存儲;相應地,讀取數(shù)據(jù)時,如果讀取至DEndPos處還未結(jié)束當前數(shù)據(jù)讀取,則返回至DBeginPos處繼續(xù)讀取數(shù)據(jù)。
圖3為本發(fā)明中存儲數(shù)據(jù)流程圖,如圖3所示,以順序存儲數(shù)據(jù)為例,存儲數(shù)據(jù)過程的包括以下步驟步驟301通過搜索起始標志找到起始標志扇區(qū),獲取上次存儲數(shù)據(jù)的原JumpBlock。如果通過上次讀取數(shù)據(jù)已得到JumpBlock,則步驟301中不需要再搜索起始標志。第一次存儲數(shù)據(jù)時,可從DSize的起始位置進行數(shù)據(jù)存儲,即將DSize的DBeginPos作為起始標志扇區(qū);也可隨機地從DSize中任意選取一個Block開始進行數(shù)據(jù)存儲,即將選取Block的第一個扇區(qū)作為起始標志扇區(qū)。
步驟302~步驟303搜索到起始標志后,將該起始標志清除,并且在原JumpBlock的基礎上增加一個Block,作為當前JumpBlock。
步驟304判定當前JumpBlock是否小于DEndPos,如果是,執(zhí)行步驟306;否則,執(zhí)行步驟305。步驟304是對相對DBeginPos偏移JumpBlock的存儲數(shù)據(jù)起始位置是否已超出DSize的DEndPos進行判斷。
步驟305令當前JumpBlock為0,即如果相對DBeginPos偏移JumpBlock的位置已超出DSize的DEndPos,則當前存儲數(shù)據(jù)的起始位置為DSize的DBeginPos。
步驟306進行數(shù)據(jù)存儲。
步驟307判斷原NowPos是否小于DendPos與JumpBlock的和,如果是,執(zhí)行步驟308;否則,執(zhí)行步驟312。步驟307是為防止本次數(shù)據(jù)存儲的過程中,當前存儲的數(shù)據(jù)覆蓋已經(jīng)存儲了的數(shù)據(jù),即本次進行存儲的DataSize不能大于Dsize與1的差。
步驟308判斷原NowPos是否小于DEndPos,如果是,執(zhí)行步驟310;否則,執(zhí)行步驟309。步驟308是對當前存儲數(shù)據(jù)位置是否已超過DEndPos進行判斷。
步驟309令實際NowPos為原NowPos與Dsize的差。
步驟310判斷是否完成本次數(shù)據(jù)存儲,如果是,執(zhí)行步驟311;否則,返回執(zhí)行步驟306。
步驟311在相對DBeginPos偏移當前JumpBlock位置的第一個扇區(qū)寫入起始標志,該扇區(qū)即為起始標志扇區(qū),起始標志扇區(qū)中還存儲有扇區(qū)識別字符串、存儲數(shù)據(jù)的大小等,結(jié)束本次數(shù)據(jù)存儲。
步驟312向系統(tǒng)報錯。
圖4為本發(fā)明中讀取數(shù)據(jù)流程圖,如圖4所示,讀取數(shù)據(jù)過程包括以下步驟步驟401~步驟404通過搜索起始標志找到起始標志扇區(qū),獲取上次存儲數(shù)據(jù)的JumpBlock;然后讀取起始標志扇區(qū)中存儲的數(shù)據(jù),獲取上次存儲數(shù)據(jù)的大小,從JumpBlock開始讀取數(shù)據(jù)??赏ㄟ^多種方式搜索起始標志扇區(qū),例如順序查找、二分法查找等方式。
步驟405判斷原NowPos是否小于DEndPos,如果是,執(zhí)行步驟407;否則,執(zhí)行步驟406。步驟405是對當前讀取數(shù)據(jù)位置是否已超過DEndPos進行判斷。
步驟406令實際NowPos為原NowPos與Dsize的差。
步驟407判斷是否完成本次數(shù)據(jù)讀取,如果是,結(jié)束本次數(shù)據(jù)讀??;否則,返回執(zhí)行步驟405。
以上描述的是當前數(shù)據(jù)存儲的起始位置相對上次數(shù)據(jù)存儲的起始位置進行偏移的方法,實際應用中,還可使當前數(shù)據(jù)存儲的起始位置相對上次數(shù)據(jù)存儲的結(jié)束位置進行偏移,搜索起始標志找到起始標志扇區(qū)后,讀取起始標志扇區(qū)中存儲的數(shù)據(jù)長度,然后根據(jù)數(shù)據(jù)長度搜索到上次數(shù)據(jù)存儲的結(jié)束位置,以上次數(shù)據(jù)存儲的結(jié)束位置所在Block的位置作為原JumpBlock,如果為順序存儲,則在JumpBlock的基礎上增加一個Block,如果為隨機存儲,則在JumpBlock的基礎上增加k個Block,k為隨機數(shù),然后進行數(shù)據(jù)存儲,后續(xù)的數(shù)據(jù)存儲和數(shù)據(jù)讀取過程與上述的數(shù)據(jù)存儲和數(shù)據(jù)讀取過程基本相同,在此不再贅述。
例如一個嵌入式Linux系統(tǒng)采用硬盤作為存儲介質(zhì),為實現(xiàn)系統(tǒng)易用性,需要設計系統(tǒng)可隨時關機。為保證系統(tǒng)的可靠性,即在任何時候系統(tǒng)都不會遭到破壞,使整個Linux系統(tǒng)以只讀方式啟動,但一些關于應用的配置需要保存,因此通過直接存儲訪問硬盤扇區(qū)并進行雙備份的方式存儲這些數(shù)據(jù)。如果直接對硬盤扇區(qū)進行數(shù)據(jù)存儲,則會導致每次存儲于硬盤的同一區(qū)域,大大增加硬盤物理損壞的幾率,此時就可采用本發(fā)明提出的存儲方法,對硬盤采用均衡的訪問方式,在硬盤某個存儲空間內(nèi),將每次需要存儲的數(shù)據(jù)存儲于不同的起始位置,從而有效延長磁盤的使用壽命。
總之,以上所述僅為本發(fā)明的較佳實施例而已,并非用于限定本發(fā)明的保護范圍。
權(quán)利要求
1.一種磁盤存儲方法,其特征在于該方法包含以下步驟A、將存儲區(qū)域劃分為一個以上的塊;B、當前數(shù)據(jù)存儲起始位置相對原數(shù)據(jù)存儲位置偏移一個或一個以上的塊作為當前偏移位置;C、以所述當前偏移位置開始進行數(shù)據(jù)存儲。
2.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述步驟B進一步包括以下步驟B11、搜索用于標識數(shù)據(jù)存儲起始位置的起始標志扇區(qū),以起始標志扇區(qū)相對存儲區(qū)域起始扇區(qū)偏移的位置作為原偏移位置;B12、當前數(shù)據(jù)存儲起始位置在所述原偏移位置基礎上,再偏移一個或一個以上的塊。
3.根據(jù)權(quán)利要求2所述的方法,其特征在于,所述步驟B12之前進一步包括刪除起始標志扇區(qū)中存儲的起始標志。
4.根據(jù)權(quán)利要求2所述的方法,其特征在于,如果以順序存儲方式進行數(shù)據(jù)存儲,則當前數(shù)據(jù)存儲起始位置在原偏移位置基礎上再偏移一個塊。
5.根據(jù)權(quán)利要求2所述的方法,其特征在于,如果以隨機存儲方式進行數(shù)據(jù)存儲,則當前數(shù)據(jù)存儲起始位置在原偏移位置基礎上再偏移k個塊,k為系統(tǒng)隨機生成的隨機正整數(shù)。
6.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述步驟B進一步包括B21、搜索用于標識數(shù)據(jù)存儲起始位置的起始標志扇區(qū),根據(jù)起始扇區(qū)中存儲的數(shù)據(jù)長度找到數(shù)據(jù)存儲結(jié)束位置所在的塊,以該塊相對存儲區(qū)域起始扇區(qū)偏移的位置作為當前偏移位置。
7.根據(jù)權(quán)利要求6所述的方法,其特征在于,所述步驟B21之后進一步包括刪除起始標志扇區(qū)中存儲的起始標志。
8.根據(jù)權(quán)利要求2或6所述的方法,其特征在于,第一次進行數(shù)據(jù)存儲時,所述起始標志扇區(qū)位于存儲區(qū)域的起始扇區(qū)。
9.根據(jù)權(quán)利要求2或6所述的方法,其特征在于,第一次進行數(shù)據(jù)存儲時,所述起始標志扇區(qū)位于存儲區(qū)域中第1個塊的第一個扇區(qū),1為系統(tǒng)隨機生成的隨機正整數(shù)。
10.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述步驟C之前進一步包括判斷當前偏移位置是否已超過存儲區(qū)域的結(jié)束扇區(qū)位置,如果是,令當前偏移位置為零,然后執(zhí)行步驟C;否則,直接執(zhí)行步驟C。
11.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述步驟C進一步包括以下步驟C1、存儲數(shù)據(jù)時,判斷當前數(shù)據(jù)存儲位置是否已超出存儲區(qū)域結(jié)束扇區(qū)位置與當前偏移位置的和,如果是,向系統(tǒng)報錯,結(jié)束當前數(shù)據(jù)存儲流程,否則,執(zhí)行步驟C2;C2、判斷當前數(shù)據(jù)存儲位置是否已超出存儲區(qū)域結(jié)束扇區(qū)位置,如果是,令實際的當前數(shù)據(jù)存儲位置為當前數(shù)據(jù)存儲位置與存儲區(qū)域的差,然后執(zhí)行步驟C3,否則,直接執(zhí)行步驟C3;C3、判斷是否完成當前數(shù)據(jù)存儲,如果是,將起始標志存儲于偏移位置之后第一個塊的第一個扇區(qū),結(jié)束當前數(shù)據(jù)存儲流程,否則,返回執(zhí)行步驟C1。
12.根據(jù)權(quán)利要求2或6所述的方法,其特征在于,所述步驟C之后進一步包括D、讀取存儲的數(shù)據(jù)。
13.根據(jù)權(quán)利要求12所述的方法,其特征在于,所述步驟D進一步包括以下步驟D1、搜索用于標識數(shù)據(jù)存儲起始位置的起始標志扇區(qū),讀取起始標志扇區(qū)中存儲的起始標志和當前讀取的數(shù)據(jù)長度;D2、讀取存儲的數(shù)據(jù)時,判斷當前數(shù)據(jù)讀取位置是否已超出存儲區(qū)域結(jié)束扇區(qū)位置,如果是,令實際的當前數(shù)據(jù)讀取位置為當前數(shù)據(jù)讀取位置與存儲區(qū)域的差,然后執(zhí)行步驟D3,否則,直接執(zhí)行步驟D3;D3、判斷是否完成當前數(shù)據(jù)讀取,如果是,結(jié)束當前數(shù)據(jù)讀取流程,否則,返回執(zhí)行步驟D1。
14.根據(jù)權(quán)利要求2、6或13所述的方法,其特征在于,所述起始標志扇區(qū)存儲有用于標識起始標志的扇區(qū)識別字符串和當前存儲數(shù)據(jù)的長度。
15.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述步驟A包括將存儲區(qū)域劃分為20至200個塊。
全文摘要
本發(fā)明公開了一種磁盤存儲方法,該方法包含將存儲區(qū)域劃分為一個以上的塊;當前數(shù)據(jù)存儲起始位置相對原數(shù)據(jù)存儲位置偏移一個或一個以上的塊作為當前偏移位置;以所述當前偏移位置開始進行數(shù)據(jù)存儲。根據(jù)本發(fā)明提出的方法,將存儲有起始標志的扇區(qū)作為在磁盤中存儲數(shù)據(jù)時的起始位置,通過不斷改變磁盤的數(shù)據(jù)存儲起始位置,保證對磁盤的存儲操作不會總在同一扇區(qū),實現(xiàn)對磁盤的均衡存儲訪問,從而有效延長磁盤的使用壽命。另外,讀取數(shù)據(jù)時,通過搜索起始標志扇區(qū),找到存儲數(shù)據(jù)的起始位置,然后對數(shù)據(jù)進行讀取,從而保證數(shù)據(jù)讀取的正確性。
文檔編號G11B5/09GK1595523SQ0315679
公開日2005年3月16日 申請日期2003年9月12日 優(yōu)先權(quán)日2003年9月12日
發(fā)明者趙明, 陳衛(wèi)華 申請人:聯(lián)想(北京)有限公司