本發(fā)明涉及通信領域,具體而言,涉及一種存儲空間管理方法及裝置。
背景技術:
隨著云計算和大數(shù)據(jù)技術的迅猛發(fā)展,用戶對存儲系統(tǒng)的存儲效率與存儲質(zhì)量的要求越來越高,即,需要具備容量大、密度高、能耗低、讀寫速度快等特點的存儲系統(tǒng),而以動態(tài)隨機存取存儲器(Dynamic Random Access Memory,簡稱DRAM)與閃存Flash為代表的存儲介質(zhì)逐漸達到了技術瓶頸,例如容量和密度瓶頸。即,在相同面積下,DRAM與Flash的容量已經(jīng)很難再增加;此外,在很多手持設備中,DRAM的能耗,特別是刷新能耗已經(jīng)占據(jù)手持設備系統(tǒng)能耗的40%左右。而在一些數(shù)據(jù)中心中,DRAM的刷新能耗所帶來的成本增加也是不容小覷的。對于Flash而言,雖然密度大于DRAM,但其讀寫速度遠遠慢于DRAM,且寫入次數(shù)限制過小。這些不利因素,限制了Flash的未來應用。因此,長期以來研究人員都在不斷地尋找滿足要求的、新的存儲介質(zhì)。
隨著新型非易失存儲器(Non-Volatile Memory,簡稱NVM)取得了不小的進步,它們的大容量、高密度、低能耗、讀寫速度快、磨損周期長等特點引起了學術界和工業(yè)界的廣泛關注,使人們在云計算、大數(shù)據(jù)時代背景下,看到了存儲系統(tǒng)性能提升的希望,在云計算和大數(shù)據(jù)背景下,很多應用程序都會要求自己的數(shù)據(jù)或數(shù)據(jù)結構被持久化存儲。而持久化內(nèi)存不僅可以滿足這一要求,還可以減少存儲棧層次,提高存儲效率。應用程序使用持久化內(nèi)存最有效的一種方式,即將持久化內(nèi)存映射到進程地址空間中。如此一來,應用程序就可以直接讀寫持久化內(nèi)存區(qū)域,極大地減少額外開銷。當有多個進程都需要映射持久化內(nèi)存時,就要對整個持久化內(nèi)存進行有效的組織和管理,并根據(jù)應用的需求將指定大小的持久化存儲區(qū)域,映射到進程地址空間。映射完成后,該持久化存儲區(qū)域便可稱之為持久化堆,應用程序就可以在其中存儲需要持久化的數(shù)據(jù)或數(shù)據(jù)結構。這就是持久化內(nèi)存管理機制的應用場景和主要任務。但是由于NVM的持久性,即使重啟系統(tǒng),空閑空間也不會增多。若不對持久化空間的分配和釋放操作進行優(yōu)化處理,空閑空間很有可能在較短時間內(nèi)耗盡。因此,空間性能對于持久化內(nèi)存管理而言是非常重要的。
然而,上述的持久化內(nèi)存管理方案,卻在很大程度上忽視了空間效率。因此在如何解決NVM的內(nèi)存管理問題上,目前尚未提出有效的解決方案。
技術實現(xiàn)要素:
本發(fā)明提供了一種存儲空間管理方法及裝置,以至少解決相關技術中缺少針對NVM的內(nèi)存管理機制導致內(nèi)存空間分配效率低下的問題。
根據(jù)本發(fā)明的一個方面,提供了一種存儲空間管理方法,包括:接收應用程序的內(nèi)存空間請求;獲取內(nèi)存空間請求中所請求的空閑頁框數(shù)目;依據(jù)空閑頁框數(shù)目查詢空閑頁框組織,獲取與空閑頁框數(shù)目對應的連續(xù)空閑存儲空間大小相等的連續(xù)空閑存儲空間;將連續(xù)空閑存儲空間分配給應用程序。
進一步地,在空閑頁框組織包括:頁框鏈表或樹,頁框鏈表或樹包括:至少一個分配單元描述符,至少一個分配單元描述符用于描述連續(xù)存儲空間的存儲狀態(tài)以及連續(xù)存儲空間對應的頁框的起始地址和長度的情況下,依據(jù)空閑頁框數(shù)目查詢空閑頁框組織,獲取與空閑頁框數(shù)目對應的連續(xù)空閑存儲空間大小相等的連續(xù)空閑存儲空間的步驟包括:查詢頁框鏈表或樹中的至少一個分配單元描述符;將至少一個分配單元描述符中對應的連續(xù)空閑存儲空間的大小,與應用程序所請求的空閑頁框數(shù)目對應的連續(xù)空閑存儲空間進行匹配,查詢是否存在與空閑頁框數(shù)目對應的連續(xù)空閑存儲空間大小相等的連續(xù)空閑存儲空間;若存在與空閑頁框數(shù)目對應的連續(xù)空閑存儲空間大小相等的連續(xù)空閑存儲空間,則提取連續(xù)空閑存儲空間作為分配至空閑頁框數(shù)目對應的連續(xù)空閑存儲空間;其中,連續(xù)存儲空間的存儲狀態(tài)包括:已分配和空閑。
進一步地,將連續(xù)空閑存儲空間分配給應用程序的步驟包括:若頁框鏈表或樹中的連續(xù)空閑存儲空間的大小等于空閑頁框數(shù)目對應的連續(xù)空閑存儲空間大小,則將連續(xù)空閑存儲空間分配給應用程序;若頁框鏈表或樹中的連續(xù)空閑存儲空間的大小小于空閑頁框數(shù)目對應的連續(xù)空閑存儲空間大小,則在頁框鏈表或樹中查詢N個連續(xù)空閑存儲空間,判斷N個連續(xù)空閑存儲空間是否與空閑頁框數(shù)目對應的連續(xù)空閑存儲空間大小相等,N為整數(shù),且大于1;在判斷結果為是的情況下,將N個連續(xù)空閑存儲空間分配給應用程序。
進一步地,方法還包括:若N個連續(xù)空閑存儲空間小于空閑頁框數(shù)目對應的連續(xù)空閑存儲空間,則在頁框鏈表或樹中查找大于空閑頁框數(shù)目對應的連續(xù)空閑存儲空間大小的第一連續(xù)空閑存儲空間;若得到第一連續(xù)空閑存儲空間,則對第一連續(xù)空閑存儲空間進行切割,得到與空閑頁框數(shù)目對應的連續(xù)空閑存儲空間大小相等的第二連續(xù)空閑存儲空間;將第二連續(xù)空閑存儲空間分配給應用程序;其中,將第一連續(xù)空閑存儲空間切割后的剩余連續(xù)空閑存儲空間歸還至頁框鏈表或樹;若頁框鏈表或樹中最大的連續(xù)空閑存儲空間小于空閑頁框數(shù)目對應的連續(xù)空閑存儲空間,則在空閑頁框鏈表或樹中查詢是否存在小于最大連續(xù)空閑存儲空間的連續(xù)存儲空間,且連續(xù)存儲空間的大小與空閑頁框數(shù)目對應的連續(xù)空閑存儲空間匹配,若連續(xù)存儲空間小于空閑頁框數(shù)目對應的連續(xù)空閑存儲空間,則在空閑頁框鏈表或樹中查詢是否存在小于連續(xù)空閑存儲空間的連續(xù)存儲空間,直至查詢得到與空閑頁框數(shù)目對應的連續(xù)空閑存儲空間匹配的連續(xù)空閑存儲空間,或,提示當前沒有能夠與空閑頁框數(shù)目對應的連續(xù)空閑存儲空間匹配的連續(xù)空閑存儲空間。
進一步地,在將連續(xù)空閑存儲空間分配給應用程序之后,方法還包括:接收應用程序的持久化內(nèi)存請求,持久化內(nèi)存請求用于指示查詢應用程序預先存儲的數(shù)據(jù);依據(jù)持久化內(nèi)存請求,通過內(nèi)存系統(tǒng)中的對象描述符進行查詢,得到應用程序預先存儲的數(shù)據(jù);其中,對象描述符用于指示包含至少一個分配單元描述符的頁框鏈表或樹。
根據(jù)本發(fā)明的另一方面,提供了一種存儲空間管理裝置,包括:第一接收模塊,用于接收應用程序的內(nèi)存空間請求;獲取模塊,用于獲取內(nèi)存空間請求中所請求的空閑頁框數(shù)目;第一查詢模塊,用于依據(jù)空閑頁框數(shù)目查詢空閑頁框組織,獲取與空閑頁框數(shù)目對應的連續(xù)空閑存儲空間大小相等的連續(xù)空閑存儲空間;分配模塊,用于將連續(xù)空閑存儲空間分配給應用程序。
進一步地,在空閑頁框組織包括:頁框鏈表或樹,頁框鏈表或樹包括:至少一個分配單元描述符,至少一個分配單元描述符用于描述連續(xù)存儲空間的存儲狀態(tài)以及連續(xù)存儲空間對應的頁框的起始地址和長度的情況下,第一查詢模塊包括:查詢單元,用于查詢頁框鏈表或樹中的至少一個分配單元描述符;第一匹配單元,用于將至少一個分配單元描述符中對應的連續(xù)空閑存儲空間的大小,與應用程序所請求的空閑頁框數(shù)目對應的連續(xù)空閑存儲空間進行匹配,查詢是否存在與空閑頁框數(shù)目對應的連續(xù)空閑存儲空間大小相等的連續(xù)空閑存儲空間;第二匹配單元,用于若存在與空閑頁框數(shù)目對應的連續(xù)空閑存儲空間大小相等的連續(xù)空閑存儲空間,則提取連續(xù)空閑存儲空間作為分配至空閑頁框數(shù)目對應的連續(xù)空閑存儲空間;其中,連續(xù)存儲空間的存儲狀態(tài)包括:已分配和空閑。
進一步地,分配模塊包括:第一分配單元,用于在頁框鏈表或樹中的連續(xù)空閑存儲空間的大小等于空閑頁框數(shù)目對應的連續(xù)空閑存儲空間大小的情況下,將連續(xù)空閑存儲空間分配給應用程序;判斷單元,用于在頁框鏈表或樹中的連續(xù)空閑存儲空間的大小小于空閑頁框數(shù)目對應的連續(xù)空閑存儲空間大小的情況下,在頁框鏈表或樹中查詢N個連續(xù)空閑存儲空間,判斷N個連續(xù)空閑存儲空間是否與空閑頁框數(shù)目對應的連續(xù)空閑存儲空間大小相等,N為整數(shù),且大于1;第二分配單元,用于在判斷結果為是的情況下,將N個連續(xù)空閑存儲空間分配給應用程序。
進一步地,分配模塊還包括:空間查詢單元,用于在N個連續(xù)空閑存儲空間小于空閑頁框數(shù)目對應的連續(xù)空閑存儲空間的情況下,在頁框鏈表或樹中查找大于空閑頁框數(shù)目對應的連續(xù)空閑存儲空間大小的第一連續(xù)空閑存儲空間;空間切割單元,用于在得到第一連續(xù)空閑存儲空間的情況下,對第一連續(xù)空閑存儲空間進行切割,得到與空閑頁框數(shù)目對應的連續(xù)空閑存儲空間大小相等的第二連續(xù)空閑存儲空間;第三分配單元,用于將第二連續(xù)空閑存儲空間分配給應用程序;其中,將第一連續(xù)空閑存儲空間切割后的剩余連續(xù)空閑存儲空間歸還至頁框鏈表或樹;第四分配單元,用于在頁框鏈表或樹中最大的連續(xù)空閑存儲空間小于空閑頁框數(shù)目對應的連續(xù)空閑存儲空間的情況下,在空閑頁框鏈表或樹中查詢是否存在小于最大連續(xù)空閑存儲空間的連續(xù)存儲空間,且連續(xù)存儲空間的大小與空閑頁框數(shù)目對應的連續(xù)空閑存儲空間匹配,若連續(xù)存儲空間小于空閑頁框數(shù) 目對應的連續(xù)空閑存儲空間,則在空閑頁框鏈表或樹中查詢是否存在小于連續(xù)空閑存儲空間的連續(xù)存儲空間,直至查詢得到與空閑頁框數(shù)目對應的連續(xù)空閑存儲空間匹配的連續(xù)空閑存儲空間,或,提示當前沒有能夠與空閑頁框數(shù)目對應的連續(xù)空閑存儲空間匹配的連續(xù)空閑存儲空間。
進一步地,裝置還包括:第二接收模塊,用于在將連續(xù)空閑存儲空間分配給應用程序之后,接收應用程序的持久化內(nèi)存請求,持久化內(nèi)存請求用于指示查詢應用程序預先存儲的數(shù)據(jù);第二查詢模塊,用于依據(jù)持久化內(nèi)存請求,通過內(nèi)存系統(tǒng)中的對象描述符進行查詢,得到應用程序預先存儲的數(shù)據(jù);其中,對象描述符用于指示包含至少一個分配單元描述符的頁框鏈表或樹。
通過本發(fā)明,采用接收應用程序的內(nèi)存空間請求;獲取內(nèi)存空間請求中所請求的空閑頁框數(shù)目;依據(jù)空閑頁框數(shù)目查詢空閑頁框組織,獲取與空閑頁框數(shù)目對應的連續(xù)空閑存儲空間大小相等的連續(xù)空閑存儲空間;將連續(xù)空閑存儲空間分配給應用程序。解決了相關技術中缺少針對NVM的內(nèi)存管理機制導致內(nèi)存空間分配效率低下的問題,進而達到了提升NVM的內(nèi)存管理效率的效果。
附圖說明
此處所說明的附圖用來提供對本發(fā)明的進一步理解,構成本申請的一部分,本發(fā)明的示意性實施例及其說明用于解釋本發(fā)明,并不構成對本發(fā)明的不當限定。在附圖中:
圖1是根據(jù)本發(fā)明實施例的存儲空間管理方法的流程圖;
圖2是根據(jù)本發(fā)明實施例的一種內(nèi)存池結構的結構框圖;
圖3是根據(jù)本發(fā)明實施例的一種元數(shù)據(jù)內(nèi)存池子池初始狀態(tài)圖;
圖4是根據(jù)本發(fā)明實施例一種元數(shù)據(jù)內(nèi)存池子池第一次分配后狀態(tài)圖;
圖5是根據(jù)本發(fā)明實施例一種元數(shù)據(jù)內(nèi)存池子池第二次分配后狀態(tài)圖;
圖6是根據(jù)本發(fā)明實施例一種元數(shù)據(jù)內(nèi)存池子池釋放第一個元素后狀態(tài)圖;
圖7是根據(jù)本發(fā)明實施例一種空閑頁框組織結構圖;
圖8是根據(jù)本發(fā)明實施例的存儲空間管理裝置的結構框圖;
圖9是根據(jù)本發(fā)明實施例的一種存儲空間管理裝置的結構框圖;
圖10是根據(jù)本發(fā)明實施例的另一種存儲空間管理裝置的結構框圖;以及,
圖11是根據(jù)本發(fā)明實施例的又一種存儲空間管理裝置的結構框圖。
具體實施方式
下文中將參考附圖并結合實施例來詳細說明本發(fā)明。需要說明的是,在不沖突的情況下,本申請中的實施例及實施例中的特征可以相互組合。
需要說明的是,本發(fā)明的說明書和權利要求書及上述附圖中的術語“第一”、“第二”等是用于區(qū)別類似的對象,而不必用于描述特定的順序或先后次序。
實施例一
本實施例提供的存儲空間管理方法可以適用于非易失存儲存儲器,其中,非易失存儲存儲器(Non-Volatile Memory,簡稱NVM)至少可以包括:阻變式存儲器(Resistive RAM,簡稱RRAM)、相變存儲器(Phase Change Memory,簡稱PCM)、磁性隨機存儲器(Magnetic RAM,簡稱MRAM)以及自旋力矩轉移存儲器(Spin-Torque Transfer RAM,簡稱STT RAM)。其中,該類型的存儲器具備大容量、高密度、低能耗、讀寫速度快、磨損周期長等特點,該類型的存儲器可以直接連接到處理器內(nèi)存子系統(tǒng)中,即和內(nèi)存總線相連。在這種情況下,NVM可被稱為持久化內(nèi)存,即持久化內(nèi)存Persistent Memory。在云計算和大數(shù)據(jù)背景下,很多應用程序都會要求自己的數(shù)據(jù)或數(shù)據(jù)結構被持久化存儲。而持久化內(nèi)存不僅可以滿足這一要求,還可以減少存儲棧層次,提高存儲效率。應用程序使用持久化內(nèi)存最有效的一種方式,即將持久化內(nèi)存映射到進程地址空間中。如此一來,應用程序就可以直接讀寫持久化內(nèi)存區(qū)域,極大地減少額外開銷。當有多個進程都需要映射持久化內(nèi)存時,就要對整個持久化內(nèi)存進行有效的組織和管理,并根據(jù)應用的需求將指定大小的持久化存儲區(qū)域,映射到進程地址空間。映射完成后,該持久化存儲區(qū)域便可稱之為持久化堆,應用程序就可以在其中存儲需要持久化的數(shù)據(jù)或數(shù)據(jù)結構。
但是由于相關持久化內(nèi)存管理方案中基于傳統(tǒng)頁框管理機制在buddy系統(tǒng)基礎之上,針對NVM磨損周期短、讀寫性能不對稱等特性進行優(yōu)化設計,而未考慮buddy系統(tǒng)帶來的空間浪費問題。該問題主要表現(xiàn)在以下幾個方面:
首先,在向buddy系統(tǒng)請求分配空間時,即使用戶申請的頁框數(shù)不是2的冪,但buddy系統(tǒng)總是按照2的冪進行分配。比如,用戶只請求300個頁框,但buddy系統(tǒng)會分配給它512個頁框。顯然,這浪費了212個頁框。同樣由于上述原因,可能會出現(xiàn)即使有足夠的連續(xù)空間,也不能分配給用戶的情況。比如,當前最大的連續(xù)空閑頁框數(shù)是384,而用戶同樣申請300個頁框。雖然空閑頁框數(shù)大于請求的頁框數(shù),但buddy系統(tǒng)依然會嘗試分配512個連續(xù)頁框。顯然,此時不能滿足分配請求,而無形中這384個連續(xù)頁框沒有得到充分利用,導致了空間浪費。
其次,由于頁表機制的存在,在向進程/內(nèi)核地址空間映射時,被映射的存儲空間不一定非要連續(xù)。而buddy系統(tǒng)沒有充分利用這一點,只提供了連續(xù)頁框的分配方式。 如此一來,就可能會出現(xiàn)即使有足夠的不連續(xù)空閑空間,也不能滿足用戶分配要求的情況。在這種情況下,很有可能造成一些小的內(nèi)存碎片長期得不到使用,導致空間浪費。
最后,雖然buddy系統(tǒng)只能按照2的冪進行頁框分配,但是構建于buddy系統(tǒng)之上的內(nèi)存管理機制,可以通過多次調(diào)用buddy系統(tǒng),以達到滿足非2的冪的空間請求的同時,保證不多分配空間給用戶的目的。該方法是基于如下規(guī)律,即任何一個整數(shù)都能以二進制形式表示。比如用戶申請255個頁框,可以轉換成8次對buddy系統(tǒng)的調(diào)用。其中,每次分別申請128、64、32、16、8、4、2、1個連續(xù)頁框。該方法雖然避免了因buddy系統(tǒng)只按照2的冪進行分配所造成的空間浪費,但是引入了過多的元數(shù)據(jù)。每次buddy系統(tǒng)進行分配后,都需要一個元數(shù)據(jù)描述當前獲得的空間。顯然,上述例子中需要8個元數(shù)據(jù),才能描述8次調(diào)用所獲得的空間。因此,上述方法的主要缺陷,即元數(shù)據(jù)空間開銷過大。
并且,在文件系統(tǒng)進行管理時,在NVM上建立文件系統(tǒng),然后使用一個文件或其他對象映射進內(nèi)存mmap的方式映射持久化內(nèi)存。實際上,文件系統(tǒng)的應用場景和前面描述的持久化內(nèi)存的應用場景是截然不同的。雖然可以使用文件系統(tǒng)完成持久化內(nèi)存映射和反映射的任務,但是文件系統(tǒng)中的許多設計,對持久化內(nèi)存應用場景而言是不合適的。使用文件系統(tǒng)管理持久化內(nèi)存的主要問題,即元數(shù)據(jù)部分的空間開銷過大。例如,在一些文件系統(tǒng)中,使用位圖管理數(shù)據(jù)塊,其中位圖的長度和存儲空間的大小成比例。如此一來,存儲空間越大,位圖所代表的元數(shù)據(jù)部分所占據(jù)的空間也就越大。換句話說,元數(shù)據(jù)的使用量不具備可擴展性,其空間開銷過大。再比如,一些文件系統(tǒng)認識到了上述位圖設計方案空間性能不佳,而采用了B樹組織一個文件的若干連續(xù)存儲空間。其中,B樹節(jié)點的大小即一個數(shù)據(jù)塊的大小,比如4KBytes。這種設計對于文件系統(tǒng)而言可能是高效的,但是對于持久化內(nèi)存應用場景卻是不適合的。應用程序在向持久化內(nèi)存管理機制申請映射空間時,通常都會給出被映射的空間大小。因此,若要使用文件系統(tǒng)管理持久化內(nèi)存,最高效的做法之一,就是在進行mmap操作之前,首先調(diào)用fallocate等函數(shù)為被映射的文件,盡可能地預留連續(xù)物理空間。雖然應用程序可以通過增大被映射文件的方式,以擴容其持久化堆空間,但是該操作往往只會發(fā)生在其持久化堆的剩余空間過小時。換句話說,一個持久化堆對應的映射文件,所包含的連續(xù)空間的個數(shù),相對于普通文件而言很有限。因此在這種情況下,使用B樹,甚至是使用B樹的一個節(jié)點,組織被映射文件的、個數(shù)極其有限的連續(xù)空間,是非常浪費的。另外,文件系統(tǒng)中的一些元數(shù)據(jù)結構,比如塊組及其描述符表等,對于持久化內(nèi)存應用場景而言,完全是不需要的。顯然,這部分元數(shù)據(jù)所占用的空間,也是被浪費掉了。
因此,本發(fā)明實施例針對上述問題提供一種存儲空間管理方法,基于NVM介質(zhì)特點和持久化內(nèi)存應用場景,具體如下:
在本實施例中提供了一種存儲空間管理方法,圖1是根據(jù)本發(fā)明實施例的存儲空間 管理方法的流程圖,如圖1所示,該流程包括如下步驟:
步驟S102,接收應用程序的內(nèi)存空間請求;
步驟S104,獲取內(nèi)存空間請求中所請求的空閑頁框數(shù)目;
步驟S106,依據(jù)空閑頁框數(shù)目查詢空閑頁框組織,獲取與空閑頁框數(shù)目對應的連續(xù)空閑存儲空間大小相等的連續(xù)空閑存儲空間;
步驟S108,將連續(xù)空閑存儲空間分配給應用程序。
具體的,首先接收來自應用程序的內(nèi)存空間請求,其次,在對該內(nèi)存空間請求進行解析的過程中,獲取該內(nèi)存空間請求中該應用程序所請求的空閑頁框數(shù)目,第三,在獲取到空閑頁框數(shù)目后查詢頁框鏈表或樹,進而獲取與該空閑頁框數(shù)目對應的連續(xù)空閑存儲空間大小相等的連續(xù)空閑存儲空間,最后,將連續(xù)空閑存儲空間分配給應用程序。
通過上述步驟,采用接收應用程序的內(nèi)存空間請求;獲取內(nèi)存空間請求中所請求的空閑頁框數(shù)目;依據(jù)空閑頁框數(shù)目查詢頁框鏈表或樹,獲取與空閑頁框數(shù)目對應的連續(xù)空閑存儲空間大小相等的連續(xù)空閑存儲空間;將連續(xù)空閑存儲空間分配給應用程序。解決了相關技術中缺少針對NVM的內(nèi)存管理機制導致內(nèi)存空間分配效率低下的問題,進而達到了提升NVM的內(nèi)存管理效率的效果。
本實施例在實現(xiàn)存儲空間管理方法的過程中還提供了以下兩種元數(shù)據(jù):
一是代表連續(xù)頁框的分配單元描述符,其中,無論是空閑空間,還是已分配空間,均是分配單元描述符表示;且,分配單元描述符中,會存放其描述的連續(xù)頁框的起始地址和長度等信息。
二是代表持久化堆的對象描述符。對應的,對象描述符會指向一個包含了若干分配單元描述符的鏈表,以表示其對應的持久化堆所包含的若干連續(xù)頁框。為了減少元數(shù)據(jù)分配和釋放操作所產(chǎn)生的內(nèi)存碎片,本實施例還設計了元數(shù)據(jù)內(nèi)存池。由于有兩種元數(shù)據(jù),所以分別實例化了分配單元描述符內(nèi)存池和對象描述符內(nèi)存池。
進一步地,在空閑頁框組織包括:頁框鏈表或樹,頁框鏈表或樹包括:至少一個分配單元描述符,至少一個分配單元描述符用于描述連續(xù)存儲空間的存儲狀態(tài)以及連續(xù)存儲空間對應的頁框的起始地址和長度的情況下,步驟S106中的依據(jù)空閑頁框數(shù)目查詢空閑頁框組織,獲取與空閑頁框數(shù)目對應的連續(xù)空閑存儲空間大小相等的連續(xù)空閑存儲空間的步驟包括:
Step1,查詢頁框鏈表或樹中的至少一個分配單元描述符;
Step2,將至少一個分配單元描述符中對應的連續(xù)空閑存儲空間的大小,與應用程序所請求的空閑頁框數(shù)目對應的連續(xù)空閑存儲空間進行匹配,查詢是否存在與空閑頁框數(shù)目對應的連續(xù)空閑存儲空間大小相等的連續(xù)空閑存儲空間;
Step3,若存在與空閑頁框數(shù)目對應的連續(xù)空閑存儲空間大小相等的連續(xù)空閑存儲空間,則提取連續(xù)空閑存儲空間作為分配至空閑頁框數(shù)目對應的連續(xù)空閑存儲空間。
其中,連續(xù)存儲空間的存儲狀態(tài)包括:已分配和空閑。
具體的,在空閑頁框組織(即,對應的連續(xù)空閑存儲空間)方面,本實施例根據(jù)連續(xù)頁框?qū)倪B續(xù)空閑存儲空間的大小,將連續(xù)空閑存儲空間對應的分配單元描述符放入頁框鏈表或樹中。本實施例以提供了一共使用了127個空閑頁框鏈表為例進行說明,其中,每個頁框鏈表由多個分配單元描述符組成,同一個頁框鏈表中分配單元描述符對應的存儲空間大小相同。例如,第1個頁框鏈表中,每個分配單元描述符對應的空間大小是1個頁框;第2個頁框鏈表中,每個分配單元描述符對應的空間大小是2個連續(xù)頁框;第3個頁框鏈表中,每個分配單元描述符對應的空間大小是3個連續(xù)頁框,直至第127個頁框鏈表中,每個分配單元描述符對應的空間大小時127個連續(xù)頁框。
另外,本實施例還提供了以使用了5棵平衡二叉樹為例進行說明,其中,該5可平衡二叉樹用于存放較大的連續(xù)頁框。其中,樹的key即連續(xù)頁框的大小。每棵樹也是由多個分配單元描述符組成,同一棵樹內(nèi)的分配單元描述符對應的空間大小設置為在固定的范圍內(nèi)。例如,第1棵樹中,每個分配單元描述符對應的空間大小在128個頁框到255個頁框之間,第2棵樹中是在256個頁框到511個頁框之間,第3棵樹中是在512個頁框到1023個頁框之間,第4棵樹中是在1024個頁框到2047個頁框之間,超過2048個連續(xù)頁框空閑空間對應的分配單元描述符,位于第5棵樹。有可能存在多個分配單元描述符對應同一個樹節(jié)點,即這些分配單元描述符所對應的連續(xù)空間大小相等。此時,會以鏈表的形式組織這些分配單元描述符,并由樹節(jié)點指向該鏈表。
綜上,通過查詢頁框鏈表或樹中的至少一個分配單元描述符,將至少一個分配單元描述符中對應的連續(xù)空閑存儲空間的大小,與應用程序所請求的空閑頁框數(shù)目對應的連續(xù)空閑存儲空間進行匹配,在頁框鏈表或樹中是否存在與應用程序請求的空閑頁框數(shù)目對應的連續(xù)空閑存儲空間大小相等的連續(xù)空閑存儲空間。
進一步地,步驟S108中的將連續(xù)空閑存儲空間分配給應用程序的步驟包括:
Step1,若頁框鏈表或樹中的連續(xù)空閑存儲空間的大小等于空閑頁框數(shù)目對應的連續(xù)空閑存儲空間大小,則將連續(xù)空閑存儲空間分配給應用程序;
具體的,根據(jù)應用程序請求的空閑頁框數(shù)目對應的連續(xù)空閑存儲空間的大小,在頁框鏈表或樹中查找和該空閑頁框數(shù)目對應的連續(xù)空閑存儲空間大小相等的連續(xù)空間。
或者,
Step2,若頁框鏈表或樹中的連續(xù)空閑存儲空間的大小小于空閑頁框數(shù)目對應的連續(xù)空閑存儲空間大小,則在頁框鏈表或樹中查詢N個連續(xù)空閑存儲空間,判斷N個連續(xù)空閑存儲空間是否與空閑頁框數(shù)目對應的連續(xù)空閑存儲空間大小相等,N為整數(shù),且大 于1;
Step3,在判斷結果為是的情況下,將N個連續(xù)空閑存儲空間分配給應用程序。
具體的,若在Step1的基礎上,應用程序所請求的空閑頁框數(shù)目對應的連續(xù)空閑存儲空間的大小無法被滿足,則依據(jù)Step2和Step3在頁框鏈表或樹中查找兩個連續(xù)空閑存儲空間的大小與該空閑頁框數(shù)目對應的連續(xù)空閑存儲空間大小相等的連續(xù)空閑存儲空間。
本實施例以2個連續(xù)空閑存儲空間為例對存儲空間管理方法進行說明,以實現(xiàn)本實施例提供的存儲空間管理方法為準,具體不做限定。
進一步地,在上述步驟S108中Step1至Step3并列的方案中,本實施了提供的存儲空間管理方法還包括:
Step4,若N個連續(xù)空閑存儲空間小于空閑頁框數(shù)目對應的連續(xù)空閑存儲空間,則在頁框鏈表或樹中查找大于空閑頁框數(shù)目對應的連續(xù)空閑存儲空間大小的第一連續(xù)空閑存儲空間;
Step5,若得到第一連續(xù)空閑存儲空間,則對第一連續(xù)空閑存儲空間進行切割,得到與空閑頁框數(shù)目對應的連續(xù)空閑存儲空間大小相等的第二連續(xù)空閑存儲空間;
Step6,將第二連續(xù)空閑存儲空間分配給應用程序;
其中,將第一連續(xù)空閑存儲空間切割后的剩余連續(xù)空閑存儲空間歸還至頁框鏈表或樹;
具體的,基于Step1,Step2和Step3對應的連續(xù)空閑存儲空間的分配方式,當Step1,Step2和Step3提供的分配方案均無法滿足應用程序所請求的空閑頁框數(shù)目對應的連續(xù)空閑存儲空間的大小時,依據(jù)Step4至Step6提供的方法在頁框鏈表或樹中查找最接近、但大于所請求大小的第一連續(xù)空閑存儲空間,在找到該第一連續(xù)空閑存儲空間后,會對該第一連續(xù)空閑存儲空間進行切割,分離出與空閑頁框數(shù)目對應的連續(xù)空閑存儲空間大小相等的第二連續(xù)空閑存儲空間,并將剩下的連續(xù)空閑存儲空間放入對應的頁框鏈表或樹中。
Step7,若頁框鏈表或樹中最大的連續(xù)空閑存儲空間小于空閑頁框數(shù)目對應的連續(xù)空閑存儲空間,則在空閑頁框鏈表或樹中查詢是否存在小于最大連續(xù)空閑存儲空間的連續(xù)存儲空間,且連續(xù)存儲空間的大小與空閑頁框數(shù)目對應的連續(xù)空閑存儲空間匹配,若連續(xù)存儲空間小于空閑頁框數(shù)目對應的連續(xù)空閑存儲空間,則在空閑頁框鏈表或樹中查詢是否存在小于連續(xù)空閑存儲空間的連續(xù)存儲空間,直至查詢得到與空閑頁框數(shù)目對應的連續(xù)空閑存儲空間匹配的連續(xù)空閑存儲空間,或,提示當前沒有能夠與空閑頁框數(shù)目對應的連續(xù)空閑存儲空間匹配的連續(xù)空閑存儲空間。
具體的,當Step1,Step2和Step3以及Step4至Step6提供的分配方案均無法滿足應用程序所請求的空閑頁框數(shù)目對應的連續(xù)空閑存儲空間的大小時,即當前系統(tǒng)最大連續(xù)空間都小于所請求的大小時,首先在空閑頁框鏈表或樹中查找最大的連續(xù)空間;其次,會遞歸地查找次大的連續(xù)空間,直到獲取到滿足該空閑頁框數(shù)目對應的連續(xù)空閑存儲空間大小相等的連續(xù)空閑存儲空間為止。
此外,在進行頁框釋放時,會檢查與被釋放頁框物理連續(xù)的頁框的狀態(tài)。若該物理連續(xù)的頁框是空閑的,則會引發(fā)合并操作。即,只使用一個分配單元描述符表示合并后的連續(xù)頁框。
由此得出,在頁框分配以及釋放的過程(即,連續(xù)空閑存儲空間分配及釋放的過程)中,本實施例提供的存儲空間管理方法能夠以使用最少的分配單元描述符為代價,滿足應用程序?qū)B續(xù)空閑存儲空間的大小需求,以及在已分配的連續(xù)存儲空間釋放后,依然能夠以一個分配單元描述符將已釋放后的連續(xù)存儲空間進行合并,從而節(jié)約系統(tǒng)資源。
進一步地,在步驟S108將連續(xù)空閑存儲空間分配給應用程序之后,本實施例提供的存儲空間管理方法還包括:
步驟S109,接收應用程序的持久化內(nèi)存請求,持久化內(nèi)存請求用于指示查詢應用程序預先存儲的數(shù)據(jù);
步驟S110,依據(jù)持久化內(nèi)存請求,通過內(nèi)存系統(tǒng)中的對象描述符進行查詢,得到應用程序預先存儲的數(shù)據(jù);
其中,對象描述符用于指示包含至少一個分配單元描述符的頁框鏈表或樹。
具體的,這里所說的對象,即持久化堆。由步驟S109和步驟S110中的方法,對象或持久化堆,是由對象描述符表示,該對象描述符中除了包含由分配單元描述符組成的頁框鏈表外,還保存了持久化堆的標識。通過該標識,可以讓應用程序找回之前申請到的持久化內(nèi)存。本實施例中,將所有的對象描述符組織到一個平衡二叉樹中。其中,樹的key即持久化堆的標識。
本實施例提供的存儲空間管理方法與相關技術的區(qū)別是:與基于傳統(tǒng)頁框管理機制的方案不同,本實施例不會多分配持久化內(nèi)存給應用程序。而是依據(jù)Step1至Step7中對應描述的四種分配策略,無論哪一種策略,都是按照應用申請的頁框數(shù)進行分配。即應用申請多少頁框,就分配多少頁框,不會出現(xiàn)浪費空間的情況。
其次,與基于傳統(tǒng)頁框管理機制的方案不同,本實施例不會出現(xiàn)有足夠空閑空間,卻不能進行分配的情況。仍舊依據(jù)Step1至Step7中對應描述的四種分配策略為例,在本實施例中當釋放頁框時,總是會盡力合并相鄰的空閑連續(xù)頁框。換句話說,在空閑鏈表和樹中的連續(xù)頁框都是不可再合并的。因此按照切割分配的原則,是不可能出現(xiàn)有足夠的連續(xù)空間,卻不能進行分配的情況。另一方面,組合分配和盡力分配的策略,會將 離散的多個連續(xù)空間組合起來進行分配。因此,也不可能出現(xiàn)有足夠的若干不連續(xù)空間,卻不能進行分配的情況。很顯然,上述兩項優(yōu)勢,有利于提升持久化內(nèi)存的空間利用率。
第三,與相關的持久化內(nèi)存管理方案相比,本實施例的元數(shù)據(jù)空間開銷很小,且元數(shù)據(jù)使用量具有可擴展性。具體的,本實施例中,元數(shù)據(jù)主要包括分配單元描述符和對象描述符,而這兩個描述符會構成鏈表或樹的節(jié)點。其中,分配單元描述符包含了所描述的連續(xù)頁框的起始地址和長度、與所描述的連續(xù)空間物理相鄰的空間所對應的分配單元描述符的地址、構成鏈表或樹的指針等信息;而對象描述符則包含了持久化堆標識、指向分配單元描述符鏈表的指針、構成樹的指針等信息。很顯然,本實施例設計的兩種元數(shù)據(jù)所占的空間都很小,均在幾十個字節(jié)以內(nèi)。而與文件系統(tǒng)不同的是,將整個數(shù)據(jù)塊作為一個B樹節(jié)點。
在進行空閑頁框分配時,每次只會增加一個或兩個元數(shù)據(jù)。如果是新映射一個持久化堆,則會新增一個對象描述符;而如果只是對已有的持久化堆擴容,則不會增加對象描述符。下面說明分配單元描述符的增加情況。其中,在按照確切分配策略進行空間分配時,可以直接將找到的分配單元描述符,加入到對象描述符所包含的頁框鏈表中。因此,不會增加新的分配單元描述符。在按照組合分配策略進行空間分配時,由于只會使用找到的兩個分配單元描述符,因此該種情況也不會新增分配單元描述符。在按照切割分配策略進行空間分配時,會對找到的空閑空間進行分割,此時就需要一個新的分配單元描述符以表示切割后剩余的空間或分配出去的空間。在按照盡力分配策略進行空間分配時,會找到若干個分配單元描述符及其對應的空閑空間。如果這些空閑空間的大小之和,恰好等于請求的空間大小,則無需新增分配單元描述符。否則,將需要對最后找到的那個空閑空間進行切割。在這種情況下,將會新增一個分配單元描述符。進行持久化堆擴容時,本實施例在實施四項分配策略時,會盡量在原有空間的尾部(即高地址部分)分配新空間,即新空間和原有空間物理相鄰。如此一來,就可以將原有空間和新空間進行合并,即減少分配單元描述符的個數(shù)。
在歸還頁框時,本實施例會合并物理相鄰的空閑空間。因此,歸還操作也可能會減少分配單元描述符。
本實施例中,除了對象描述符和分配單元描述符外,元數(shù)據(jù)部分還包括:大小固定的NVM總描述符和日志區(qū)域。其中,NVM總描述符和日志區(qū)域所占空間很小,只有一個頁框。
綜上,元數(shù)據(jù)部分的空間復雜度即為O(CN+ε),其中N為持久化堆的個數(shù)、C為一個堆進行擴容操作的次數(shù)、ε為NVM總描述符等代表的固定開銷,而CN即持久化空間申請的次數(shù)。如前所述,通常情況下只有當持久化堆的剩余空閑空間不夠用時,才會引發(fā)擴容操作,因此擴容次數(shù)即C通常很小,完全可以當作一個常量。如此一來,元數(shù)據(jù)部分的空間復雜度,只和持久化堆的個數(shù)有關,而與分配的空間大小或整個持久化內(nèi)存大小無關,具備良好的可擴展性。
第四,本實施例在持久化內(nèi)存內(nèi)部為持久化堆建立了索引結構,即對象描述符組成的一棵平衡二叉樹。通過持久化堆的標識,就可以在這棵樹中找到對應的對象描述符,以及持久化堆所擁有的若干連續(xù)存儲空間,即實現(xiàn)了頁框找回。上述方案所提供的名字服務,僅依賴于持久化內(nèi)存內(nèi)部維護的數(shù)據(jù)結構,避免了之前分析的通過外部存儲找回頁框而帶來的不可靠問題。
具體的,下面首先介紹本實施例中應用到的持久化內(nèi)存的總體布局,然后再分析元數(shù)據(jù)及其內(nèi)存池,并在此基礎之上,介紹頁框的組織與分配,以及對象描述符的組織與管理。
第一,內(nèi)存布局:
在整個持久化內(nèi)存空間的頭部,有一個被稱為NVM總描述符的固定大小區(qū)域。該區(qū)域包含了整個持久化內(nèi)存管理機制的控制描述信息,比如各類標志信息、空閑頁框管理結構信息等等。下面給出了這個頭部區(qū)域的結構定義,即NVM總描述符。
struct NvmDescriptor
{
unsigned long FormatFlag;
unsigned long InitialFlag;
unsigned long NVMSize;
unsigned long MetaDataSize;
unsigned long FreePageNumber;
NvmAllocUnitDescriptorInList*FreePageLists[127];
NvmAllocUnitDescriptorInTree*FreePageTrees[5];
NvmObjectDestriptor*NvmObjectTree;
struct NvmMetaDataPool AllocUnitDescriptorMemoryPoolForList;
struct NvmMetaDataPool AllocUnitDescriptorMemoryPoolForTree;
struct NvmMetaDataPool NvmObjectDescriptorMemoryPool;
};
NvmDescriptor結構體中的各個字段解釋如下:
FormatFlag:格式化標志,用于判斷當前持久化內(nèi)存是否已經(jīng)完成了格式化。
InitialFlag:初始化標志,用于標識系統(tǒng)啟動時故障恢復中的各個階段。
NVMSize:NVM區(qū)大小,用于表示整個持久化內(nèi)存的空間大小。
MetaDataSize:整個持久化內(nèi)存中,元數(shù)據(jù)部分所占大小。
FreePageNumber:整個持久化內(nèi)存中,未被使用的頁框數(shù)目。
FreePageLists:空閑頁框鏈表入口。該入口一共包含了127個指針,分別指向?qū)目臻e頁框鏈表NvmAllocUnitDescriptorInList(該結構將在后面描述)。
FreePageTrees:空閑頁框樹入口。該入口一共包含了5個指針,分別指向?qū)目臻e頁框樹NvmAllocUnitDescriptorInTree(該結構將在后面描述)。
NvmObjectTree:對象描述符樹入口,即指向?qū)ο竺枋龇麡銷vmObjectDestriptor(該結構將在后面描述)。
AllocUnitDescriptorMemoryPoolForList:位于鏈表中的分配單元描述符內(nèi)存池入口點結構。該入口點類型NvmMetaDataPool,將在后面描述。
AllocUnitDescriptorMemoryPoolForTree:位于樹中的分配單元描述符內(nèi)存池入口點結構。該入口點類型NvmMetaDataPool,將在后面描述。
NvmObjectDescriptorMemoryPool:對象描述符內(nèi)存池入口點結構。該入口點類型NvmMetaDataPool,將在后面描述。
實際上,上述NvmDescriptor結構體占據(jù)在持久化內(nèi)存的頭部區(qū)域,即第一個頁框中。其中,頁框的大小設為4KBytes。由于NvmDescriptor的大小僅1KBbytes多,因此第一個頁框的剩余部分作為了日志區(qū)域使用。
第二,元數(shù)據(jù)及內(nèi)存池
a、元數(shù)據(jù)結構
如前所述,本專利方案使用了兩種元數(shù)據(jù),一是分配單元描述符,二是對象描述符。分配單元描述符用于表示一段連續(xù)頁框,下面給出了其各個字段的定義。
struct NvmAllocUnitDescriptor
{
unsigned long SpaceAddress;
unsigned long SpaceSize;
unsigned long PreSpaceAddress;
unsigned long NextSpaceAddress;
unsigned long Flags;
};
NvmAllocUnitDescriptor即分配單元描述符,其各個字段含義如下。
SpaceAddress:當前分配單元描述符所表示的連續(xù)頁框的基地址。
SpaceSize:當前分配單元描述符所表示的連續(xù)頁框的大小。
PreSpaceAddress:與當前分配單元描述符所描述空間物理相鄰(前驅(qū))的連續(xù)空間, 對應的分配單元描述符的地址。
NextSpaceAddress:與當前分配單元描述符所描述空間物理相鄰(后繼)的連續(xù)空間,對應的分配單元描述符的地址。
Flags:當前分配單元描述符對應的連續(xù)空間的狀態(tài)標志,包括是否是空閑空間等信息。
由于分配單元描述符可以位于鏈表或樹中,因此NvmAllocUnitDescriptor結構體衍生出了兩種包裹結構,即NvmAllocUnitDescriptorInList和NvmAllocUnitDescriptorInTree。這兩個結構體的定義如下。
struct NvmAllocUnitDescriptorInList
{
struct NvmAllocUnitDescriptorInList*Prev;
struct NvmAllocUnitDescriptorInList*Next;
struct NvmAllocUnitDescriptor AllocDescriptor;
};
struct NvmAllocUnitDescriptorInTree
{
struct NvmAllocUnitDescriptorInTree*LeftChild;
struct NvmAllocUnitDescriptorInTree*RightChild;
struct NvmAllocUnitDescriptorInTree*Parent;
struct NvmAllocUnitDescriptorInList*SameSizeList;
struct NvmAllocUnitDescriptor AllocDescriptor;
};
從上述定義可以看出,NvmAllocUnitDescriptorInList結構代表了位于鏈表中的分配單元描述符,而NvmAllocUnitDescriptorInTree結構則代表了位于樹中的分配單元描述符。其中,Prev和Next字段分別指向雙向鏈表節(jié)點的前驅(qū)和后繼節(jié)點,而LeftChild、RightChild和Parent字段,則分別指向了樹中節(jié)點的左右孩子和父節(jié)點。另外,SameSizeList字段比較特殊。當分配單元描述符位于樹中時,可能存在這樣一種情況,即多個分配單元描述符所對應的連續(xù)空間大小相等。此時,本專利方案就將這些分配單元描述符,以鏈表形式組織,并由樹節(jié)點指向。而SameSizeList字段,即為了構成上述鏈表。
對象描述符代表了持久化堆,其結構如下所示。
struct NvmObjectDestriptor
{
struct NvmObjectDestriptor*LeftChild;
struct NvmObjectDestriptor*RightChild;
struct NvmObjectDestriptor*Parent;
struct NvmAllocUnitDescriptorInList*SpaceList;
unsigned long NvmObjectSize;
unsigned long Flags;
unsigned char NvmUUID[16];
};
NvmObjectDestriptor中各個字段含義如下:
LeftChild、RightChild和Parent:由于持久化堆對應的對象描述符會位于一棵樹中,因此上述三個字段分別指向了樹中的左右孩子、父節(jié)點。
SpaceList:指向分配單元描述符鏈表,即一個由分配單元描述符組成的鏈表。該鏈表的每個元素,表示了持久化堆所擁有的連續(xù)空間。
NvmObjectSize:當前對象描述符表示的持久化堆空間的總大小。
Flags:當前持久化堆的各種標志。
NvmUUID:128位的持久化堆標識
b、元數(shù)據(jù)內(nèi)存池
為了減少內(nèi)存碎片,本專利方案為元數(shù)據(jù)建立了三種內(nèi)存池,即位于鏈表中的分配單元描述符內(nèi)存池、位于樹中的分配單元描述符內(nèi)存池和對象描述符內(nèi)存池。這三種內(nèi)存池的結構完全一致,不同點僅在于其內(nèi)部管理的元數(shù)據(jù)大小不一。下面給出了內(nèi)存池入口點的結構定義。
struct NvmMetaDataPool
{
unsigned long TotalElementNumber;
unsigned long FreeElementNumber;
struct NvmAllocUnitDescriptorInList*MetaDataFreeList;
struct NvmAllocUnitDescriptorInList*MetaDataFullList;
};
NvmMetaDataPool中的各個字段定義如下:
TotalElementNumber:內(nèi)存池中總共元數(shù)據(jù)的個數(shù)。
FreeElementNumber:內(nèi)存池中可分配的元數(shù)據(jù)個數(shù)。
MetaDataFreeList:指向可分配元素子池鏈表,鏈表中的每個元素是分配單元描述符。
MetaDataFullList:指向不可分配元素子池鏈表,鏈表中的每個元素是分配單元描述符。
一個內(nèi)存池是由若干個內(nèi)存子池構成的,而每個內(nèi)存子池是由分配單元描述符表示。NvmMetaDataPool中包含的兩個指針,分別指向了可分配元素子池鏈表和不可分配元素子池鏈表。前者還包含有空閑元數(shù)據(jù),而后者的所有元數(shù)據(jù)均已被分配出去。圖2給出了上述內(nèi)存池的基本結構。
圖2除了給出上述信息外,也給出了子池的基本結構。如前所述,內(nèi)存池子池是由分配單元描述符表示,即通過該分配單元描述符可找到內(nèi)存子池的實際存儲空間。在這實際存儲空間的頭部,是一個NvmMetaDataSubPool結構體實例,用于控制內(nèi)存子池中的分配和釋放操作。下面給出了該結構體的定義。
struct NvmMetaDataSubPool
{
unsigned long TotalElementNumber;
unsigned long FreeElementNumber;
unsigned long FirstFreeElementAddress;
unsigned long FreedElementNumber;
};
NvmMetaDataSubPool中各個字段的含義如下:
TotalElementNumber:表示當前內(nèi)存子池中總共的元素個數(shù)。
FreeElementNumber:表示當前內(nèi)存子池中可供分配的元素個數(shù)。
FirstFreeElementAddress:表示當前內(nèi)存子池中可供分配的第一個元素的地址。
FreedElementNumber:表示當前內(nèi)存子池中被釋放的元素個數(shù),即以鏈表形式組織起來的元數(shù)據(jù)個數(shù)。該字段的具體含義見后面的分析。
內(nèi)存子池實際存儲區(qū)域中,除了頭部的NvmMetaDataSubPool結構外,剩余部分都是用于元素存儲。在內(nèi)存池子池的內(nèi)部存在一個鏈表,該鏈表是用于鏈接被釋放的元素。每一個這樣的元素的頭8個字節(jié),用于描述該元素相關的控制信息。元素的狀態(tài)不同,其頭8個字節(jié)的含義不同。元素存在三種狀態(tài):從未分配、已分配、被釋放(其中從未分配和被釋放都是空閑狀態(tài))。頭8個字節(jié)的含義如下:
當元素為從未分配狀態(tài)時,該元素后面可能存在若干連續(xù)元素,其狀態(tài)都是從未分配。這種情況下,當前元素的頭8個字節(jié)存儲這種連續(xù)元素的個數(shù)。
當元素為已分配狀態(tài)時,該元素的頭8個字節(jié)存儲其所在內(nèi)存池子池對應的分配單元描述符結構的地址,即NvmAllocUnitDescriptorInList的地址。
當元素為被釋放狀態(tài)時,該元素的頭8個字節(jié)存儲下一個可分配元素的地址。
c、元數(shù)據(jù)的分配和釋放
元數(shù)據(jù)的分配和釋放建立在上述元數(shù)據(jù)內(nèi)存池結構之上,下面說明具體的分配和釋放步驟。
當接收到元數(shù)據(jù)分配請求后,首先判斷所請求的元數(shù)據(jù)類型,即位于鏈表中的分配單元描述符、位于樹中的分配單元描述符或?qū)ο竺枋龇?/p>
根據(jù)元數(shù)據(jù)類型,在NvmDescriptor結構和NvmMetaDataPool結構中獲取可分配的內(nèi)存子池的信息。
然后,在內(nèi)存子池中完成元數(shù)據(jù)的分配操作。
對于釋放操作而言,元數(shù)據(jù)的釋放過程如下:
首先,當接收到元數(shù)據(jù)釋放請求時,根據(jù)存儲在元數(shù)據(jù)頭8個字節(jié)內(nèi)的信息,找到該元數(shù)據(jù)所屬的內(nèi)存子池對應的分配單元描述符,即NvmAllocUnitDescriptorInList結構體實例的地址。
其次,在找到的內(nèi)存池子池中執(zhí)行元數(shù)據(jù)釋放操作。
從上面的討論可知,元數(shù)據(jù)的分配和釋放操作,主要發(fā)生在內(nèi)存池子池內(nèi)。下面將列舉一個例子,說明如何在子池中進行元素的分配和釋放。
初始化時,內(nèi)存池子池的所有元素都是未分配的,圖3給出了初始時的狀態(tài)。在圖3中,NvmMetaDataSubPool的FirstFreeElementAddress字段指向了該子池的第一個元素,也是第一個可以分配出去的元素。
當進行了第一次元素分配后,第一個可分配元素被分配出去了,即如圖4所示。此時在圖4中,F(xiàn)irstFreeElementAddress字段,指向了第二個元素。當再一次分配元素后,F(xiàn)irstFreeElementAddress字段將指向第三個元素,即如圖5所示。假設第一個元素被釋放,F(xiàn)irstFreeElementAddress字段將會指向被釋放的元素,并在該元素中存儲FirstFreeElementAddress字段之前指向的元素的地址。整個過程的最終結果,將會如圖6所示。這樣一來,被釋放的元素將會組織進一個鏈表中,方便再次分配使用。
綜上,本實施例中提到的元素可以為分配單元描述符對應的空閑的內(nèi)存空間,以實現(xiàn)本實施例提供的存儲空間管理方法為準,具體不做限定。
第三,空閑頁框的組織、分配和釋放
如前所述,本實施例將連續(xù)的空閑頁框,按照其大小組織到了127個鏈表和5棵平衡二叉樹中,即NvmDescriptor結構中的FreePageLists和FreePageTrees字段。圖7給出了空閑頁框的組織示意,該圖的左側是空閑頁框鏈表入口點和空閑頁框樹入口點結構,而右側則是若干連續(xù)空閑頁框?qū)姆峙鋯卧枋龇?,組成的若干鏈表和平衡二叉樹。在圖7中,鏈表的元素和樹的節(jié)點,均是分配單元描述符。另外,從圖7中也可以看出,本專利方案采用的樹是紅黑樹。
由于前面已經(jīng)討論了頁框分配和釋放的策略,這里僅就分配和釋放的流程進行說明。主要的分配過程如下:
Step1,當接收到分配請求后,首先訪問位于持久化內(nèi)存頭部的NvmDescriptor結構體。并根據(jù)其FreePageNumber字段,判斷是否擁有足夠的空閑頁框。若空閑頁框數(shù)不夠,則出錯返回。
Step2,若有足夠的空閑頁框,則判斷請求的頁框數(shù)量n,是否大于127個頁框。若大于,則轉向7)執(zhí)行;否則,執(zhí)行3)。
Step3,判斷NvmDescriptor結構中的FreePageLists[n-1]鏈表,是否為空。若不是,則從該鏈表中取出一個分配單元描述符并將其返回給請求者,同時更新NvmDescriptor結構中的FreePageNumber字段。即,執(zhí)行了確切分配的策略。
Step4,若FreePageLists[n-1]鏈表為空,則遍歷FreePageLists[0]到FreePageLists[n-2]中的鏈表,以判斷是否存在兩個分配單元描述符,其對應的空間之和等于n。若找到,則將找到的分配單元描述符返回給請求者,同時更新NvmDescriptor結構中的FreePageNumber字段。即,執(zhí)行了組合分配的策略。
Step5,若4)步驟查找失敗,且n<127,則從FreePageLists[n]開始查找,直到在FreePageLists數(shù)組中找到一個非空的鏈表。若找不到或n等于127,則轉向7)執(zhí)行。
Step6,若在FreePageLists數(shù)組中找到一個非空的鏈表,則從其中取出一個分配單元描述符,并對其所表示的連續(xù)空間按照n的大小進行切割。在切割的過程中,會從分配單元描述符內(nèi)存池中申請一個空閑的分配單元描述符,以表示切割后剩余的空間,并根據(jù)剩余空間的大小將其加入到FreePageLists中的某個鏈表。最后,將原來的分配單元描述符返回給請求者,同時更新NvmDescriptor結構中的FreePageNumber字段。上述過程,即切割分配。
Step7,根據(jù)n的大小,確定在FreePageTrees中的哪棵樹內(nèi)進行分配。
Step8,若找到的樹FreePageTrees[m]不為空,則根據(jù)n的值,在樹中進行查找。若能找到一個分配單元描述符,其對應的空間大小正好是n個頁框,則取出該分配單元描述符并將其返回給請求者,同時更新NvmDescriptor結構中的FreePageNumber字段。即,執(zhí)行了確切分配的策略。
Step9,若7)中找到的樹為空,或8)中未找到上述分配單元描述符,則遍歷FreePageLists[0]到FreePageTrees[m],以判斷是否存在兩個分配單元描述符,其對應的空間之和等于n。若找到,則將找到的分配單元描述符返回給請求者,同時更新NvmDescriptor結構中的FreePageNumber字段。即,執(zhí)行了組合分配的策略。
Step10,若9)執(zhí)行失敗,則從FreePageTrees[m]開始遍歷,直到找到一個分配單元描述符,其對應的空間大小大于n個頁框。
Step11,若找到一個分配單元描述符滿足10)的要求,則對該分配單元描述符進行切割。在切割的過程中,會從分配單元描述符內(nèi)存池中申請一個空閑的分配單元描述符,以表示切割后剩余的空間,并根據(jù)剩余空間的大小將其加入到FreePageLists中的某個鏈表或FreePageTrees中的某個樹。最后,將原來的分配單元描述符返回給請求者,同時更新NvmDescriptor結構中的FreePageNumber字段。上述過程,即切割分配。
Step12,若10)執(zhí)行失敗,則從FreePageTrees[4]內(nèi)的最大分配單元描述符開始遞歸查找,直到找到足夠的空閑頁框為止。最后,會將找到的分配單元描述符返回給請求者,并更新NvmDescriptor結構中的FreePageNumber字段。上述過程,即盡力分配。
具體的,頁框的釋放流程如下:
1、接收到被釋放的連續(xù)頁框的分配單元描述符后,根據(jù)NvmAllocUnitDescriptor結構體的PreSpaceAddress字段和NextSpaceAddress字段,找到與被釋放頁框物理相鄰的兩個分配單元描述符。
2、根據(jù)找到的分配單元描述符NvmAllocUnitDescriptor的Flags字段,判斷其對應的空間是否是空閑的。若不是空閑的,則轉入4)執(zhí)行。
3、若是空閑的,則進行合并操作。即使用一個分配單元描述符,表示合并后的空間。合并時,需要從原來所在的FreePageLists或FreePageTrees中,取下被合并的分配單元描述符;之后,再將合并后的分配單元描述符,按照其空間大小放入FreePageLists或FreePageTrees中,并更新NvmDescriptor結構的FreePageNumber字段。
4、根據(jù)釋放的分配單元描述符對應的空間大小,將其放入到FreePageLists或FreePageTrees中,并更新NvmDescriptor結構的FreePageNumber字段。
第四,對象描述符的組織與管理
由于存在頁框找回,即持久化堆找回的問題,所以必須要記錄應用程序創(chuàng)建了哪些持久化堆,以及每個持久化堆又包含了哪些頁框。本實施例中,使用對象描述符這種元數(shù)據(jù),表示一個持久化堆。對象描述符中會記錄持久化堆的標識、持久化堆所擁有的若干連續(xù)頁框(即對象描述符中的分配單元描述符鏈表)。本實施例中,會根據(jù)每個持久化堆的標識,將所有的對象描述符組織成一棵平衡二叉樹,該樹的根節(jié)點即由NvmDescriptor結構中的NvmObjectDestriptor字段指向。當應用程序新創(chuàng)建一個持久化 堆時,其主要的操作過程如下:
首先,根據(jù)NvmDescriptor結構中的NvmObjectTree字段,查找創(chuàng)建者傳遞而來的對象UUID。若找到UUID,則出錯返回。
其次,若找不到UUID,則首先根據(jù)NvmObjectDescriptorMemoryPool字段,從對象描述符內(nèi)存池中申請一個空閑的對象描述符,并存入UUID等信息。
第三,將申請到的對象描述符插入到NvmObjectTree指向的紅黑樹中。
最后,根據(jù)創(chuàng)建者要求的空間大小,申請若干空閑頁框,并將申請到的分配單元描述符,加入到NvmObjectDestriptor結構的NvmAllocUnitDescriptorInList鏈表中。
持久化堆的擴充操作和上述過程類似,只是不用創(chuàng)建新的對象描述符而已。當創(chuàng)建完持久化堆后,就可以將申請的頁框映射到進程地址空間。下面描述持久化堆刪除的主要步驟。
a,當應用程序要刪除一個持久化堆時,需要給出被刪堆的標識,即UUID。
b,根據(jù)NvmDescriptor結構中的NvmObjectTree字段,查找刪除者傳遞而來的對象UUID。若找不到UUID,則出錯返回。
c,找到UUID后,即獲得對象描述符后,遍歷其NvmAllocUnitDescriptorInList鏈表。
d,對于上述鏈表中的每個分配單元描述符,都調(diào)用頁框釋放操作,歸還分配單元描述符對應的空間。
e,最后,從NvmObjectTree指向的紅黑樹中刪除對象描述符,并歸還給對象描述符內(nèi)存池。
在執(zhí)行持久化堆的縮減操作時,需要指定縮減的大小。本實施例主要的縮減過程同刪除一個持久化堆類似,只是不需要從樹中刪除對象描述符。
第五,其他說明
在介紹了內(nèi)存布局、元數(shù)據(jù)組織、頁框的組織與管理,以及對象描述符的組織與管理后,接下來將對鎖和日志這兩部分內(nèi)容進行介紹。
由于持久化堆是用來存放應用程序需要持久化保存的數(shù)據(jù)或數(shù)據(jù)結構,因此,在同一個系統(tǒng)中,持久化堆的個數(shù)和應用的個數(shù)相關。而一個應用,通常只會擁有少量的持久化堆。因此,整個系統(tǒng)中持久化堆的個數(shù)相對較少。如前所述,只有當持久化堆內(nèi)剩余的空閑空間過小或過大時,才會導致持久化堆進行擴容或縮減。換句話說,擴容和縮減的操作次數(shù)很少。通常情況下,只有持久化堆的申請、刪除、擴容和縮減操作,才會在較大程度上影響持久化內(nèi)存管理機制的并發(fā)性。從上面的分析可以看出,這些操作的次數(shù)相對比較少。因此,持久化內(nèi)存管理機制產(chǎn)生爭用的概率較小。所以,本專利方案 采用了簡單的粗粒度鎖,在上述操作入口處即進行加鎖。
另外,為了確保持久化內(nèi)存管理機制的一致性,特別是為了確保出現(xiàn)系統(tǒng)掉電等故障后的一致性,本專利方案采用了傳統(tǒng)的undo類型日志方案。在進行持久化堆的申請、刪除、擴容和縮減等操作時,會記錄元數(shù)據(jù)部分的所有修改項。在實施例中,用于保存日志的區(qū)域,即持久化內(nèi)存的第一個頁框除去NvmDescriptor結構的部分。NvmDescriptor結構占據(jù)了1千多字節(jié),因此日志區(qū)域有近3千字節(jié)。而這3千字節(jié),完全能夠容納元數(shù)據(jù)部分的修改項。
實施例二
通過以上的實施方式的描述,本領域的技術人員可以清楚地了解到根據(jù)上述實施例的方法可借助軟件加必需的通用硬件平臺的方式來實現(xiàn),當然也可以通過硬件,但很多情況下前者是更佳的實施方式。基于這樣的理解,本發(fā)明的技術方案本質(zhì)上或者說對現(xiàn)有技術做出貢獻的部分可以以軟件產(chǎn)品的形式體現(xiàn)出來,該計算機軟件產(chǎn)品存儲在一個存儲介質(zhì)(如ROM/RAM、磁碟、光盤)中,包括若干指令用以使得一臺終端設備(可以是手機,計算機,服務器,或者網(wǎng)絡設備等)執(zhí)行本發(fā)明各個實施例所述的方法。
在本實施例中還提供了一種存儲空間管理裝置,該裝置用于實現(xiàn)上述實施例及優(yōu)選實施方式,已經(jīng)進行過說明的不再贅述。如以下所使用的,術語“模塊”可以實現(xiàn)預定功能的軟件和/或硬件的組合。盡管以下實施例所描述的裝置較佳地以軟件來實現(xiàn),但是硬件,或者軟件和硬件的組合的實現(xiàn)也是可能并被構想的。
圖8是根據(jù)本發(fā)明實施例的存儲空間管理裝置的結構框圖,如圖8所示,該裝置包括:第一接收模塊82,獲取模塊84,第一查詢模塊86和分配模塊88,其中,
第一接收模塊82,用于接收應用程序的內(nèi)存空間請求;
獲取模塊84,與第一接收模塊82建立電連接,用于獲取內(nèi)存空間請求中所請求的空閑頁框數(shù)目;
第一查詢模塊86,與獲取模塊84建立電連接,用于依據(jù)空閑頁框數(shù)目查詢空閑頁框組織,獲取與空閑頁框數(shù)目對應的連續(xù)空閑存儲空間大小相等的連續(xù)空閑存儲空間;
分配模塊88,與第一查詢模塊86建立電連接,用于將連續(xù)空閑存儲空間分配給應用程序。
進一步地,圖9是根據(jù)本發(fā)明實施例的一種存儲空間管理裝置的結構框圖,如圖9所示,在空閑頁框組織包括:頁框鏈表或樹,頁框鏈表或樹包括:至少一個分配單元描述符,至少一個分配單元描述符用于描述連續(xù)存儲空間的存儲狀態(tài)以及連續(xù)存儲空間對應的頁框的起始地址和長度的情況下,第一查詢模塊86包括:查詢單元861,第一匹配 單元862和第二匹配單元863,其中,
查詢單元861,用于查詢頁框鏈表或樹中的至少一個分配單元描述符;
第一匹配單元862,與查詢單元861建立電連接,用于將至少一個分配單元描述符中對應的連續(xù)空閑存儲空間的大小,與應用程序所請求的空閑頁框數(shù)目對應的連續(xù)空閑存儲空間進行匹配,查詢是否存在與空閑頁框數(shù)目對應的連續(xù)空閑存儲空間大小相等的連續(xù)空閑存儲空間;
第二匹配單元863,與第一匹配單元862建立電連接,用于若存在與空閑頁框數(shù)目對應的連續(xù)空閑存儲空間大小相等的連續(xù)空閑存儲空間,則提取連續(xù)空閑存儲空間作為分配至空閑頁框數(shù)目對應的連續(xù)空閑存儲空間;其中,連續(xù)存儲空間的存儲狀態(tài)包括:已分配和空閑。
進一步地,圖10是根據(jù)本發(fā)明實施例的另一種存儲空間管理裝置的結構框圖,如圖10所示,分配模塊88包括:第一分配單元881,判斷單元882,第二分配單元883,空間查詢單元884,空間切割單元885,第三分配單元886,或第四分配單元887,其中,
第一分配單元881,用于在頁框鏈表或樹中的連續(xù)空閑存儲空間的大小等于空閑頁框數(shù)目對應的連續(xù)空閑存儲空間大小的情況下,將連續(xù)空閑存儲空間分配給應用程序;
或者,
判斷單元882,用于在頁框鏈表或樹中的連續(xù)空閑存儲空間的大小小于空閑頁框數(shù)目對應的連續(xù)空閑存儲空間大小的情況下,在頁框鏈表或樹中查詢N個連續(xù)空閑存儲空間,判斷N個連續(xù)空閑存儲空間是否與空閑頁框數(shù)目對應的連續(xù)空閑存儲空間大小相等,N為整數(shù),且大于1;
第二分配單元883,與判斷單元882建立電連接,用于在判斷結果為是的情況下,將N個連續(xù)空閑存儲空間分配給應用程序。
進一步地,分配模塊88還包括:空間查詢單元884,用于在N個連續(xù)空閑存儲空間小于空閑頁框數(shù)目對應的連續(xù)空閑存儲空間的情況下,在頁框鏈表或樹中查找大于空閑頁框數(shù)目對應的連續(xù)空閑存儲空間大小的第一連續(xù)空閑存儲空間;
空間切割單元885,與空間查詢單元884建立電連接,用于在得到第一連續(xù)空閑存儲空間的情況下,對第一連續(xù)空閑存儲空間進行切割,得到與空閑頁框數(shù)目對應的連續(xù)空閑存儲空間大小相等的第二連續(xù)空閑存儲空間;
第三分配單元886,與空間切割單元885建立電連接,用于將第二連續(xù)空閑存儲空間分配給應用程序;其中,將第一連續(xù)空閑存儲空間切割后的剩余連續(xù)空閑存儲空間歸還至頁框鏈表或樹;
或者,
第四分配單元887,用于在頁框鏈表或樹中最大的連續(xù)空閑存儲空間小于空閑頁框數(shù)目對應的連續(xù)空閑存儲空間的情況下,在空閑頁框鏈表或樹中查詢是否存在小于最大連續(xù)空閑存儲空間的連續(xù)存儲空間,且連續(xù)存儲空間的大小與空閑頁框數(shù)目對應的連續(xù)空閑存儲空間匹配,若連續(xù)存儲空間小于空閑頁框數(shù)目對應的連續(xù)空閑存儲空間,則在空閑頁框鏈表或樹中查詢是否存在小于連續(xù)空閑存儲空間的連續(xù)存儲空間,直至查詢得到與空閑頁框數(shù)目對應的連續(xù)空閑存儲空間匹配的連續(xù)空閑存儲空間,或,提示當前沒有能夠與空閑頁框數(shù)目對應的連續(xù)空閑存儲空間匹配的連續(xù)空閑存儲空間。
進一步地,圖11是根據(jù)本發(fā)明實施例的又一種存儲空間管理裝置的結構框圖,如圖11所示,該存儲空間管理裝置還包括:第二接收模塊1100和第二查詢模塊1101,其中
第二接收模塊1100,用于在將連續(xù)空閑存儲空間分配給應用程序之后,接收應用程序的持久化內(nèi)存請求,持久化內(nèi)存請求用于指示查詢應用程序預先存儲的數(shù)據(jù);
第二查詢模塊1101,與第二接收模塊1100建立電連接關系,用于依據(jù)持久化內(nèi)存請求,通過內(nèi)存系統(tǒng)中的對象描述符進行查詢,得到應用程序預先存儲的數(shù)據(jù);其中,對象描述符用于指示包含至少一個分配單元描述符的頁框鏈表或樹。
需要說明的是,上述各個模塊是可以通過軟件或硬件來實現(xiàn)的,對于后者,可以通過以下方式實現(xiàn),但不限于此:上述模塊均位于同一處理器中;或者,上述模塊分別位于多個處理器中。
本發(fā)明的實施例還提供了一種存儲介質(zhì)??蛇x地,在本實施例中,上述存儲介質(zhì)可以被設置為存儲用于執(zhí)行以下步驟的程序代碼:
S1,接收應用程序的內(nèi)存空間請求;
S2,獲取內(nèi)存空間請求中所請求的空閑頁框數(shù)目;
S3,依據(jù)空閑頁框數(shù)目查詢空閑頁框組織,獲取與空閑頁框數(shù)目對應的連續(xù)空閑存儲空間大小相等的連續(xù)空閑存儲空間;
S4,將連續(xù)空閑存儲空間分配給應用程序。
可選地,存儲介質(zhì)還被設置為存儲用于執(zhí)行以下步驟的程序代碼:在空閑頁框組織包括:頁框鏈表或樹,頁框鏈表或樹包括:至少一個分配單元描述符,至少一個分配單元描述符用于描述連續(xù)存儲空間的存儲狀態(tài)以及連續(xù)存儲空間對應的頁框的起始地址和長度的情況下,依據(jù)空閑頁框數(shù)目查詢空閑頁框組織,獲取與空閑頁框數(shù)目對應的連續(xù)空閑存儲空間大小相等的連續(xù)空閑存儲空間的步驟包括:
S1,查詢頁框鏈表或樹中的至少一個分配單元描述符;
S2,將至少一個分配單元描述符中對應的連續(xù)空閑存儲空間的大小,與應用程序所 請求的空閑頁框數(shù)目對應的連續(xù)空閑存儲空間進行匹配,查詢是否存在與空閑頁框數(shù)目對應的連續(xù)空閑存儲空間大小相等的連續(xù)空閑存儲空間;其中,連續(xù)存儲空間的存儲狀態(tài)包括:已分配和空閑;
S3,若存在與空閑頁框數(shù)目對應的連續(xù)空閑存儲空間大小相等的連續(xù)空閑存儲空間,則提取連續(xù)空閑存儲空間作為分配至空閑頁框數(shù)目對應的連續(xù)空閑存儲空間。
可選地,在本實施例中,上述存儲介質(zhì)可以包括但不限于:U盤、只讀存儲器(ROM,Read-Only Memory)、隨機存取存儲器(RAM,Random Access Memory)、移動硬盤、磁碟或者光盤等各種可以存儲程序代碼的介質(zhì)。
可選地,在本實施例中,處理器根據(jù)存儲介質(zhì)中已存儲的程序代碼執(zhí)行將連續(xù)空閑存儲空間分配給應用程序的步驟包括:若頁框鏈表或樹中的連續(xù)空閑存儲空間的大小等于空閑頁框數(shù)目對應的連續(xù)空閑存儲空間大小,則將連續(xù)空閑存儲空間分配給應用程序;若頁框鏈表或樹中的連續(xù)空閑存儲空間的大小小于空閑頁框數(shù)目對應的連續(xù)空閑存儲空間大小,則在頁框鏈表或樹中查詢N個連續(xù)空閑存儲空間,判斷N個連續(xù)空閑存儲空間是否與空閑頁框數(shù)目對應的連續(xù)空閑存儲空間大小相等,N為整數(shù),且大于1;在判斷結果為是的情況下,將N個連續(xù)空閑存儲空間分配給應用程序。
可選地,在本實施例中,處理器根據(jù)存儲介質(zhì)中已存儲的程序代碼執(zhí)行若N個連續(xù)空閑存儲空間小于空閑頁框數(shù)目對應的連續(xù)空閑存儲空間,則在頁框鏈表或樹中查找大于空閑頁框數(shù)目對應的連續(xù)空閑存儲空間大小的第一連續(xù)空閑存儲空間;若得到第一連續(xù)空閑存儲空間,則對第一連續(xù)空閑存儲空間進行切割,得到與空閑頁框數(shù)目對應的連續(xù)空閑存儲空間大小相等的第二連續(xù)空閑存儲空間;將第二連續(xù)空閑存儲空間分配給應用程序;其中,將第一連續(xù)空閑存儲空間切割后的剩余連續(xù)空閑存儲空間歸還至頁框鏈表或樹;若頁框鏈表或樹中最大的連續(xù)空閑存儲空間小于空閑頁框數(shù)目對應的連續(xù)空閑存儲空間,則在空閑頁框鏈表或樹中查詢是否存在小于最大連續(xù)空閑存儲空間的連續(xù)存儲空間,且連續(xù)存儲空間的大小與空閑頁框數(shù)目對應的連續(xù)空閑存儲空間匹配,若連續(xù)存儲空間小于空閑頁框數(shù)目對應的連續(xù)空閑存儲空間,則在空閑頁框鏈表或樹中查詢是否存在小于連續(xù)空閑存儲空間的連續(xù)存儲空間,直至查詢得到與空閑頁框數(shù)目對應的連續(xù)空閑存儲空間匹配的連續(xù)空閑存儲空間,或,提示當前沒有能夠與空閑頁框數(shù)目對應的連續(xù)空閑存儲空間匹配的連續(xù)空閑存儲空間。
可選地,在本實施例中,處理器根據(jù)存儲介質(zhì)中已存儲的程序代碼執(zhí)行將連續(xù)空閑存儲空間分配給應用程序之后,本實施例提供的存儲空間管理方法還包括:接收應用程序的持久化內(nèi)存請求,持久化內(nèi)存請求用于指示查詢應用程序預先存儲的數(shù)據(jù);依據(jù)持久化內(nèi)存請求,通過內(nèi)存系統(tǒng)中的對象描述符進行查詢,得到應用程序預先存儲的數(shù)據(jù);其中,對象描述符用于指示包含至少一個分配單元描述符的頁框鏈表或樹。
可選地,本實施例中的具體示例可以參考上述實施例及可選實施方式中所描述的示 例,本實施例在此不再贅述。
顯然,本領域的技術人員應該明白,上述的本發(fā)明的各模塊或各步驟可以用通用的計算裝置來實現(xiàn),它們可以集中在單個的計算裝置上,或者分布在多個計算裝置所組成的網(wǎng)絡上,可選地,它們可以用計算裝置可執(zhí)行的程序代碼來實現(xiàn),從而,可以將它們存儲在存儲裝置中由計算裝置來執(zhí)行,并且在某些情況下,可以以不同于此處的順序執(zhí)行所示出或描述的步驟,或者將它們分別制作成各個集成電路模塊,或者將它們中的多個模塊或步驟制作成單個集成電路模塊來實現(xiàn)。這樣,本發(fā)明不限制于任何特定的硬件和軟件結合。
以上所述僅為本發(fā)明的優(yōu)選實施例而已,并不用于限制本發(fā)明,對于本領域的技術人員來說,本發(fā)明可以有各種更改和變化。凡在本發(fā)明的精神和原則之內(nèi),所作的任何修改、等同替換、改進等,均應包含在本發(fā)明的保護范圍之內(nèi)。