Yaffs的垃圾回收机制.docVIP

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Yaffs的垃圾回收机制

Yaffs的垃圾回收机制 mournjust(sev7ncolor@) 由于NANDFLASH的独特的特性,使得overwrite变得很困难,而且性能低下。虽然变通的block-mapping机制能够很好的解决这个问题,但是同时也引入了新的问题,即如何确切的了解文件系统的空闲空间,如何从脏页中回收空间等等一系列问题。 我们知道由于VFS缓存机制的引入使得问题变得更加复杂(yaffs没有使用内核的缓存页,但是它使用内部的yaffs_cache)。 Yaffs提供一种gc机制,即垃圾回收,在文件系统内部空间不足时,通过回收一些脏页来重新获得可以使用的空间。 垃圾回收都是由后台进程来定期的完成的,因为这样的工作很费时,如果真的等到逼不得已的时候才去进行垃圾回收的话,耗时就很长了。那么为什么不设定一个阈值,让后台进程定期的进行垃圾回收呢? static int yaffs_check_gc(struct yaffs_dev *dev, int background) 其中输入参数dev为需要进行垃圾回收的设备(每个设备上只能挂载一个yaffs文件系统),background用于表示是否是后台运行的。由yaffs_bg_gc函数调用的时候background始终为1. if (!dev-is_checkpointed) { urgency = yaffs_bg_gc_urgency(dev); gc_result = yaffs_bg_gc(dev, urgency); if (urgency 1) next_gc = now + HZ / 20 + 1; else if (urgency 0) next_gc = now + HZ / 10 + 1; else next_gc = now + HZ * 2; } yaffs_bg_start函数中启动了后台进程yaffs_bg_thread_fn,该进程通过调用yaffs_bg_gc函数来进行垃圾回收。 上面提到了垃圾回收是定期的,这太过于简单化了,前面提到垃圾回收的过程是很耗时,那么如果文件系统当前的空闲块比较多(已经满足大多数情况下的使用),就完全可以推迟垃圾回收。所以垃圾回收其实是一个不定期的时候,具体是有函数yaffs_bg_gc_urgency进行判断的,其中变量next_gc指下次进行垃圾回收的时间。 yaffs_bg_gc具体实现垃圾回收,整个函数是有一个do while循环完成的。 do { max_tries++; checkpt_block_adjust = yaffs_calc_checkpt_blocks_required(dev); 函数yaffs_calc_checkpt_blocks_required用于计算check pointer所需要的空间,关于checkpt我也不甚了解,只能用yaffs文档中的一段描述来回答: Boot-time scanning to build the file structure lists only requires one pass reading NAND. If proper shutdowns happen the current RAM summary of the filesystem status is saved to flash, called checkpointing. This saves re-scanning the flash on startup, and gives huge boot/mount time savings. 其中checkpointer的意思在读《An Efficient NAND Flash File System for Flash Memory Storage》的时候才大体理解。现在yaffs在boot的时候需要扫描设备的每一个block甚至是每一个page来建立起块得使用情况,这个过程是漫长的,是否可以省略这样一段漫长的扫描过程呢?答案是肯定的,那就是将这些信息以一种特殊的形式保持在flash上,这就是checkpoint。 /* If we need a block soon then do aggressive gc. */ if (dev-n_erased_blocks min_erased) aggressive = 1; 如果系统的空闲block数小于 min_erased的下线。那么就需要启动aggressive 模式的垃圾回收了(力度不一样)。 else { if (!background erased_chunks

文档评论(0)

dzzn118 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档