YAFFS2文件系统的垃圾回收机制

来源:互联网 发布:ubuntu ss 自动切换 编辑:程序博客网 时间:2024/06/06 00:01

         yaffs2文件系统提供了一种garbage collection机制,在文件系统内部空间不足时,通过GC机制将一些系统认为的脏数据进行回收,以获得新的使用空间。

         那么yaffs2文件系统对NAND Flash的废旧数据块的回收条件是怎样的?

         回收时数据是如何进行处理的?


        回收条件:

    • 分配最早
    • 存在的无效数据chunk多于阈值
    • 在条件类似的时候,进行随机选择

       总之,会选择最脏的数据块进行回收。


           结合上面一张图片,在加上linux kernel中对nand驱动的理解,就能够对代码中对yaffs的整个调用机制有一个深入和正确的理解。

           As we have shown so far, when a block is made up only of deleted chunks, that block can be erased and reused. However, consider what will happen if we have many blocks which each have a few current chunks in them. Clearly we cannot erase any of the current blocks or we will destroy data. What we need to do is copy the useful data chunks off a block, deleting the originals and allowing the block to be erased and reused. This process is referred to as garbage collection.  这段话的意思是指:上面啰嗦那么多,都没说明白垃圾回收是咋回事儿,当一个块上面每个chunk(是逻辑概念,相当于物理上的页概念)都是删除的数据,那么这个块就应该被擦除后重用。然而考虑到有很多块里面只有很少的有用数据的情况,很明显就不能够直接擦除或者说删除上面的数据。这种情况应该怎么处理呢?当然我们需要先把这些有用的数据copy出来放在一些可以使用的存储位置上,然后进行擦除重用。这样的一种处理方式就是垃圾回收机制。

          Yaffs2 cannot use a deletion marker because that would violate the zero overwrites mandate and alternate mechanisms are provided to determine which chunks are current and which are deleted. 这句话解释了为什么yaffs文件系统不支持overwrite机制却能够知道一个数据块的数据是删除数据。

        The chunks are marked as deleted in the RAM data structures used by garbage collection etc, but there is no deletion marker written to flash.因为我们在使用yaffs文件系统管理文件的过程都是将物理上spare区的数据读取到RAM中之后使用的,因此标记信息都存储在RAM上。

         上图的描述中,可以看到VFS,那么VFS是怎样的一种概念呢?摘一段百度的介绍:

Linux下的VFS:

VFS的作用就是采用标准的Unix系统调用读写位于不同物理介质上的不同文件系统。VFS是一个可以让open()、read()、write()等系统调用不用关心底层的存储介质和文件系统类型就可以工作的粘合层。在古老的DOS操作系统中,要访问本地文件系统之外的文件系统需要使用特殊的工具才能进行。而在Linux下,通过VFS,一个抽象的通用访问接口屏蔽了底层文件系统和物理介质的差异性。
每一种类型的文件系统代码都隐藏了实现的细节。因此,对于VFS层和内核的其它部分而言,每一种类型的文件系统看起来都是一样的。
在Linux中,VFS采用的是面向对象的编程方法。
对具体文件系统的超级块是文件系统中最重要的数据结构,它用来描述整个文件系统信息【组织结构和管理信息】。不涉及文件系统的内容 
VFS超级块是各种具体文件系统在安装时建立的,并在这些文件系统卸载时自动删除。

 但是yaffs2文件系统并没有超级块,那么使用VFS的yaffs文件系统是怎样进行工作的呢?在使用mount进行文件系统挂载是怎样进行系统扫描的呢?
 为什么在yaffs2文件系统第一次启动时,会耗时较长,后续就明显感觉快好多呢?
主要是在第一次mount的过程中,yaffs2文件系统需要一次从后往前扫描的过程来建立整个文件系统的架构。这种情况是因为在第一次扫描的时候系统并没有创建checkpoint数据。如果在之后的mount过程中,也出现比较慢的状态很有可能就是在设置的过程中忽略了checkpoint数据。
http://blog.csdn.net/codectq/article/details/17142743yaffs2文件系统的工作流程和checkpoint机制
抛开这些问题不谈,本文讨论的重点是文件系统mount成功之后的工作状态。