从嘉の小站

Embedded system, Operating system & AI. Reading, Movie & Life.

[译] [NAND Flash] 5. Garbage Collection

[译] [NAND Flash] 5. Garbage Collection

原文链接:https://flashdba.com/2014/10/15/understanding-flash-garbage-collection-matters/

Why We Need Garbage Collection?

首先我们来考虑一下没有垃圾回收机制的flash系统会发生什么。

假设一个由6个blocks组成的非常简单的flash系统,每个block中包含10个pages。最开始,所有的page都是空的。

现在,我们向flash写入一些数据。写操作(write operation / program operation)发生在page层。现在,系统使用情况变成了下图所示。

可以看到,wear leveling算法将这些数据尽可能均匀地分布到了各个block中,但是,仍然存在一些block,其被占用的page数更多。实际上,wear leveling无需非常精确。

现在,我们来加一些数据。

现在系统达到了50%的使用率。同样的,为了wear leveling,数据都被尽可能地均匀分散。之后,flash translation会进行逻辑块(logical block)到物理块(physical block)的映射,因此,尽管数据已经被分散到不同的block中,在被应用程序调用时它们仍然表现得是连续的。

数据更新

有些时候,我们可能需要更新一些现存的数据。但是,如之前所介绍的,NAND flash不能更新page中的数据,只能擦除重用。因此我们先简单地把更新后的数据写到空page中,然后把旧page标记为invalid(stale)。逻辑块地址会重映射到新的page物理地址上。

可以看到,系统即将到达存储极限。在上图中,最左边的block中有两个stale pages (invalid pages),四个used pages。为了释放掉这些stale pages,我们需要将used pages拷贝到其他地方,然后擦除block。如果不这么做,继续写入数据,系统free pages将会越来越少,存储空间消耗殆尽,我们没有充足的空间来释放stale pages,这就意味着我们只能将存储系统 (flash system)转换为一个只读系统。但是,如下图所示,其实只有75%的空间存着真正有用的数据。这是否意味着我们永远不能利用100%的系统存储呢?

冗余机制

为了确保系统中始终有足够的空间来进行garbage collection,以及允许bad blocks, wear leveling等,许多flash system使用了冗余机制。

也就是说,设备内存的实际容量往往更大。这个冗余量并不固定,它不是一组专用的block或page,只是强制性的空间,用于防止上述意外的发生。

如何确定冗余量呢?对于读取密集型的工作负载,冗余量没必要太大;相反,对于某些特定工作负载而言,在SSD设备上进行硬限制并不是一个好的策略。可以根据工作负载来确定需要多少冗余。

下一章,我们将讨论更多垃圾收集的细节,特别是背景与前景垃圾收集的概念 (background versus foreground garbage collection),以及写入悬崖(write cliff)。

admin

发表评论

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax