本發(fā)明屬于固態(tài)盤存儲技術(shù)領(lǐng)域,具體涉及一種閃存存儲的垃圾回收優(yōu)化方法。
背景技術(shù):
垃圾回收是固態(tài)盤系統(tǒng)中清除無效數(shù)據(jù)必要的方法,這一過程在固態(tài)盤的整個生命周期中會頻繁地發(fā)生。垃圾回收主要是針對待回收臟塊內(nèi)的有效數(shù)據(jù)進行回收,清除臟塊前,具體的,需要將其中的有效數(shù)據(jù)轉(zhuǎn)移到閃存的其他空閑位置,然后才能將臟塊擦除。
現(xiàn)有的數(shù)據(jù)遷移的方法,是先將有效頁的數(shù)據(jù)讀回控制器,然后再寫入到nand閃存中。也就是說,臟塊中的數(shù)據(jù)都需要先讀出到制器,一般的,還需要對這些數(shù)據(jù)進行再編碼,然后才能寫入閃存。然而這種垃圾回收方法需要耗費大量的時間,還會阻塞系統(tǒng)i/o,是目前以閃存為存儲介質(zhì)的固態(tài)盤系統(tǒng)急需突破的性能瓶頸。
現(xiàn)有技術(shù)中,cn201180041989公開了一種先占式垃圾回收方法,該方法的核心技術(shù)在于確定垃圾回收量后,判斷回收量相較于回收閾值的大小,根據(jù)回收量的大小進行垃圾回收操作。該方法雖然可以解決需要回收的垃圾量過載的問題,但是對于保證數(shù)據(jù)存儲可靠性的需求來說,沒有任何的助益。在另一個現(xiàn)有技術(shù)cn201510671242中,公開了一種基于數(shù)據(jù)生存期的固態(tài)盤垃圾回收方法,該方法的核心技術(shù)在于,根據(jù)應用要求設置遞增的時間數(shù)列,根據(jù)待寫數(shù)據(jù)的預期生存期限,選擇不同的方式進行垃圾回收。該方法的目的主要在于保證固態(tài)盤的寫入速度,減小數(shù)據(jù)移動帶來的訪問開銷,對于固態(tài)盤的數(shù)據(jù)存儲可靠性沒有提出有效的解決辦法。
技術(shù)實現(xiàn)要素:
針對現(xiàn)有技術(shù)的以上缺陷或改進需求,本發(fā)明提供了一種閃存垃圾回收優(yōu)化方法及其應用,提出了一種自適應的垃圾回收方法,本發(fā)明技術(shù)的優(yōu)化方法在保證固態(tài)盤數(shù)據(jù)存儲的可靠性的前提下,減少垃圾回收所需時間,提高系統(tǒng)i/o性能。
為實現(xiàn)上述目的,按照本發(fā)明的一個方面,提供了一種閃存垃圾回收優(yōu)化方法,其特征在于,包括,
對確定回收的臟塊內(nèi)有效數(shù)據(jù)進行糾錯碼糾錯閾值檢測;
判斷所述有效數(shù)據(jù)錯誤是否達到其糾錯碼的糾錯閾值;
對錯誤未達到糾錯碼糾錯閾值的有效數(shù)據(jù),采用copy-back指令將該有效數(shù)據(jù)通過寄存器直接寫入閃存中;對錯誤已達到糾錯碼糾錯閾值的有效數(shù)據(jù),先將該有效數(shù)據(jù)讀回控制器,再寫入閃存中。
本發(fā)明技術(shù)方案中,首先檢測待回收臟塊內(nèi)待回收的有效數(shù)據(jù)的錯誤,確定其是否達到錯碼的最大糾錯能力,即進行糾錯碼糾錯閾值檢測。對于錯誤未達到糾錯碼閾值的有效數(shù)據(jù),本發(fā)明技術(shù)方案中采用copy-back指令,借助寄存器,先將有效數(shù)據(jù)存入寄存器,再將數(shù)據(jù)置入閃存中。由于待回收的臟塊也位于閃存中,通過這種方法,不需要從閃存中取出有效數(shù)據(jù)即可實現(xiàn)有效數(shù)據(jù)在閃存內(nèi)的直接轉(zhuǎn)移,大大節(jié)省了垃圾回收的時間。對于錯誤已達到糾錯碼閾值的有效數(shù)據(jù),已經(jīng)達到糾錯碼的最大糾錯功能,因此需要將有效數(shù)據(jù)先讀回控制器,重新進行糾錯碼編碼后,再寫入閃存中。本發(fā)明技術(shù)方案的方法,通過檢測有效數(shù)據(jù)頁中的錯誤大小,判斷錯誤是否達到其糾錯碼的糾錯閾值,從而采取兩種方式對臟塊中的有效數(shù)據(jù)進行回收,一方面保證了所回收的有效數(shù)據(jù)的準確性,另一方面也節(jié)約了垃圾回收的時間。
作為本發(fā)明技術(shù)方案的一個優(yōu)選,分別對臟塊中每個有效數(shù)據(jù)頁進行糾錯碼糾錯閾值檢測,以保證寫入閃存的有效數(shù)據(jù)的可靠性。
臟塊內(nèi)的有效數(shù)據(jù)回收是一個持續(xù)的過程,針對每一次具體回收的有效數(shù)據(jù),都需要進行閾值檢測。具體而言,針對每一個待回收的數(shù)據(jù)頁,都對其進行糾錯碼糾錯閾值的檢測,根據(jù)錯誤是否達到糾錯碼糾錯閾值,來決定選擇何種方式進行有效數(shù)據(jù)的回收。其中,因為copy-back指令累積錯誤的特點,在最開始進行有效數(shù)據(jù)回收的時候即對全部的數(shù)據(jù)頁進行糾錯碼糾錯閾值的檢測,判斷有效數(shù)據(jù)頁中的數(shù)據(jù)錯誤是否達到糾錯碼糾錯的最大能力。對錯誤沒有達到糾錯碼糾錯閾值的有效數(shù)據(jù)進行回收的時候,直接將數(shù)據(jù)讀取到閃存同一分組內(nèi)的寄存器,再將讀取到寄存器內(nèi)的數(shù)據(jù)寫入選定的空白頁。對于錯誤達到了糾錯碼糾錯閾值的有效數(shù)據(jù),需要送入控制器以及進行再編碼過程,才能寫入閃存。這種回收方式,可以確保每次回收的有效數(shù)據(jù)的可靠性。
作為本發(fā)明技術(shù)方案的一個優(yōu)選,對錯誤未達到糾錯碼糾錯閾值的有效數(shù)據(jù)的回收處理具體包括,
將所述錯誤未達到糾錯碼糾錯閾值的有效數(shù)據(jù)寫入閃存中的寄存器;
將寄存器中的有效數(shù)據(jù)遷移到閃存的空白頁上。
作為本發(fā)明技術(shù)方案的一個優(yōu)選,通過寄存器對錯誤未達到糾錯碼糾錯閾值的有效數(shù)據(jù)進行遷移時,隨時對其進行糾錯碼糾錯閾值檢測。
針對錯誤未達到糾錯碼糾錯閾值的有效數(shù)據(jù),本發(fā)明技術(shù)方案主要是采用copy-back指令進行數(shù)據(jù)的遷移。該指令可以在不取出數(shù)據(jù)的前提下,實現(xiàn)數(shù)據(jù)從一個閃存頁到另一個閃存頁的轉(zhuǎn)移過程。這一過程主要是通過寄存器來實現(xiàn)的。寄存器是位于閃存內(nèi)部的一個組成部分,是一種有限存貯容量的高速存貯部件,它們可用來暫存指令、數(shù)據(jù)和地址。由于copy-back操作是在分組內(nèi)直接利用寄存器進行數(shù)據(jù)遷移,在這一過程無法利用糾錯碼(ecc,errorcorrectioncode)對數(shù)據(jù)完成糾錯,因而會導致數(shù)據(jù)遷移完成后數(shù)據(jù)中錯誤累加,最終超過糾錯碼的糾正能力,進而影響整個系統(tǒng)的可靠性。因此,在每次垃圾回收開始對有效數(shù)據(jù)進行遷移之前,對回收塊中每個有效頁的數(shù)據(jù)進行糾錯碼糾錯閾值檢測,即首先對準備遷移的有效頁數(shù)據(jù)進行錯誤檢測,判斷錯誤是否達到ecc的最大糾錯能力。
作為本發(fā)明技術(shù)方案的一個優(yōu)選,對錯誤已達到糾錯碼糾錯閾值的有效數(shù)據(jù)的回收處理具體包括,
將所述錯誤已達到糾錯碼糾錯閾值的有效數(shù)據(jù)讀入控制器;
將控制器中的有效數(shù)據(jù)送入編碼器進行糾錯碼編碼;
將經(jīng)過糾錯碼編碼的有效數(shù)據(jù)送回控制器;
判斷臟塊中的有效數(shù)據(jù)是否全部收集到控制器中,如果是,則將控制器中的有效數(shù)據(jù)寫入閃存的空閑塊中。
對已達到糾錯碼糾錯閾值的有效數(shù)據(jù),如果直接采用copy-back指令對數(shù)據(jù)進行轉(zhuǎn)移,錯誤已經(jīng)達到糾錯碼的糾錯閾值,無法保證寫入閃存的數(shù)據(jù)可靠性。因此需要對其進行糾錯碼再編碼,確保其具有自我糾錯能力,然后再寫入閃存。具體來說,需要將錯誤達到糾錯碼糾錯閾值的有效數(shù)據(jù)讀入控制器,即將其寫入控制器的數(shù)據(jù)緩存區(qū)(buffer),進行糾錯碼再編碼后,再將經(jīng)過再編碼的有效數(shù)據(jù)讀回控制器,然后寫入閃存。此外,臟塊內(nèi)的有效數(shù)據(jù)寫入閃存是分多次進行的,因此在一次有效數(shù)據(jù)轉(zhuǎn)移完成后,為了保證數(shù)據(jù)回收過程的可靠性,需要對待回收的臟塊進行檢測,確認臟塊內(nèi)的有效數(shù)據(jù)都已經(jīng)完成轉(zhuǎn)移后,再將控制器的數(shù)據(jù)緩存區(qū)(buffer)中的有效數(shù)據(jù)寫入閃存中。
作為本發(fā)明技術(shù)方案的一個優(yōu)選,所述有效數(shù)據(jù)寫入閃存后,判斷臟塊內(nèi)的有效數(shù)據(jù)是否已全部寫入閃存,若是,擦除臟塊。
在確認臟塊中的有效數(shù)據(jù)回收全部完成,將臟塊擦除之前,需要對待擦除的臟塊進行檢測,確認其中的有效數(shù)據(jù)已經(jīng)回收完全,只有臟塊中的有效數(shù)據(jù)確認全部回收后,才能將其擦除。
按照本發(fā)明的另一個方面,提供了一種應用權(quán)利要求1~6任一項所述的閃存垃圾回收優(yōu)化方法的垃圾回收方法,其特征在于,包括,
s1確定要進行垃圾回收的臟塊;
s2對臟塊內(nèi)當前的有效數(shù)據(jù)進行糾錯碼糾錯閾值檢測;
s3判斷臟塊內(nèi)當前的有效數(shù)據(jù)錯誤是否達到糾錯碼的糾錯閾值,若達到,轉(zhuǎn)步驟s6,否則,轉(zhuǎn)步驟s4;
s4執(zhí)行copy-back命令,通過閃存分組內(nèi)的寄存器進行數(shù)據(jù)遷移;
s5判斷有效數(shù)據(jù)遷移是否結(jié)束,若結(jié)束,轉(zhuǎn)步驟s11,否則,轉(zhuǎn)步驟s2;
s6將臟塊中的有效數(shù)據(jù)讀回控制器的數(shù)據(jù)緩沖區(qū)中;
s7對數(shù)據(jù)進行糾錯碼編碼;
s8編碼后將數(shù)據(jù)送回數(shù)據(jù)緩沖區(qū)中;
s9判斷臟塊中有效數(shù)據(jù)收集到數(shù)據(jù)緩沖區(qū)是否全部完成,若完成,轉(zhuǎn)步驟s10,否則,轉(zhuǎn)步驟s6;
s10將收集的有效數(shù)據(jù)寫入閃存的空閑塊中;
s11垃圾回收所有有效數(shù)據(jù)遷移完成,將臟塊擦除。
本發(fā)明技術(shù)方案的垃圾回收方法,確定要回收的垃圾臟塊后,先對待回收的有效數(shù)據(jù)進行糾錯碼糾錯閾值檢測,對于錯誤未達到糾錯碼糾錯閾值的數(shù)據(jù),可以直接采用copy-back指令進行數(shù)據(jù)遷移。這樣的話,針對錯誤沒有達到糾錯碼糾錯閾值的有效數(shù)據(jù)的回收可以在閃存中直接完成,大大節(jié)省了垃圾回收的時間。對于錯誤達到了糾錯碼糾錯閾值的數(shù)據(jù),則需要將其讀回控制器的數(shù)據(jù)緩存區(qū)(buffer)并對其進行再編碼后,再寫入閃存。具體來說,就是先將待回收的有效數(shù)據(jù)讀回控制器的緩存區(qū)(buffer),然后將有效數(shù)據(jù)從中取出放入編碼器進行再編碼。經(jīng)過再編碼的有效數(shù)據(jù)重新回到控制器緩存區(qū)(buffer),然后才能夠?qū)懭肟瞻组W存塊中。這種方法一方面可以通過copy-back指令提高垃圾回收的效率,另一方面也可以通過對錯誤達到糾錯碼糾錯閾值的有效數(shù)據(jù)頁進行再編碼以保證數(shù)據(jù)的可靠性,從而整體上保證固態(tài)盤數(shù)據(jù)存儲的可靠性,減少垃圾回收所需時間,提高系統(tǒng)i/o性能,還可以進一步地提高固態(tài)盤數(shù)據(jù)存儲的可靠性。
按照本發(fā)明的另一個方面,提供了一種應用權(quán)利要求1~6任一項所述的閃存垃圾回收優(yōu)化方法的垃圾回收系統(tǒng),其特征在于,包括,
臟塊判斷模塊,用于確定要回收的臟塊;
糾錯碼糾錯閾值檢測模塊,用于對臟塊內(nèi)當前有效數(shù)據(jù)進行糾錯碼糾錯閾值檢測;
數(shù)據(jù)遷移模塊,包括第一數(shù)據(jù)遷移模塊和第二數(shù)據(jù)遷移模塊,所述第一數(shù)據(jù)遷移模塊,用于將未達到糾錯碼的糾錯閾值的有效數(shù)據(jù),通過閃存分組內(nèi)的寄存器進行數(shù)據(jù)遷移;所述第二數(shù)據(jù)遷移模塊,用于將達到糾錯碼的糾錯閾值的有效數(shù)據(jù),先將有效數(shù)據(jù)讀回控制器,再寫入閃存中;
有效數(shù)據(jù)判斷模塊,用于判斷臟塊內(nèi)是否還存在有效數(shù)據(jù);
擦除模塊,用于擦除臟塊。
按照本發(fā)明的另一個方面,提供了一種存儲設備,其中存儲有多條指令,所述指令適用于由處理器加載并執(zhí)行:
s1確定要回收的臟塊;
s2對臟塊內(nèi)當前有效數(shù)據(jù)進行糾錯碼糾錯閾值檢測;
s3將未達到糾錯碼糾錯閾值的有效數(shù)據(jù),通過寄存器直接寫入閃存中;將已達到糾錯碼糾錯閾值的有效數(shù)據(jù),先讀回控制器,再寫入閃存中;
s4判斷臟塊內(nèi)是否還存在有效數(shù)據(jù),若是,返回步驟s2;
s5擦除臟塊。
按照本發(fā)明的另一個方面,提供了一種終端,其特征在于,包括:
處理器,適于實現(xiàn)各指令;
存儲設備,適于存儲多條指令,其中所述指令適用于由處理器加載并執(zhí)行:
s1確定要回收的臟塊;
s2對臟塊內(nèi)當前有效數(shù)據(jù)進行糾錯碼糾錯閾值檢測;
s3將未達到糾錯碼糾錯閾值的有效數(shù)據(jù),通過寄存器直接寫入閃存中;將已達到糾錯碼糾錯閾值的有效數(shù)據(jù),先讀回控制器,再寫入閃存中;
s4判斷臟塊內(nèi)是否還存在有效數(shù)據(jù),若是,返回步驟s2;
s5擦除臟塊。
總體而言,通過本發(fā)明所構(gòu)思的以上技術(shù)方案與現(xiàn)有技術(shù)相比,能夠取得下列有益效果:
(1)本發(fā)明技術(shù)方案的垃圾回收優(yōu)化方法,能夠有效提高垃圾回收的效率,在將臟塊內(nèi)的有效數(shù)據(jù)寫入閃存之前,先對其進行糾錯碼糾錯閾值檢測,在保證閃存存儲可靠性的前提下,對垃圾回收采取copy-back的方式進行數(shù)據(jù)遷移,將臟塊中有效頁的數(shù)據(jù)直接在分組內(nèi)經(jīng)過分組內(nèi)的寄存器遷移到另外的數(shù)據(jù)塊中,減少了垃圾回收傳統(tǒng)的數(shù)據(jù)遷移的傳輸延時,有效提高了垃圾回收的效率,進而提高系統(tǒng)整體的i/o性能。
(2)本發(fā)明技術(shù)方案的垃圾回收優(yōu)化方法,采用了糾錯碼糾錯閾值檢測機制,在回收有效數(shù)據(jù)前先對數(shù)據(jù)是否達到ecc糾錯閾值進行檢測,一旦copy-back操作導致有效數(shù)據(jù)錯誤累加達到ecc最大糾錯能力時,即更改數(shù)據(jù)回收方式,變?yōu)槔厥諅鹘y(tǒng)的數(shù)據(jù)遷移方式。此機制保證了數(shù)據(jù)發(fā)生的錯誤不超過ecc的最大糾錯能力,保證了閃存存儲的可靠性。
附圖說明
圖1是本發(fā)明實施例的閃存存儲的垃圾回收優(yōu)化方法的流程圖;
圖2是本發(fā)明實施例的垃圾回收數(shù)據(jù)遷移結(jié)構(gòu)框圖。
具體實施方式
為了使本發(fā)明的目的、技術(shù)方案及優(yōu)點更加清楚明白,以下結(jié)合附圖及實施例,對本發(fā)明進行進一步詳細說明。應當理解,此處所描述的具體實施例僅僅用以解釋本發(fā)明,并不用于限定本發(fā)明。此外,下面所描述的本發(fā)明各個實施方式中所涉及到的技術(shù)特征只要彼此之間未構(gòu)成沖突就可以相互組合。
本發(fā)明技術(shù)方案的目的在于提供一種糾錯碼(ecc)糾錯閾值檢測機制,對垃圾回收的數(shù)據(jù)遷移是采用閃存內(nèi)直接遷移還是采用傳統(tǒng)的數(shù)據(jù)遷移方式進行判斷決策。
在垃圾回收數(shù)據(jù)遷移時,首先根據(jù)臟塊內(nèi)的有效數(shù)據(jù)發(fā)生的錯誤進行ecc糾錯閾值檢測,判斷所發(fā)生的錯誤是否已經(jīng)達到ecc糾錯的最大能力,如果已經(jīng)達到,則采用垃圾回收傳統(tǒng)的數(shù)據(jù)遷移方式,將臟塊中的有效數(shù)據(jù)讀回控制器的數(shù)據(jù)buffer中,對數(shù)據(jù)進行ecc編碼,將數(shù)據(jù)送回數(shù)據(jù)buffer后判斷臟塊中有效數(shù)據(jù)收集到buffer是否全部完成,完成后將收集的有效數(shù)據(jù)寫入閃存中另外的空閑塊;如果發(fā)生的錯誤未達到ecc糾錯的最大能力,則采用copy-back命令直接在閃存內(nèi)進行數(shù)據(jù)遷移。
數(shù)據(jù)遷移一般是通過copy-back操作完成,它是固態(tài)盤系統(tǒng)提供的一種高級命令,支持同一個分組(plane)內(nèi)不同數(shù)據(jù)塊之間的數(shù)據(jù),通過分組內(nèi)的寄存器完成數(shù)據(jù)遷移。通過這一命令,可以減少一般垃圾回收過程中數(shù)據(jù)在閃存介質(zhì)和控制器中數(shù)據(jù)buffer的傳輸過程,減少傳輸延時,提高垃圾回收的效率,進而提升整個系統(tǒng)的性能。然而,由于copy-back操作是在分組內(nèi)進行數(shù)據(jù)遷移,其無法利用差錯控制編碼(ecc)完成數(shù)據(jù)的糾錯,在進行數(shù)據(jù)遷移的過程中,會導致數(shù)據(jù)中錯誤累加,最終超過ecc的糾正能力,影響整個系統(tǒng)的可靠性。另一方面,隨著copy-back和寫入/擦除等操作對存儲單元的損耗,閃存的原始比特誤碼率(rber)會越來越高。為了保證數(shù)據(jù)的安全性,需要使用差錯控制編碼(ecc)來對數(shù)據(jù)進行檢錯糾錯。但是差錯控制編碼的糾錯能力是有限的,當原始比特誤碼率(rber)超過某一閾值時,差錯控制編碼糾錯將不能滿足數(shù)據(jù)存儲的可靠性要求。因此,如何在保證數(shù)據(jù)存儲可靠性的前提下對閃存存儲的垃圾回收進行優(yōu)化是一個很值得研究的問題。有助于減少垃圾回收所需時間,提高系統(tǒng)i/o性能。
在采用copy-back命令直接在閃存內(nèi)進行數(shù)據(jù)遷移時,有可能在所有有效數(shù)據(jù)遷移完成之前數(shù)據(jù)發(fā)生的錯誤累加達到ecc的最大糾錯能力,此時將不能繼續(xù)采用copy-back命令對數(shù)據(jù)進行遷移,而需要采用垃圾回收傳統(tǒng)的數(shù)據(jù)遷移方式進行數(shù)據(jù)遷移,所以在采用copy-back命令進行數(shù)據(jù)遷移時,ecc糾錯閾值檢測器需要隨時對其進行檢測,判斷錯誤是否達到ecc的最大糾錯能力,既保證了閃存存儲的可靠性,又提高了垃圾回收的效率。全部的有效數(shù)據(jù)遷移完成之后,對臟塊進行擦除。
如圖1所示,本發(fā)明實施例的閃存存儲的垃圾回收優(yōu)化方法包括以下步驟:
(1)垃圾回收確定要回收的臟塊。固態(tài)盤經(jīng)過一段時間的使用后,會產(chǎn)生許多無效數(shù)據(jù)。在清除這些無效數(shù)據(jù)之前,需要先確定固態(tài)盤中的垃圾臟塊所在的位置。具體來說,是確定閃存中需要清除的垃圾臟塊的位置。
(2)對臟塊內(nèi)當前的有效數(shù)據(jù)進行糾錯碼(ecc)糾錯閾值檢測。確定垃圾臟塊所在位置后,需要進一步對該臟塊進行檢測。一般來說,臟塊內(nèi)的數(shù)據(jù)內(nèi)容并不是全部需要清除的,對于其中的一些有效數(shù)據(jù)需要轉(zhuǎn)存到固態(tài)盤的其他位置。本發(fā)明技術(shù)方案的實施例中,在轉(zhuǎn)移存儲有效數(shù)據(jù)之前,對有效數(shù)據(jù)進行了糾錯碼的糾錯閾值檢測。糾錯碼的糾錯閾值是有限的,一個糾錯碼只能對一定范圍內(nèi)的錯誤進行糾錯。具體來說,本發(fā)明技術(shù)方案的實施例中對有效數(shù)據(jù)進行糾錯碼糾錯閾值檢測,是為了確認該有效數(shù)據(jù)中的錯誤,是否達到其糾錯碼的糾錯范圍。
(3)判斷臟塊內(nèi)當前的有效數(shù)據(jù)錯誤是否達到ecc的糾錯閾值(ecc的最大糾錯能力),若達到,轉(zhuǎn)(6),否則,轉(zhuǎn)(4)。針對步驟(2)中的分類,即錯誤達到了糾錯碼的糾錯閾值或者沒有達到糾錯碼的糾錯閾值,在本發(fā)明技術(shù)方案的實施例中,采用不同的辦法進行處理?,F(xiàn)有技術(shù)中的垃圾回收和臟塊清除,采用的方法是將臟塊中的有效數(shù)據(jù)先讀回閃存中的控制器,然后將其從控制器中取出送入編碼器進行糾錯碼編碼,將進行了再編碼的有效數(shù)據(jù)再送入控制器,然后再寫入閃存。如圖2所示。針對是否達到糾錯碼的糾錯閾值,對有效數(shù)據(jù)的回收采用不同的方式,簡單來說就是對未達到糾錯碼糾錯閾值的有效數(shù)據(jù),將該有效數(shù)據(jù)通過寄存器直接寫入閃存中;對已達到糾錯碼糾錯閾值的有效數(shù)據(jù),先將該有效數(shù)據(jù)讀回控制器,再寫入閃存中。
(4)執(zhí)行copy-back命令,通過閃存分組內(nèi)的寄存器進行數(shù)據(jù)遷移。copy-back命令是固態(tài)盤系統(tǒng)提供的一種高級命令,支持同一個分組(plane)內(nèi)不同數(shù)據(jù)塊之間的數(shù)據(jù),通過分組內(nèi)的寄存器完成數(shù)據(jù)遷移。對于錯誤沒有達到糾錯碼糾錯閾值的有效數(shù)據(jù),本發(fā)明技術(shù)方案的方法中,將其從待清除的臟塊中直接寫入寄存器,然后通過寄存器直接寫入閃存中的其他空白區(qū)。因為寄存器本身就位于閃存中,因此對于錯誤沒有達到糾錯碼糾錯閾值的有效數(shù)據(jù),在閃存中就可以完成有效數(shù)據(jù)的轉(zhuǎn)移,不需要將其讀出再存入,有效的提高了臟塊中與小數(shù)據(jù)的回收效率,優(yōu)化了整個垃圾回收過程,更進一步地,優(yōu)化了閃存的存儲系統(tǒng)。
(5)判斷有效數(shù)據(jù)遷移是否結(jié)束,若結(jié)束,轉(zhuǎn)(11),否則,轉(zhuǎn)(2)。在利用copy-back進行數(shù)據(jù)遷移的過程中,需要隨時進行檢測。檢測臟塊內(nèi)利用copy-back進行數(shù)據(jù)遷移的的有效數(shù)據(jù)遷移是否完成,如果沒有完成,則繼續(xù)進行數(shù)據(jù)遷移,直到利用copy-back進行數(shù)據(jù)遷移的的有效數(shù)據(jù)遷移全部完成。這部分有效數(shù)據(jù)屬于所有遷移的有效數(shù)據(jù)的一部分,如果臟塊內(nèi)的有效數(shù)據(jù)已經(jīng)全部遷移完成,垃圾回收過程中的回收部分才算完成,才可以進行下一步的臟塊擦除工作。
(6)將臟塊中的有效數(shù)據(jù)讀回控制器的數(shù)據(jù)buffer中。本發(fā)明技術(shù)方案中,對錯誤達到了糾錯碼糾錯閾值的有效數(shù)據(jù),按照上述方法進行回收。因為這部分有效數(shù)據(jù)的錯誤已經(jīng)達到了糾錯碼的糾錯閾值,為了保證有效數(shù)據(jù)的準確性,需要對其進行再編碼??刂破鞯腷uffer是位于閃存外的一個數(shù)據(jù)緩存結(jié)構(gòu),待回收的有效數(shù)據(jù)需要先進入控制器buffer,然后從buffer中取出,進入編碼器再編碼。經(jīng)過再編碼的有效數(shù)據(jù),原路返回到控制器buffer中,此時有效數(shù)據(jù)的糾錯碼經(jīng)過了再編碼,其錯誤處于糾錯碼的更正范圍內(nèi),將該有效數(shù)據(jù)寫入閃存的空白頁即可。
(7)對數(shù)據(jù)進行糾錯碼(ecc)編碼。對于錯誤達到了其糾錯碼糾錯閾值的有效數(shù)據(jù),如果直接將其存入閃存,很顯然錯誤率的累積會導致整個系統(tǒng)中有效數(shù)據(jù)的準確性降低,因此需要對其進行糾錯碼再編碼過程。再編碼的過程,就是為了降低錯誤率,使得有效數(shù)據(jù)中的錯誤數(shù)量小于糾錯碼的糾錯閾值,優(yōu)化有效數(shù)據(jù)的自我糾錯能力。
(8)編碼后將數(shù)據(jù)送回控制器的buffer中。經(jīng)過糾錯碼再編碼的有效數(shù)據(jù),通過原路返回到控制器buffer,再從控制器buffer寫入閃存的空白頁區(qū),最終完成有效數(shù)據(jù)的回收工作。
(9)判斷臟塊中有效數(shù)據(jù)收集到buffer是否全部完成,若完成,轉(zhuǎn)(10),否則,轉(zhuǎn)(6)。對于待回收臟塊中的有效數(shù)據(jù),需要明確以下幾點。第一,臟塊中的有效數(shù)據(jù)回收是分多次進行的,每次回收其中的一部分。第二,針對當前回收的數(shù)據(jù),需要對其進行糾錯碼糾錯閾值檢測后選擇不同的方式進行回收。第三,在一次數(shù)據(jù)回收完成后,需要對臟塊中剩余部分進行檢測,以確認整個臟塊中的有效數(shù)據(jù)回收是否完成。本發(fā)明技術(shù)方案的實施例中優(yōu)選將臟塊中的有效數(shù)據(jù)全部篩選完畢后,針對錯誤達到糾錯碼閾值的有效數(shù)據(jù),經(jīng)過再編碼后先集中存儲在控制器buffer中,再批量寫入閃存的空白頁區(qū)。在本發(fā)明技術(shù)方案的另一個優(yōu)選實施例中,也可以將控制器buffer收集到的數(shù)據(jù)分別寫入閃存的空白頁區(qū)。
(10)將收集的有效數(shù)據(jù)寫入閃存中另外的空閑塊。閃存中存在大量的數(shù)據(jù),對于從臟塊中回收的有效數(shù)據(jù),將其寫入一個空閑頁區(qū)。
(11)垃圾回收所有有效數(shù)據(jù)遷移完成,將臟塊擦除。經(jīng)過本發(fā)明技術(shù)方案實施例的上述步驟,臟塊中的有效數(shù)據(jù)回收完成,可以將臟塊擦除。
(12)本次垃圾回收完成。
本領(lǐng)域的技術(shù)人員容易理解,以上所述僅為本發(fā)明的較佳實施例而已,并不用以限制本發(fā)明,凡在本發(fā)明的精神和原則之內(nèi)所作的任何修改、等同替換和改進等,均應包含在本發(fā)明的保護范圍之內(nèi)。