SSD之GC的相关介绍

什么是GC?  什么时候做GC?   做GC的实现流程?

GC(垃圾回收):

GC(垃圾回收),就是把某个闪存块上的有效数据读出来,重写,然后把闪存块擦除,就得到新的可用的闪存块了。

“SSD越写越慢”,其实这是有科学依据的:可用闪存空间富裕时,SSD是无须做GC的,因为总有空闲的空间可写。SSD使用早期,由于没有触发GC, 无须额外的读写,所以速度很快。慢慢的会发现SSD变慢了,主要是因为SSD需要做GC。

GC(垃圾回收)时机:

常见的两种SSD自己内部控制的垃圾回收时机:Foreground GC(前台垃圾回收)、Background GC(后台垃圾回收)。

Foreground GC(前台垃圾回收)——当用户写入数时,如果可用的闪存块小于一定阈值,这时就需要做GC,以腾出空间给用户写。这是被动方式,它是由于SSD没有多少可用的闪存块时,才去做的GC。

Background GC(后台垃圾回收)——它是在SSD空闲(idle)时,SSD主动去做的GC,这样用户写入的时候就有充裕的可用的闪存块,不需要临时做Foreground GC,从而改善用户写入性能。(由于功耗考虑,idle时不做Background GC而进入省电模式)

除了SSD本身,有些SSD还支持主机控制其做GC。主机管理SSD的功能即HMS(Host Managed SSD)技术。HMS就是主机通过应用软件获取SSD的运行状态,然后控制SSD的一些行为。使用者可以通过HMS软件在SSD空闲时让其执行GC任务。

GC(垃圾回收)实现:

简单分为三步:

1)挑选源闪存块;

2)从源闪存块中找有效数据;

3)把有效数据写入到目标闪存块中;

第一步挑选源闪存块,一个常见的算法就是挑选有效数据最小的块,这样需要重写的有效数据就越少,回收一个块的代价也最小。

如何找到有效数据最小的那个块呢?

这需要FW在写用户数据时做一些额外的工作,即记录和维护每个闪存块的有效数据量。用户每往一个新的块上写入一笔用户数据,该闪存块上的有效数据就加1。同时还需要要找到这笔数据之前所在的块(如果之前该笔数据曾写入过),由于该笔数据写入到新的块,那么在原闪存块上的数据就变无效了,因此原闪存块上的有效数据量就应该减1.

 

第二步就是把有效数据从源闪存块读出来。如何知道哪些数据是有效的,哪些又是无效的呢?

如果FW不仅仅只更新和维护闪存块的有效数据量(第一步),还给闪存块一个Bitmap表,标识哪个物理页是否有效,那么在做GC的时候FW只需要根据Bitmap表的信息,把有效数据读出,然后重写即可。

具体做法即FW把一笔逻辑页写入到某个闪存块时,该闪存块上对应位置的Bit就置1。一个闪存块上新增一笔有效数据,就意味着该笔数据所在的前一个闪存块上数据变成无效,因此需要把前一个闪存块对应的位置的Bit清0。

由于有了闪存块上有效数据的Bitmap,在做GC的时候,FW就能准确定位到有效数据并读出。

 

当有效数据读出来时,最后一步就是重写,即把读出来的有效数据写入闪存。

 

posted @ 2022-06-11 22:12  IC学长  阅读(1057)  评论(0编辑  收藏  举报