本發明涉及計算機存儲技術領域,更具體地說,涉及一種固態存儲的損耗均衡方法及系統。
背景技術:
固態存儲的壽命是有限的,其壽命的長短是由擦寫塊的最大可擦除次數決定的,固態存儲介質的最大可擦除次數大約為萬次左右。所以為了延長固態存儲的使用壽命,避免由于某個擦寫塊被過度擦寫而影響數據安全性和存儲設備的使用,應該在盡量小的性能影響下使擦寫操作均勻的分布在每個擦寫塊上,這個過程就叫做損耗均衡。損耗均衡算法其中一種方式是通過垃圾回收來實現,在垃圾回收的過程中兼顧損耗均衡的效果。固態存儲作為一種閃存設備,其與一般磁盤設備最大的不同就是它不采用“覆寫”一的形式進行更新,而是采用“out-of-place”的更新方式。這種方式需要先將要更新的數據寫入其他的空閑空間,并將原來的數據標記為臟數據,在適當的時候對這些無效的臟數據進行擦除回收,這個過程就叫做垃圾回收,同時臟數據的擦除時以整塊為單位的,一個擦除快中包含多個數據頁。
垃圾回收的消耗主要包括兩個方面當擦除塊內的頁面不是全部為臟數據,即含有有效數據時,需要拷貝回收塊中的有效頁面,當把擦除塊中的有效頁面回收完后再對擦除塊進行擦除操作。由于閃存的擦除操作的消耗遠遠大于拷貝有效頁的消耗,所以從垃圾回收的角度看,垃圾回收應該盡可能釋放多的可用空間,減少擦除次數。同時文件中經常會存儲一些只需要讀而很少更新的數據,這類數據成為靜態數據。由于靜態數據幾乎不更新導致其所在的數據塊很少會被擦除,而存儲經常更新的動態數據的數據塊則會經常被擦除,造成了數據塊之間的不平衡。
因此,如何提高垃圾回收的效率,實現固態存儲的損耗均衡,延長固態存儲整體的使用壽命,是本領域技術人員需要解決的問題。
技術實現要素:
本發明的目的在于提供一種固態存儲的損耗均衡方法及系統,以實現提高垃圾回收的效率,實現固態存儲的損耗均衡,延長固態存儲整體的使用壽命。
為實現上述目的,本發明實施例提供了如下技術方案:
一種固態存儲的損耗均衡方法,包括:
S1、檢測空閑塊鏈表中的數據塊數量是否小于第一閾值,若是,則執行S2;其中,所述空閑塊鏈表中的數據塊均為空閑數據塊;
S2、從臟塊鏈表中選取無效頁面最多的數據塊進行回收,將回收的數據塊插入所述空閑塊鏈表;其中,臟塊鏈表中的數據塊為不全是有效數據的數據塊;
S3、判斷所述空閑塊鏈表中的數據塊數量是否大于第二閾值;若是,則執行S4;若否,則繼續執行S2;
S4、從所述臟塊鏈表中選取擦除次數最小的數據塊進行回收,并將回收后的數據塊插入所述空閑塊鏈表;
S5、判斷所述空閑塊鏈表中的數據塊數量是否大于第三閾值;
若是,則停止執行回收操作;若否,則繼續執行S4。
其中,所述S2包括:
從臟塊鏈表中選取無效頁面最多的數據塊作為第一數據塊;
判斷所述第一數據塊是否存在有效數據;
若存在,從所述空閑塊鏈表中選取擦除次數最小的數據塊作為當前數據塊,將所述第一數據塊中的有效數據拷貝到所述當前數據塊,并擦除所述第一數據塊;若不存在,則將所述第一數據塊直接擦除;
將擦除后的第一數據塊插入所述空閑塊鏈表。
其中,所述S4包括:
從所述空閑塊鏈表中選取擦除次數最小的數據塊作為當前數據塊,從臟塊鏈表中選取擦除次數最小的數據塊作為第二數據塊;
將所述第二數據塊中的有效數據拷貝到當前數據塊中,并擦除所述第二數據塊,將擦除后的第二數據塊插入所述空閑塊鏈表。
其中,還包括:
檢測到壞數據塊后,判斷壞數據塊是否存在有效數據;
若存在,則從所述空閑塊鏈表中選取擦除次數最小的數據塊作為當前數據塊,將所述壞數據塊中的有效數據拷貝到所述當前數據塊,并將所述壞數據塊插入壞塊鏈表;若不存在,則直接將所述壞數據塊插入壞塊鏈表。
其中,還包括:
接收到數據寫指令時,從所述空閑塊鏈表中選取擦除次數最小的數據塊作為當前數據塊,將所述數據寫指令攜帶的新數據順序寫入當前數據塊的每個頁面;
當前數據塊的所有頁面均被寫完后,檢測所述當前數據塊是否存在無效數據;若存在,則將所述當前數據塊插入所述臟塊鏈表;若不存在,則將所述當前數據塊存入干凈塊鏈表。
其中,還包括:
判斷干凈塊鏈表中擦除次數最大的數據塊與擦除次數最小的數據塊的擦除次數之差是否大于第四閾值;
若是,則將擦除次數最大的數據塊作為第三數據塊,將擦除次數最小的數據塊作為第四數據塊;
從所述空閑塊鏈表中選取擦除次數最小的數據塊作為當前數據塊,并將所述第三數據塊中的數據拷貝到所述當前數據塊,并擦除所述第三數據塊;
將所述第四數據塊中的數據拷貝到所述第三數據塊中,并將所述第四數據塊插入所述空閑塊鏈表。
其中,每個數據塊中均包括本數據塊的數據結構;
所述數據結構包括:數據塊的地址、該數據塊的擦除次數、數據塊的有效頁數目、數據塊的無效頁數目和數據塊的空閑頁數目。
一種固態存儲的損耗均衡系統,包括:
檢測模塊,用于檢測到空閑塊鏈表中的數據塊數量小于第一閾值時,觸發第一回收模塊;其中,所述空閑塊鏈表中的數據塊均為空閑數據塊;
所述第一回收模塊,用于從臟塊鏈表中選取無效頁面最多的數據塊進行回收,將回收的數據塊插入所述空閑塊鏈表;其中,臟塊鏈表中的數據塊為不全是有效數據的數據塊;
第一判斷模塊,用于判斷所述空閑塊鏈表中的數據塊數量是否大于第二閾值;若是,則觸發第二回收模塊;若否,則觸發所述第一回收模塊;
所述第二回收模塊,用于從所述臟塊鏈表中選取擦除次數最小的數據塊進行回收,并將回收后的數據塊插入所述空閑塊鏈表;
第二判斷模塊,用于判斷所述空閑塊鏈表中的數據塊數量是否大于第三閾值;若是,則停止執行回收操作;若否,則觸發所述第二回收模塊。
其中,還包括:
第三判斷模塊,用于檢測到壞數據塊后,判斷壞數據塊是否存在有效數據;若存在,則觸發第三回收模塊;若不存在,則直接將所述壞數據塊插入壞塊鏈表;
所述第三回收模塊,用于從所述空閑塊鏈表中選取擦除次數最小的數據塊作為當前數據塊;將所述壞數據塊中的有效數據拷貝到所述當前數據塊,并將所述壞數據塊插入壞塊鏈表。
其中,還包括:
第四判斷模塊,用于判斷干凈塊鏈表中擦除次數最大的數據塊與擦除次數最小的數據塊的擦除次數之差是否大于第四閾值;若是,則觸發數據遷移模塊;
所述數據遷移模塊,用于將擦除次數最大的數據塊作為第三數據塊,將擦除次數最小的數據塊作為第四數據塊,從所述空閑塊鏈表中選取擦除次數最小的數據塊作為當前數據塊;將所述第三數據塊中的數據拷貝到所述當前數據塊,擦除所述第三數據塊;將所述第四數據塊中的數據拷貝到所述第三數據塊中,并將所述第四數據塊插入所述空閑塊鏈表。
通過以上方案可知,本發明實施例提供的一種固態存儲的損耗均衡方法及系統,所述方法包括:S1、檢測空閑塊鏈表中的數據塊數量是否小于第一閾值,若是,則執行S2;其中,所述空閑塊鏈表中的數據塊均為空閑數據塊;S2、從臟塊鏈表中選取無效頁面最多的數據塊進行回收,將回收的數據塊插入所述空閑塊鏈表;其中,臟塊鏈表中的數據塊為不全是有效數據的數據塊;S3、判斷所述空閑塊鏈表中的數據塊數量是否大于第二閾值;若是,則執行S4;若否,則繼續執行S2;S4、從所述臟塊鏈表中選取擦除次數最小的數據塊進行回收,并將回收后的數據塊插入所述空閑塊鏈表;S5、判斷所述空閑塊鏈表中的數據塊數量是否大于第三閾值;若是,則停止執行回收操作;若否,則繼續執行S4;
可見,在本方案中,將固態存儲設備中的數據塊分為不同的狀態,在垃圾回收過程中根據數據塊的擦除次數選擇進行優先回收的數據塊,不僅提高垃圾回收的效率,而且還使各個數據塊的使用更加均衡,延長固態存儲整體的使用壽命。
附圖說明
為了更清楚地說明本發明實施例或現有技術中的技術方案,下面將對實施例或現有技術描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本發明的一些實施例,對于本領域普通技術人員來講,在不付出創造性勞動的前提下,還可以根據這些附圖獲得其他的附圖。
圖1為本發明實施例公開的不同鏈表的關系結構示意圖;
圖2為本發明實施例公開的一種固態存儲的損耗均衡方法流程示意圖;
圖3為本發明實施例公開的靜態數據損耗均衡流程示意圖;
圖4為本發明實施例公開的一種固態存儲的損耗均衡系統結構示意圖。
具體實施方式
下面將結合本發明實施例中的附圖,對本發明實施例中的技術方案進行清楚、完整地描述,顯然,所描述的實施例僅僅是本發明一部分實施例,而不是全部的實施例。基于本發明中的實施例,本領域普通技術人員在沒有作出創造性勞動前提下所獲得的所有其他實施例,都屬于本發明保護的范圍。
可以理解的是,本方案中固態存儲是指采用FASH介質的存儲設備而有別于采用磁介質的機械硬盤設備,并且固態存儲設備有別于磁介質存儲設備,其寫數據的方式需要先擦除后寫,同時由于介質的要求,固態存儲設備中每個存儲單位的擦除次數是有上限值的,超過這個上限以后會更容易丟失數據。因此,本發明實施例公開了一種固態存儲的損耗均衡方法及系統,以實現提高垃圾回收的效率,實現固態存儲的損耗均衡,延長固態存儲整體的使用壽命。
在本實施例中,為存儲設備中的每個數據塊中均包括本數據塊的數據結構;所述數據結構包括:數據塊的地址、該數據塊的擦除次數、數據塊的有效頁數目、數據塊的無效頁數目和數據塊的空閑頁數目等信息。
在本方案中,在初始狀態下,將存儲設備中的所有數據塊分為四種,分別是空閑塊、干凈塊、臟塊、壞塊。空閑塊表示該塊剛剛進行完擦除操作,數據塊上所有頁面都是空閑的,可以直接進行分配。干凈塊表示該塊上的所有數據都是有效的。臟塊表示該塊上的數據并不全是有效的,至少有一頁由于數據更新或者文件刪除留下的無效數據。壞塊表示該塊不能再被使用,包含設備出廠時的壞塊和使用過程中產生的壞塊。此外還有一個當前塊,當前塊中至少有一個頁面可以直接寫入新數據。
并且,參見圖1,在本方案中為四種塊狀態建立了四個鏈表,分別是空閑塊鏈表(free_list)、干凈塊鏈表(clean_list)、臟塊鏈表(dirty_list)和壞塊鏈表(bad_list)。在空閑塊鏈表、干凈塊鏈表和臟塊鏈表中的塊都以塊擦除次數升序的方式排列。當接收到數據寫指令時,從空閑塊鏈表中選取擦除次數最小的數據塊作為當前數據塊,將數據寫指令攜帶的新數據順序寫入當前數據塊的每個頁面;當前數據塊的所有頁面均被寫完后,檢測當前數據塊是否存在無效數據;若存在,則將當前數據塊插入所述臟塊鏈表;若不存在,則將當前數據塊存入干凈塊鏈表。
需要說明的是,存儲設備在最初被使用時,除了壞塊之外的所有塊均在空閑鏈表中。當要寫入新的數據時,通過頁面分配操作從空閑鏈表中取擦除次數最小的塊,即空閑鏈表的第一塊,分配得到的塊即為當前塊,然后將新數據順序寫入每個頁面。當當前塊上的所有頁面均被寫完,且所有頁面上的數據均為有效數據時,則將當前塊插入到干凈鏈表中。當當前塊上的所有頁面均被寫完,但是其中含有無效數據時,則將當前塊插入到臟塊鏈表中。在將當前塊插入到干凈鏈表或者臟鏈表之后,當前鏈表為空,當下次需要分配頁面時,再從空閑鏈表中取空閑塊轉變為當前塊。
本發明實施例提供的一種固態存儲的損耗均衡方法,包括:
S1、檢測空閑塊鏈表中的數據塊數量是否小于第一閾值,若是,則執行S2;其中,所述空閑塊鏈表中的數據塊均為空閑數據塊;
具體的,存儲設備在使用過程中,空閑塊鏈表中的空閑塊會逐漸減少,其他三個鏈表中的塊會逐漸增多,當空閑鏈表中的擦除塊數量達到一定下限時,開始垃圾回收的操作,即執行S2。在本實施例中將該下限設置為1,即空閑塊鏈表中只有一個擦除塊時啟動垃圾回收操作。
S2、從臟塊鏈表中選取無效頁面最多的數據塊進行回收,將回收的數據塊插入所述空閑塊鏈表;其中,臟塊鏈表中的數據塊為不全是有效數據的數據塊;
其中,所述S2包括:
從臟塊鏈表中選取無效頁面最多的數據塊作為第一數據塊;
判斷所述第一數據塊是否存在有效數據;
若存在,從所述空閑塊鏈表中選取擦除次數最小的數據塊作為當前數據塊,將所述第一數據塊中的有效數據拷貝到所述當前數據塊,并擦除所述第一數據塊;若不存在,則將所述第一數據塊直接擦除;
將擦除后的第一數據塊插入所述空閑塊鏈表。
具體的,在本實施例中設置一個空閑鏈表中最小塊數的數量第二閾值,free_min_num,在啟動垃圾回收之后,在空閑鏈表中的塊數小于free_min_num時,垃圾回收操作在臟塊鏈表中查找包含無效頁面最多的塊進行回收。
具體的,當空閑塊鏈表中的塊數目為1時,從臟塊鏈表中查找無效頁數最多的塊,進行擦除操作,如果該塊中不含有有效頁則將該塊直接擦除,如果該塊中含有有效塊,則將空閑鏈表中的空閑塊取下轉變為當前塊,將剛才找到的臟塊中的有效數據拷貝到當前塊中,擦除臟塊,并將擦除后的塊插入到空閑鏈表。當前塊寫滿之后,將當前塊插入干凈塊,并從空閑鏈表中取新的塊作為當前塊。
S3、判斷所述空閑塊鏈表中的數據塊數量是否大于第二閾值;若是,則執行S4;若否,則繼續執行S2;
具體的,在空閑塊鏈表中的塊數大于free_min_num時,垃圾回收操作取臟塊鏈表中擦除次數最小的塊進行回收。
S4、從所述臟塊鏈表中選取擦除次數最小的數據塊進行回收,并將回收后的數據塊插入所述空閑塊鏈表;
其中,所述S4包括:
從所述空閑塊鏈表中選取擦除次數最小的數據塊作為當前數據塊,從臟塊鏈表中選取擦除次數最小的數據塊作為第二數據塊;
將所述第二數據塊中的有效數據拷貝到當前數據塊中,并擦除所述第二數據塊,將擦除后的第二數據塊插入所述空閑塊鏈表。
S5、判斷所述空閑塊鏈表中的數據塊數量是否大于第三閾值;
若是,則停止執行回收操作;若否,則繼續執行S4。
具體的,在本方案中設置一個第三閾值free_th1_num,在空閑塊鏈表中的塊數目大于該值之后,停止垃圾回收操作。參見圖2,為本實施例提供的固態存儲的損耗均衡方法流程示意圖。
需要說明的是,在該流程的所有操作中,涉及到塊擦除操作的,均會修改該塊對應數據結構中的塊擦除次數,在數據讀寫及垃圾回收過程中也會修改該數據結構中的有效頁數、無效頁數、空閑頁數等屬性。
具體的,對保存靜態數據的塊幾乎沒有擦除操作,而保存動態數據的塊擦除操作過于頻繁的問題,本實施例提供了一種損耗均衡操作。在啟動垃圾回收操作的同時也會啟動該損耗均衡操作。本方案中設定了一個第四閾值era_th1。在損耗均衡操作啟動之后,讀取干凈塊鏈表中所有擦除塊的附加區字段中的擦除次數字段,從中找出擦除次數最多的擦除塊和擦除次數最少的塊,得到兩者的擦除次數差值,如果差值大于第四閾值era_th1時,認為擦除次數最小的擦除上存儲的是靜態數據,其更新的頻率非常低,需要對其進行遷移操作,具體流程如下:
S11、判斷干凈塊鏈表中擦除次數最大的數據塊與擦除次數最小的數據塊的擦除次數之差是否大于第四閾值;若是,則執行S12;
S12、將擦除次數最大的數據塊作為第三數據塊,將擦除次數最小的數據塊作為第四數據塊;
S13、從所述空閑塊鏈表中選取擦除次數最小的數據塊作為當前數據塊,并將所述第三數據塊中的數據拷貝到所述當前數據塊,并擦除所述第三數據塊;
S14、將所述第四數據塊中的數據拷貝到所述第三數據塊中,并將所述第四數據塊插入所述空閑塊鏈表。
具體的,參見圖3,為了方便理解,舉例如下:
步驟S101:遍歷干凈塊列表,查找擦除次數最大的塊BlockA和擦除次數最小的塊BlockB,其擦除次數分別為EraseA和EraseB。
步驟S102:如果EraseA同EraseB的差值大于era_th1,對BlockA進行遷移操作。從空閑鏈表中取空閑塊FreeBlockC,將BlockA上的數據復制到FreeBlockC中,擦除BlockA,修改BlockA和FreeBlockC的擦除次數及有效頁、空閑頁等標記。將FreeBlockC插入到干凈鏈表中
步驟S103:將BlockB中的數據復制到BlockA中,修改BlockB和BlockA的擦除次數及有效頁、空閑頁等標記
步驟S104:將BlockB插入到臟塊鏈表中
步驟S105:重復步驟S101-S104,直到所有滿足條件的靜態數據遷移成功。
基于上述技術方案,檢測到壞數據塊后,需要判斷壞數據塊是否存在有效數據;若存在,則從所述空閑塊鏈表中選取擦除次數最小的數據塊作為當前數據塊,將所述壞數據塊中的有效數據拷貝到所述當前數據塊,并將所述壞數據塊插入壞塊鏈表;若不存在,則直接將所述壞數據塊插入壞塊鏈表。
具體的,在垃圾塊回收和數據寫入過程中產生的壞塊,由于這些塊中可能包含有效數據,所以需要首先將有效的數據拷貝到好的塊中,然后將壞塊插入壞塊鏈表中。
下面對本發明實施例提供的損耗均衡系統進行介紹,下文描述的損耗均衡系統與上文描述的損耗均衡方法可以相互參照。
參見圖4,本發明實施例提供的一種固態存儲的損耗均衡系統,包括:
檢測模塊100,用于檢測到空閑塊鏈表中的數據塊數量小于第一閾值時,觸發第一回收模塊200;其中,所述空閑塊鏈表中的數據塊均為空閑數據塊;
所述第一回收模塊200,用于從臟塊鏈表中選取無效頁面最多的數據塊進行回收,將回收的數據塊插入所述空閑塊鏈表;其中,臟塊鏈表中的數據塊為不全是有效數據的數據塊;
第一判斷模塊300,用于判斷所述空閑塊鏈表中的數據塊數量是否大于第二閾值;若是,則觸發第二回收模塊400;若否,則觸發所述第一回收模塊200;
所述第二回收模塊400,用于從所述臟塊鏈表中選取擦除次數最小的數據塊進行回收,并將回收后的數據塊插入所述空閑塊鏈表;
第二判斷模塊500,用于判斷所述空閑塊鏈表中的數據塊數量是否大于第三閾值;若是,則停止執行回收操作;若否,則觸發所述第二回收模塊400。
基于上述技術方案,本方案還包括:
第三判斷模塊,用于檢測到壞數據塊后,判斷壞數據塊是否存在有效數據;若存在,則觸發第三回收模塊;若不存在,則直接將所述壞數據塊插入壞塊鏈表;
所述第三回收模塊,用于從所述空閑塊鏈表中選取擦除次數最小的數據塊作為當前數據塊;將所述壞數據塊中的有效數據拷貝到所述當前數據塊,并將所述壞數據塊插入壞塊鏈表。
基于上述技術方案,本方案還包括:
第四判斷模塊,用于判斷干凈塊鏈表中擦除次數最大的數據塊與擦除次數最小的數據塊的擦除次數之差是否大于第四閾值;若是,則觸發數據遷移模塊;
所述數據遷移模塊,用于將擦除次數最大的數據塊作為第三數據塊,將擦除次數最小的數據塊作為第四數據塊,從所述空閑塊鏈表中選取擦除次數最小的數據塊作為當前數據塊;將所述第三數據塊中的數據拷貝到所述當前數據塊,擦除所述第三數據塊;將所述第四數據塊中的數據拷貝到所述第三數據塊中,并將所述第四數據塊插入所述空閑塊鏈表。
綜上可見,本方案提供的對固態存儲損耗均衡的改進方法,將固態存儲設備中的數據塊分為不同的狀態,在垃圾回收過程中根據空閑塊數目和擦除次數選擇進行回收的數據塊,提高垃圾回收的效率。同時對不經常更新的靜態數據定時遷移到擦除次數較多的數據塊中,使得各個數據塊的使用更加均衡,延長固態存儲整體的使用壽命。
本說明書中各個實施例采用遞進的方式描述,每個實施例重點說明的都是與其他實施例的不同之處,各個實施例之間相同相似部分互相參見即可。
對所公開的實施例的上述說明,使本領域專業技術人員能夠實現或使用本發明。對這些實施例的多種修改對本領域的專業技術人員來說將是顯而易見的,本文中所定義的一般原理可以在不脫離本發明的精神或范圍的情況下,在其它實施例中實現。因此,本發明將不會被限制于本文所示的這些實施例,而是要符合與本文所公開的原理和新穎特點相一致的最寬的范圍。