具体实施方式
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
为了更好地理解本发明实施例,首先对数据的写操作进行描述。
图1为本发明实施例中写操作的流程示意图,参见图1,主机可以采用如下方式更新数据:
1,更新数据z。假设,Block A的第一个Page中保存有待更新的数据z,用Data z(old)表示,Block A的最后一个Page未使用(即该Page为空白Page)。此时,新数据直接写入Block A的最后一个Page,用Data z(new)。在写入新数据z后,将最后一个Page标记为有效,将第一个Page标记为无效。此时更新在同一个Block内部完成。
2,更新数据y。假设,旧的数据y保存在Block A的第二个Page中,用Data y(old)表示,且Block A中所有Page全部使用完,需要获取一个新的空白Block B。此时,将新数据写入Block B的第一个Page,用Data y(new)表示。在写入新数据y后,将Block B的第一个Page标记为有效,将Block A的第二个Page标记为无效。此时更新在两个Block内完成。
对于需要新写入Block B中的Block A中的其他数据,可以参照上述对y的更新过程进行更新处理。
3,垃圾回收,搬移数据x。假设Block C为挑选出来正在回收的Block,其大部分都是无效(invalid)的Page,需要将Block C的第二个Page中的数据x搬移到Block B的空白Page(第三个Page)中。此时,将Block C中的数据x读出并写入Block B中,两个Block中的数据x均用Data x(same)表示。并且,将Block C的第二个Page标记为无效,将Block B的第三个Page标记为有效。当Block C中的有效数据全部搬走后,可以将其擦除作为新的空白Block供写操作使用。
回收搬移的数据和主机的新数据均写入同一个空白Block中。
在擦除一个Block(如Block C)作为新的空白Block之前,首先需要确定一个用于擦除的Block,如首先需要确定出上述的Block C。现有技术中可以采用遍历的方式,而本发明实施例采用如下方式。
图2为本发明第一实施例的方法流程示意图,包括:
步骤21:根据SSD中每个数据块内包含的有效读写单元的个数,将所述SSD中的数据块划分为至少一个等级,使得位于相同等级的数据块包含的有效读写单元的个数相同,其中,所述有效读写单元是指数据块内除空白读写单元和被标记为无效的读写单元之外的读写单元,所述被标记为无效的读写单元是指回收前不能再次被写入的读写单元;当对SSD中的数据块内的数据进行更新时,如果更新前的数据所在的数据块和更新后的数据所在的数据块不同,则对更新前的数据所在的数据块的等级以及更新后的数据所在的数据块的等级均进行更新;
进一步地,如果更新前的数据所在的数据块和更新后的数据所在的数据块相同,则保持所述更新前的数据以及所述更新后的数据所在的数据块的等级;
步骤22:当需要垃圾回收时,对更新后的位于第一等级的数据块进行回收,其中,所述第一等级中的数据块是包含有效读写单元的个数最少的数据块。
本实施例通过对数据块划分等级,并根据等级回收数据块,可以降低查找最优Block所需的时间,进而加速垃圾回收速度。
进一步地,上述的读写单元可以具有不同的粒度,例如,一个读写单元为一个Page、多个Page或者小于一个Page等。本发明实施例中将以Page为例。
另外,以读写单元为Page为例,有效Page是指除被标记为无效的Page和空白Page之外的Page,以上述读写数据为例,新数据写入的Page就是有效Page,也是标记为有效的Page。
为了在垃圾回收时挑选出最优的Block,即包含最少有效Page的Block进行回收,本发明实施例根据有效读写单元的个数进行等级划分,以便确定出最优的Block。
假设一个块(Block)内包含64个Page,则一个Block可能具有65种状态中的一种。该65种状态分别对应:有0个有效Page(即全是被标记为无效的Page或者仅包括被标记为无效的Page和空白Page)、有1个有效Page、有2个有效Page,...全是有效Page。
之后可以将具有同一个状态的Block组织成同一个等级。例如,Block1和Block2均是有1个有效Page,则将Block1和Block2组织成同一个等级。
例如,图3为本发明实施例中块的组织示意图,参见图3,Level n包括的块分别为Block a、Block b、Block c等,Level n+1包括的块分别为Block x、Block y、Block z等。
可以理解的是,上述划分的等级的个数与每一个Block对应的状态的个数是相同的。例如,上述的Block对应65种状态,则上述划分的等级为65种。
另外,参见图3,为了更新方便,本发明实施例以双向链表方式组织同一个等级内的Block。有多少个等级则对应多少个双向链表。
需要说明的是,上述的等级的数值可以具体是根据包含的有效的读写单元的个数依次排列。例如,将包含0个有效Page的Block划分到Level 0,将包含1个有效Page的Block划分到Level 1,将包含2个有效Page的Block划分到Level 2,依次类推,直至包含全是有效Page的Block划分到Level 64。
每当数据更新时,可能需要更新源Block(即更新前的数据所在的Block)和目的Block(即更新后的数据所在的Block)所在的有效等级。此时,源Block中的有效Page减小1,目的Block中的有效Page增加1。对应地,源Block将降级,目的Block将升级。
需要说明的是,Block可以在使用完成后一次更新,不用每个Page都操作一次。另外,若源Block与目的Block重叠则该Block的等级不用更新。
图4为本发明实施例中数据更新过程中的示意图,参见图4,假设Blocky需要更新,即Block y为源Block,则将Block y从Level n+1删除,并添加到Level n。
图5为本发明实施例中数据更新完毕的示意图,参见图5,Level n中增加了Block y,而Level n+1中删除了Block y。
其中,该垃圾回收操作可以由剩余的空白Block数触发,当剩余空白Block低于某阈值时启动回收以便空白Block(Page)消耗与回收达到平衡。
启动回收时,是回收包含有效读写单元的个数最少的Block。例如,上述描述中Level 0是包含有效Page最少的等级,则从Level 0(也就是上述的第一等级)中进行Block回收。
进一步地,若包含有效读写单元最少的等级为空则再往下一等级获取直至获得到回收的块。图6为本发明实施例中进行垃圾回收的示意图,如图6所示,Level 0~Level n-1均为空,则从Level n中进行回收。其中,在回收时可以按照顺序回收,例如,顺序去除链表的第一个Block a进行回收即可。此时的Block a必然是包含有效Page最少的Block。
上述按Page粒度划分Block只是一种实现特例,在实际应用中,可以根据需要进行Block等级划分,等级划分的粒度可大于Page、也可以小于Page。如以4个Page为粒度进行等级划分,甚至不同的等级可包含不同的Page数,这可根据实际业务以及SSD初始预留的空白空间多少灵活调整。
等级划分粒度越小,回收效率就越高,这样就有能减少额外Page的搬移、写放大比较小,性能比较高。另一方面,划分粒度增大可大大减小数据更新过程中Block有效等级的维护开销。实际上,对大多数应用来说并不需要太精细的划分即可满足需求。
进一步地,本实施例通过双向链表管理同一个等级的Block,可以使得等级更新时更方便。本实施例数据更新过程相比全局遍历筛选最优Block或回收非最优Block将降低不必要的数据搬移,对性能提升和稳定的效果是非常明显的。本实施例回收的总是有效Page最少的Block、搬移的数据量总是最少的、写放大总是最小的,当然性能也是最高的。本实施例的等级链表维护伴随平常的写操作进行,开销分摊到每个或每几个写IO,不会因为回收挑选Block耗时长带来性能波动,一旦空白Block的回收和使用达到平衡,整个SSD的性能将达到稳定值。
图7为本发明第二实施例的方法流程示意图,本实施例中,每组Block等级链表管理一定物理空间内的所有Block,存储数据的物理空间可以是NAND Flash芯片的一部分或组合,如每颗NAND Flash或每个Channel为一个独立的物理空间。链表的维护由SSD控制单元负责,软硬件实现均可。
步骤71:NAND Flash进行数据保存。
例如,主机将数据保存到NAND Flash中,该NAND Flash中可以划分出多个Block,每个Block包括多个Page,数据读写的基本单位可以为Page。控制单元可以对该NAND Flash内保存的数据进行读、写、擦等操作。
步骤72:SSD控制单元根据其管理的NAND Flash内的所有的Block包含的有效Page的个数建立等级链表,并根据数据更新情况对等级链表进行更新。
其中,控制单元通常位于SSD控制芯片内部。可以负责解析主机命令;分配缓存单元;实现逻辑地址与物理地址的映射;协调垃圾回收与主机业务等。
步骤73:缓存单元保存控制单元维护的等级链表。
其中,缓存单元可以暂存数据(如主机读写数据、垃圾回收过程中的中间数据等)、以及各种表项信息(如逻辑地址与物理地址的映射关系、Block磨损及使用信息、Block等级链表等)。通常缓存单元由SSD控制芯片外挂高速存储器(如SDRAM、DDR...)实现,在高性能企业级SSD中缓存容量可达到数百MB。
Block等级链表存放在缓存单元中,业务运行过程中更新等级等操作体现为控制单元对缓存单元进行读写。为节约存储单元空间,构建Block链表时可用存储单元地址隐含表示Block号,存储单元内则存放于该Block相关的前后Block号。每个物理空间占用一段独立的缓存空间,建立独立的Block等级链表组,每组包含若干等级的Block链表。
图8为本发明实施例中等级链表的保存示意图,参见图8,以一块物理空间内的一条链表为例说明Block 0~Block n均在一条链表的情况。
本实施例中,参见图8中的表格,用存储单元地址代表Block号,存储单元存放与该Block相邻的前后Block号,从而组成双向链表。例如,Block 1的地址为Offset 1,Block 1的前后Block分别为Block 0(表格中为0)和Block2(表格中为2)。根据Block号和缓存单元基地址Base Address可实现快速寻址。除各级链表外,需各级链表对应的头尾Block号存放在缓存单元另一个固定位置,便于Block获取和添加操作快速寻址。即,图8中上半部分示意的链表存储情况对应的链表结构示意可以如图8的下半部分所示。
本实施例在上一实施例的基础上,通过存储单元地址隐含表示Block号,存储单元内存储该Block相关的前后Block号,可以节省存储单元空间。
图9为本发明第三实施例的装置的结构示意图,该装置可以具体为执行上述方法的装置,该装置可以位于SSD控制单元中,该装置包括等级管理模块91和回收模块92;等级管理模块91用于根据SSD中每个数据块内包含的有效读写单元的个数,将所述SSD中的数据块划分为至少一个等级,使得位于相同等级的数据块包含的有效读写单元的个数相同,其中,所述有效读写单元是指数据块内除空白读写单元和被标记为无效的读写单元之外的读写单元,所述被标记为无效的读写单元是指回收前不能再次被写入的读写单元;当对SSD中的数据块内的数据进行更新时,如果更新前的数据所在的数据块和更新后的数据所在的数据块不同,则对更新前的数据所在的数据块的等级以及更新后的数据所在的数据块的等级均进行更新;回收模块92用于当需要垃圾回收时,对更新后的位于第一等级的数据块进行回收,其中,所述第一等级中的数据块是包含有效读写单元的个数最少的数据块。
可以是,所述等级管理模块具体用于:每个读写单元内的数据更新时则更新一次等级,或者,每个数据块内的数据更新完毕时更新一次等级。
可以是,所述回收模块具体用于:当剩余空白数据块的个数低于设定的阈值时,按照第一等级内的数据块的排列顺序,依次对所述第一等级内的数据块进行回收。
上述的读写单元的粒度等于页、小于页,或者大于页。
本实施例通过对数据块划分等级并根据等级回收,可以降低查找最优Block所需的时间,进而加速垃圾回收速度。
图10为本发明第四实施例的SSD的结构示意图,包括存储单元101、SSD垃圾回收装置102和缓存单元103;存储单元101用于存储数据,所述数据被划分为多个数据块,每个数据块包括多个读写单元;SSD垃圾回收装置102可以如图9所示;缓存单元103用于将所述SSD控制单元管理的每个等级中包括的数据块的信息进行存储。
该缓存单元可以具体用于将所述SSD控制单元管理的每个等级中的数据块的信息采用双向链表形式进行存储。
进一步地,所述缓存单元具体用于对应每个等级,将该等级中的每个数据块存储在与该数据块的编号对应的存储单元中,且所述存储单元中保存双向链表中与该数据块相邻的两个数据块的编号。
该存储单元可以是NAND Flash或每个Channel。
本实施例通过对数据块划分等级并根据等级回收,可以降低查找最优Block所需的时间,进而加速垃圾回收速度。
可以理解的是,上述方法及设备中的相关特征可以相互参考。另外,上述实施例中的“第一”、“第二”等是用于区分各实施例,而并不代表各实施例的优劣。
本领域普通技术人员可以理解:实现上述方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成,前述的程序可以存储于计算机可读取存储介质中,该程序在执行时,执行包括上述方法实施例的步骤;而前述的存储介质包括:ROM、RAM、磁碟或者光盘等各种可以存储程序代码的介质。
最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。