GC(垃圾回收/收集)
垃圾收集(Garbage Collection,GC)在固态硬盘(Solid-State Drive,SSD)中扮演了重要的角色。由于NAND闪存单元的物理特性,它们不能单独被覆写,必须先被擦除,然后才能重新编程。这就是为什么SSD需要执行垃圾收集过程,以保持其性能和增强寿命。
在SSD中,GC的主要任务是寻找包含已失效(旧版本或已删除的)数据的闪存块,然后擦除这些块以便重新写入新数据。这个过程涉及到以下步骤:
- 选择源GC块:首先,GC过程需要选择一个包含许多失效页的闪存块作为源块。源块选择的策略会影响到SSD的寿命和性能,因此需要谨慎选择。
- 移动有效数据:源块中的所有有效(仍被文件系统引用的)数据页需要被搬移到其他闪存块中。在此过程中,通常会使用硬件加速器(如DMA控制器)来加速数据传输,并且可能需要利用内存中的缓冲区来暂存数据。
- 擦除源块:一旦所有有效数据都被移动,源块就可以被擦除,准备用于存储新的数据。
- 更新映射表:SSD中的物理页到逻辑页的映射表需要更新,以反映因GC过程导致的数据位置改变。
值得注意的是,GC过程会产生额外的写入操作(称为写放大),这对SSD的寿命和性能有影响。因此,优化GC算法是SSD控制器设计中的重要任务。
在实际应用中,有两种GC:前台GC和后台GC。前台GC在没有可用闪存块时进行,可能会阻碍新的写入操作。后台GC则在SSD空闲时进行,以尽可能减小对性能的影响。SSD控制器会设定一个水位线(水位线以下表示空闲闪存块的数量较少,需要进行GC)来平衡这两种GC的执行。
以上就是SSD中的GC过程的基本概述。需要指出的是,不同的SSD控制器可能会实现不同的GC策略和优化手段,但基本原理和步骤大致相同。
check_zone
在垃圾收集(GC)过程中,Check_Zone的主要功能是防止用户数据写入和GC操作之间的冲突。为了理解这个问题,我们首先要理解SSD的写入操作和垃圾收集过程。
在SSD中,数据以页为单位写入,而删除则以块为单位。当SSD写入新的数据时,如果目标位置已经包含旧的数据,那么需要先擦除整个块然后再写入新的数据。这样的设计使得SSD不能就地更新数据。当数据需要更新时,通常的做法是将新的数据写入到一个空闲的位置,然后将旧的数据标记为无效。这导致了SSD中存在大量的无效数据,需要通过垃圾收集过程进行清理,以回收这些空间用于新的写入。
然而,在垃圾收集过程中,如果有新的写入请求到达,可能会发生冲突。因为垃圾收集过程可能正在读取或写入一个块,如果在这个时候有新的写入请求到达,尤其是目标地址是正在处理的块,就可能发生数据不一致的问题。这就是Check_Zone的作用所在,它可以帮助检查并协调这种冲突。
更具体地说,当写入用户数据时,会通过 set_p4k_in_check_zone
函数设置对应的p4k状态。而在GC操作中,通过 is_p4k_set_in_check_zone
函数检查p4k状态,如果发现这个p4k正在进行“覆盖”写入,那么就会跳过这个物理地址,以防止冲突。这就是Check_Zone的基本功能。
WL(磨损均衡)
在固态硬盘(SSD)中,磨损均衡(Wear Leveling)是一种技术,用于均匀地在所有可用闪存单元中分配写操作,从而最大限度地延长整个闪存的寿命。
为了理解为什么磨损均衡是必要的,我们必须了解一些关于NAND闪存的基本事实。在闪存中,每个存储单元都有有限的编程/擦除(P/E)周期,也就是说,每个单元只能被写入和擦除有限次。如果某个闪存块被过度使用(经常被写入和擦除),那么这个块可能会在其他闪存块之前耗尽其P/E周期并失效,这可能会导致整个设备失效。
为了避免这种情况,磨损均衡策略试图保证所有的闪存块都经受相同程度的磨损,从而最大程度地利用闪存的总寿命。这样做可以确保没有单个闪存块比其他块提前大量地磨损。
磨损均衡有两种主要类型:静态和动态。
1. 动态磨损均衡:当SSD需要写入新数据时,它会在剩余的闪存块中选择一个最少使用的块进行写入。这样可以确保所有的闪存块都有相等的机会被写入。
2. 静态磨损均衡:这个过程涉及到对那些在长时间内没有被写入的闪存块(也被称为冷数据块)的管理。为了保持所有块的磨损均衡,SSD控制器会周期性地将这些冷数据块(年轻块)的数据移动到其他热数据所在的(年老块)闪存块,然后将原来的块擦除,以便年轻块接受新的写入。
为了实现有效的磨损均衡,SSD控制器需要实时监控每个闪存块的使用情况,并有一个智能算法来选择下一个要写入的闪存块。此外,控制器还需要管理静态和动态磨损均衡策略,以确保闪存设备的寿命最大化。