本發(fā)明屬于計(jì)算機(jī)存儲(chǔ)器管理的技術(shù)領(lǐng)域,具體涉及考慮非易失性內(nèi)存磨損均衡的文件系統(tǒng)的元數(shù)據(jù)管理方法。
背景技術(shù):
隨著新型非易失性存儲(chǔ)器的出現(xiàn),企業(yè)界和學(xué)術(shù)界提出將存儲(chǔ)密度大、讀寫速度快、可按字節(jié)尋址和抗震動(dòng)的非易失性內(nèi)存制作為持久性的數(shù)據(jù)存儲(chǔ)設(shè)備,稱為存儲(chǔ)級(jí)內(nèi)存(storageclassmemory,簡(jiǎn)稱scm)。
為了管理存儲(chǔ)級(jí)內(nèi)存,已經(jīng)設(shè)計(jì)出多種內(nèi)存文件系統(tǒng)。例如ibm設(shè)計(jì)的pmfs,“systemsoftwareforpersistentmemory,”inproc.9thacmeuro.conf.comput.syst.,pp15:1—15:15,2014,isbn:978-1-4503-2704-6(“面向持久性內(nèi)存的系統(tǒng)軟件”,第9屆美國(guó)計(jì)算機(jī)學(xué)會(huì)歐洲計(jì)算機(jī)系統(tǒng)會(huì)議,第15篇1到15頁(yè),2014年,isbn:978-1-4503-2704-6)。重慶大學(xué)自主研發(fā)的simfs,“designinganefficientpersistentin-memoryfilesystem”,2015ieeenon-volatilememorysystemandapplicationssymposium,pp1-6,2015,doi:10.1109/nvmsa.2015.7304365(“高效持續(xù)性內(nèi)存文件系統(tǒng)設(shè)計(jì)”,2015年電氣和電子工程師協(xié)會(huì)非易失性內(nèi)存系統(tǒng)及應(yīng)用研討會(huì),第1-6頁(yè),doi:10.1109/nvmsa.2015.7304365)。
雖然已經(jīng)設(shè)計(jì)出了多種內(nèi)存文件系統(tǒng)用于管理存儲(chǔ)級(jí)內(nèi)存,但非易失性內(nèi)存還存在一些挑戰(zhàn)。非易失性內(nèi)存面臨的主要挑戰(zhàn)是每一個(gè)存儲(chǔ)單元只能經(jīng)受有限次寫操作(105~108次),在超過(guò)此數(shù)目之后,由于頻繁的膨脹和收縮,加熱電阻會(huì)發(fā)生脫落,導(dǎo)致存儲(chǔ)單元再也無(wú)法改變相態(tài)。解決非易失性內(nèi)存耐久性問(wèn)題的主要辦法是采用磨損均衡來(lái)協(xié)調(diào)寫地址的不平衡性,避免局部存儲(chǔ)單元由于更為頻繁的寫操作而率先磨損失效。
由于非易失性內(nèi)存寫次數(shù)有限制的原因,對(duì)寫頻繁的操作,比如元數(shù)據(jù)的修改必須實(shí)現(xiàn)磨損均衡。而常規(guī)的元數(shù)據(jù)管理方式是:固定一塊區(qū)域用于記錄所有元數(shù)據(jù)的信息,這種方法的最大缺點(diǎn)是在反復(fù)的修改元數(shù)據(jù)時(shí),容易對(duì)非易失性內(nèi)存造成損毀。因此,常規(guī)的元數(shù)據(jù)管理方式不能適用于內(nèi)存文件系統(tǒng)。
現(xiàn)有技術(shù)中,文件索引節(jié)點(diǎn)inode元數(shù)據(jù)管理方法有兩種:
第一種是樹形結(jié)構(gòu),這種方式下文件索引節(jié)點(diǎn)的存儲(chǔ)管理都很靈活,而且便于擴(kuò)張,但是這種方法查找速度慢而且存儲(chǔ)空間開銷大。例如:bpfs用樹形結(jié)構(gòu)組織inode,使得inode的分配、回收和物理空間的選擇非常靈活,擴(kuò)展性好,但是同時(shí)也使得inode的檢索更加復(fù)雜,查詢inode耗時(shí)較多,并且諸多中間節(jié)點(diǎn)會(huì)造成較大的存儲(chǔ)空間開銷。
第二種是數(shù)組結(jié)構(gòu),將所有文件索引節(jié)點(diǎn)存放在固定區(qū)域,而且文件索引節(jié)點(diǎn)大小為定值,因此可以通過(guò)文件索引節(jié)點(diǎn)號(hào)直接定位文件索引節(jié)點(diǎn)的地址,這種方法可以迅速找到文件的文件索引節(jié)點(diǎn),但是擴(kuò)展性較差,需要固定文件索引節(jié)點(diǎn)數(shù)量,即固定系統(tǒng)支持的文件總量;且固定一塊區(qū)域極易造成磨損。
例如:pmfs的日志管理方式就是在非易失性內(nèi)存上利用連續(xù)的物理區(qū)域來(lái)保證pmfs文件系統(tǒng)的元數(shù)據(jù)一致性,它沒有實(shí)現(xiàn)文件數(shù)據(jù)寫的一致性。由于它的元數(shù)據(jù)固定在這塊物理區(qū)域,每次寫都在這塊物理地址區(qū)域,容易造成這塊物理區(qū)域磨損,即不能實(shí)現(xiàn)這塊區(qū)域的磨損均衡。
本說(shuō)明書中,常用術(shù)語(yǔ)的說(shuō)明如下:
mmumemorymanagementunit存儲(chǔ)器管理單元,
inoinode的結(jié)點(diǎn)號(hào),
映射表查找inode物理位置的索引表,
m指每個(gè)物理頁(yè)寫的counter最大上限。
技術(shù)實(shí)現(xiàn)要素:
針對(duì)現(xiàn)有技術(shù)存在的問(wèn)題,本發(fā)明所要解決的技術(shù)問(wèn)題就是提供一種基于非易失性內(nèi)存文件系統(tǒng)的元數(shù)據(jù)管理方法,它能夠保證非易失性內(nèi)存寫的磨損均衡,還能夠快速訪問(wèn)到元數(shù)據(jù)。
要解決上述技術(shù)問(wèn)題,本發(fā)明包括以下步驟:
步驟1、把文件索引節(jié)點(diǎn)以數(shù)組形式組織為一個(gè)索引節(jié)點(diǎn)區(qū),索引節(jié)點(diǎn)區(qū)的每個(gè)文件索引節(jié)點(diǎn)都有一個(gè)固定的編號(hào);
步驟2、依照系統(tǒng)頁(yè)表的格式給文件索引節(jié)點(diǎn)區(qū)建立一個(gè)映射表,映射表的最高級(jí)指針存放在文件系統(tǒng)的超級(jí)塊中;
步驟3、在操作系統(tǒng)中為文件索引節(jié)點(diǎn)區(qū)保留一段第一虛擬地址空間,每個(gè)文件索引節(jié)點(diǎn)通過(guò)ino號(hào)和索引節(jié)點(diǎn)區(qū)的起始虛擬地址得到自己對(duì)應(yīng)的虛擬地址;在掛載文件系統(tǒng)時(shí),操作系統(tǒng)解析第一虛擬地址空間對(duì)應(yīng)的系統(tǒng)頁(yè)表第一表項(xiàng);
步驟4、查看文件系統(tǒng)的超級(jí)塊,把文件系統(tǒng)超級(jí)塊中保存的索引節(jié)點(diǎn)區(qū)的映射表的最高級(jí)指針插入到第一表項(xiàng),建立起索引節(jié)點(diǎn)區(qū)的虛擬地址空間到物理地址空間的映射關(guān)系。
在上述步驟4中,包括以下步驟:
步驟1)、根據(jù)inode的ino號(hào)和索引節(jié)點(diǎn)區(qū)的起始虛擬地址,通過(guò)硬件mmu和映射表將inode的虛擬地址轉(zhuǎn)換為物理地址,從而找到該inode所在的物理頁(yè)并在物理頁(yè)上修改inode信息,同時(shí)給該inode所在的物理頁(yè)的counter值加1;
步驟2)、檢查counter,如果counter值超過(guò)定值m值,則申請(qǐng)一個(gè)新頁(yè),將超過(guò)counter值的頁(yè)的信息拷貝到新頁(yè)上,利用cpu提供的原子操作,在映射表里用新頁(yè)替換掉counter值超過(guò)m的頁(yè);
步驟3)、釋放掉超過(guò)counter值的物理頁(yè)。
優(yōu)選地,還包括步驟5、在掛載文件系統(tǒng)時(shí),初始化一個(gè)inode空閑鏈表,將所有沒有使用的inode的ino放到鏈表上去,并將inode鏈表的表頭存儲(chǔ)到文件系統(tǒng)超級(jí)塊中。當(dāng)創(chuàng)建文件時(shí),在超級(jí)塊中取出inode鏈表,并從空閑鏈表的頭部取出一個(gè)ino,更新保存在超級(jí)塊中的inode鏈表信息。當(dāng)回收inode時(shí),將inode的ino掛到inode鏈表的尾部。
與現(xiàn)有技術(shù)相比,本發(fā)明的元數(shù)據(jù)管理方法沒有將inode的數(shù)據(jù)存儲(chǔ)在固定的物理區(qū)域,而是通過(guò)進(jìn)程頁(yè)表的方式管理inode。在內(nèi)核虛擬地址空間中預(yù)留一段給索引節(jié)點(diǎn)區(qū),在文件系統(tǒng)的超級(jí)塊中記錄這段起始虛擬地址。掛載文件系統(tǒng)時(shí),創(chuàng)建并初始化一個(gè)映射表,其形式與文件系統(tǒng)的頁(yè)表相同。把映射表插入到索引節(jié)點(diǎn)區(qū)的內(nèi)核虛擬地址空間對(duì)應(yīng)的內(nèi)核頁(yè)表中,查看文件系統(tǒng)的超級(jí)塊,把文件系統(tǒng)的超級(jí)塊中保存的索引節(jié)點(diǎn)區(qū)的映射表的最高級(jí)指針插入到第一表項(xiàng),從而建立起索引節(jié)點(diǎn)區(qū)的虛擬地址空間到物理地址空間的映射關(guān)系。
本發(fā)明的技術(shù)效果是:
1、通過(guò)counter值,動(dòng)態(tài)分配頁(yè)和映射表的管理機(jī)制,實(shí)現(xiàn)元數(shù)據(jù)的寫磨損均衡。
本發(fā)明的元數(shù)據(jù)管理方法把索引節(jié)點(diǎn)區(qū)組織為一個(gè)連續(xù)的虛擬空間,而真正存放索引節(jié)點(diǎn)的物理內(nèi)存卻可以任意地散布在非易失性內(nèi)存設(shè)備中。用“映射表”維護(hù)虛擬空間到物理空間的映射關(guān)系。所以,一個(gè)索引節(jié)點(diǎn)的虛擬地址不必改變,卻可以任意改變它的物理地址,只要修改它對(duì)應(yīng)的映射表就可以?;谶@種構(gòu)思,索引節(jié)點(diǎn)區(qū)就不必存儲(chǔ)在固定的物理區(qū)域。這樣做的目的是避免反復(fù)在同一塊區(qū)域修改索引節(jié)點(diǎn)的信息而導(dǎo)致寫磨損。
本發(fā)明實(shí)現(xiàn)磨損均衡的具體方式有:
第1)、利用映射表存儲(chǔ)索引節(jié)點(diǎn)所在的物理頁(yè)地址。當(dāng)需要修改索引節(jié)點(diǎn)信息時(shí),執(zhí)行如下步驟:1)利用索引節(jié)點(diǎn)號(hào)和存儲(chǔ)在超級(jí)塊里的起始虛擬地址計(jì)算該索引節(jié)點(diǎn)的虛擬地址;2)然后利用處理已有的地址轉(zhuǎn)換硬件mmu和索引節(jié)點(diǎn)的虛擬地址讀取索引節(jié)點(diǎn)的物理內(nèi)存。通過(guò)這種方式,可以保證索引節(jié)點(diǎn)在邏輯上是固定的,但實(shí)際的物理存儲(chǔ)位置卻可以任意改變,從而實(shí)現(xiàn)磨損均衡。
第2)、當(dāng)索引節(jié)點(diǎn)所在的物理頁(yè)的counter達(dá)到m,則申請(qǐng)一個(gè)新頁(yè),將counter超過(guò)m的物理頁(yè)的信息拷貝到新頁(yè)上,然后用新頁(yè)的物理地址替換couner超過(guò)m的物理頁(yè)的索引。這個(gè)替換操作可以利用處理器提供的原子操作高速地原子性地完成。
第3)、當(dāng)分配一個(gè)新的索引節(jié)點(diǎn)時(shí),如果該索引節(jié)點(diǎn)所在的物理頁(yè)不存在,則從空閑空間申請(qǐng)一個(gè)寫次數(shù)最少的頁(yè),從而實(shí)現(xiàn)非易失性存儲(chǔ)整體的磨損均衡。
2、采用邏輯數(shù)組方式組織文件索引節(jié)點(diǎn),即在內(nèi)核預(yù)留一段連續(xù)虛擬地址空間索引節(jié)點(diǎn)區(qū),每個(gè)inode通過(guò)ino號(hào)和索引節(jié)點(diǎn)區(qū)的起始虛擬地址得到自己對(duì)應(yīng)的虛擬地址,然后通過(guò)硬件mmu和映射表將虛擬地址轉(zhuǎn)化為物理地址,從而快速的找到inode。充分利用了硬件機(jī)制來(lái)快速找到inode。
附圖說(shuō)明
本發(fā)明的附圖說(shuō)明如下:
圖1為系統(tǒng)頁(yè)表和索引節(jié)點(diǎn)映射表的結(jié)構(gòu)圖;
圖2為本發(fā)明的流程圖。
具體實(shí)施方式
下面結(jié)合附圖和實(shí)施例對(duì)本發(fā)明作進(jìn)一步說(shuō)明:
本發(fā)明包括以下步驟:
步驟1、把文件索引節(jié)點(diǎn)以數(shù)組形式組織為一個(gè)索引節(jié)點(diǎn)區(qū),索引節(jié)點(diǎn)區(qū)的每個(gè)文件索引節(jié)點(diǎn)都有一個(gè)固定的編號(hào);
步驟2、定義操作系統(tǒng)規(guī)定的進(jìn)程的頁(yè)表為“系統(tǒng)頁(yè)表”。依照系統(tǒng)頁(yè)表的格式給索引節(jié)點(diǎn)區(qū)建立一個(gè)映射表,映射表的最高級(jí)指針存放在文件系統(tǒng)的超級(jí)塊中;
系統(tǒng)頁(yè)表的一個(gè)例子如圖1所示。圖1左側(cè)是linux系統(tǒng)的頁(yè)表。它共有四層,分別是頁(yè)全局目錄(pgd)、頁(yè)上級(jí)目錄(pud)、頁(yè)中級(jí)目錄(pmd)和頁(yè)表項(xiàng)(pte)。通常情況下,每級(jí)頁(yè)表都由一個(gè)或多個(gè)頁(yè)面組成。每個(gè)頁(yè)面包含有512個(gè)8字節(jié)的表項(xiàng),前三級(jí)中每個(gè)表項(xiàng)存放的都是下一級(jí)頁(yè)表某個(gè)物理頁(yè)的起始物理地址,第四級(jí)pte頁(yè)表項(xiàng)中保存的是一個(gè)文件數(shù)據(jù)頁(yè)的起始物理地址。圖1右側(cè)是本發(fā)明提出的索引節(jié)點(diǎn)映射表。超級(jí)塊中存有指向inode頁(yè)表的指針。該三層文件頁(yè)表也分為pud、pmd和pte三層。上級(jí)頁(yè)表項(xiàng)存放的是下級(jí)頁(yè)表頁(yè)面的起始物理地址,pte的頁(yè)表項(xiàng)存放的是文件數(shù)據(jù)頁(yè)的起始物理地址?;谶@種結(jié)構(gòu),文件可以獲得連續(xù)的虛擬地址空間,而真正的文件數(shù)據(jù)卻可以分散存儲(chǔ)在物理內(nèi)存中。
步驟3、在操作系統(tǒng)中為索引節(jié)點(diǎn)區(qū)保留一段第一虛擬地址空間,每個(gè)文件索引節(jié)點(diǎn)通過(guò)ino號(hào)和索引節(jié)點(diǎn)區(qū)的起始虛擬地址得到自己對(duì)應(yīng)的虛擬地址;在掛載文件系統(tǒng)時(shí),操作系統(tǒng)解析第一虛擬地址空間對(duì)應(yīng)的系統(tǒng)頁(yè)表第一表項(xiàng);
操作系統(tǒng)獲取系統(tǒng)頁(yè)表最高級(jí)(如pgd)的頁(yè)面的指針。利用虛擬地址的對(duì)應(yīng)字段計(jì)算出該虛擬地址所屬的下一級(jí)頁(yè)表(如pud)的頁(yè)表項(xiàng)在最高級(jí)頁(yè)表中的偏移。例如linux現(xiàn)在的虛擬地址中用48位索引一個(gè)物理頁(yè)。這48位分為5段,第一段(9位)表示虛擬地址對(duì)應(yīng)的pud頁(yè)面的指針在pgd頁(yè)面里的存放位置。如第一段的值是252,就表示該虛擬地址對(duì)應(yīng)的pud頁(yè)面的指針存在pgd頁(yè)面的第252項(xiàng)。依次類推,直到找到索引節(jié)點(diǎn)的映射表所需的頁(yè)表的第一頁(yè)表項(xiàng)。可以是第1級(jí)(pgd)、第2級(jí)(pud)、第3級(jí)(pmd)甚至第4級(jí)(pte)的一個(gè)頁(yè)表項(xiàng)。
步驟4、查看文件系統(tǒng)的超級(jí)塊,把超級(jí)塊中保存的索引節(jié)點(diǎn)區(qū)的映射表的最高級(jí)指針插入到第一表項(xiàng),建立起索引節(jié)點(diǎn)區(qū)的虛擬地址空間到物理地址空間的映射關(guān)系。
本發(fā)明的流程圖如圖2所示,該流程開始于步驟101,然后:
在步驟102,在掛載文件系統(tǒng)時(shí),操作系統(tǒng)解析第一虛擬地址空間對(duì)應(yīng)的系統(tǒng)頁(yè)表第一表項(xiàng);
在步驟103,當(dāng)有創(chuàng)建、打開、修改文件操作的情況下,執(zhí)行步驟104;否則執(zhí)行步驟114。
在步驟104,判斷inode是否存在,如果存在,則執(zhí)行步驟109,否則執(zhí)行步驟105;
在步驟105,在空閑inode的鏈表上分配一個(gè)ino號(hào),根據(jù)inode的ino號(hào)和索引節(jié)點(diǎn)區(qū)的起始虛擬地址找到inode的虛擬地址,執(zhí)行步驟106;
在步驟106,通過(guò)硬件mmu和映射表將inode的虛擬地址轉(zhuǎn)換為物理地址,判斷該物理頁(yè)是否存在,如果存在,執(zhí)行步驟108,否則執(zhí)行步驟107;
在步驟107,新分配一個(gè)4k大小的頁(yè),利用步驟105的虛擬地址將新分配頁(yè)的地址插入到映射表,然后執(zhí)行步驟108;
在步驟108,在新分配的物理頁(yè)上記錄inode信息,并將該物理頁(yè)的counter值加1,執(zhí)行步驟109;
在步驟109,是否刪除inode,如果是,執(zhí)行110,否則執(zhí)行步驟111;
在步驟110,刪除inode,執(zhí)行步驟112;
在步驟111,修改inode信息,如果修改則執(zhí)行112,否則執(zhí)行114;
在步驟112,該inode所在的頁(yè)寫次數(shù)是否超過(guò)最大限度,是,則執(zhí)行步驟113,否則執(zhí)行步驟114;
在步驟113,新申請(qǐng)一個(gè)頁(yè),復(fù)制舊數(shù)據(jù)到新頁(yè)上,利用cpu提供的原則操作,替換索引表里該頁(yè)的索引;
在步驟114,結(jié)束。
本發(fā)明的流程對(duì)文件索引節(jié)點(diǎn)inode的操作有三類:
1、分配inode:當(dāng)創(chuàng)建文件時(shí),需要為文件分配一個(gè)inode。
具體方法是:在空閑inode的鏈表上分配一個(gè)ino號(hào),然后根據(jù)inode的ino號(hào)和索引節(jié)點(diǎn)區(qū)的起始虛擬地址找到inode的虛擬地址,然后利用硬件mmu和映射表將inode的虛擬地址轉(zhuǎn)化為物理地址,通過(guò)物理地址找到inode所在的物理頁(yè)。如果該物理頁(yè)存在,則在該物理頁(yè)上存儲(chǔ)新分配的inode的信息,并給該物理頁(yè)的counter值加1;檢查counter,如果counter值超過(guò)定值m值,則申請(qǐng)一個(gè)新頁(yè),將超過(guò)counter值的頁(yè)的信息拷貝到新頁(yè)上。然后利用cpu提供的原子操作,用新頁(yè)在映射表里替換掉counter值超過(guò)m的頁(yè)。然后釋放掉超過(guò)counter值的物理頁(yè)。如果該inode所屬的物理頁(yè)不存在,則新分配一個(gè)物理頁(yè),存儲(chǔ)新分配的inode,并給該物理頁(yè)的counter值加1,同時(shí)在映射表里插入新分配的頁(yè)的物理地址。
2、修改inode:修改inode的信息,比如:訪問(wèn)一個(gè)文件,或者修改了文件。
具體的方法是:通過(guò)索引節(jié)點(diǎn)區(qū)起始虛擬地址和ino號(hào)計(jì)算出inode的虛擬地址,通過(guò)硬件mmu和映射表將inode的虛擬地址轉(zhuǎn)換為物理地址,從而找到該inode所在的物理頁(yè)并在物理頁(yè)上修改inode信息。同時(shí)給inode所在物理頁(yè)的counter值加1,檢查counter,如果counter值超過(guò)定值m值,則申請(qǐng)一個(gè)新頁(yè),將超過(guò)counter值的頁(yè)的信息拷貝到新頁(yè)上。然后利用cpu提供的原子操作,用新頁(yè)在映射表里替換掉counter值超過(guò)m的頁(yè)。然后釋放掉超過(guò)counter值的物理頁(yè)。
3、釋放inode:當(dāng)文件被刪除時(shí),需要釋放掉該文件的inode,并回收ino。
具體方法是:將inode的ino號(hào)回收并存放到inode空閑鏈表上,然后在映射表里將inode對(duì)應(yīng)的索引填充為0。