共2条
1/1 1 跳转至页
[原创]Tornado之TrueFFS编程者指南(二)
4.块分配和关联数据集结的方法
为了提高数据的读取效率,TrueFFS使用一种空间分配策略:将关联的数据(如由同一个文件的内容组成的多个块)集结到同一个单独擦除单元(erase unit)内的一段连续的区域中。为此,TrueFFS尽量在同一个擦除单元(erase unit)内维持一个由多个物理上连续自由的块组成的存储池。如果这样连续的存储池无法实现,TrueFFS会尽量保证池中的所有块是在同一个擦除单元(erase unit)内。如果连这样的情况也不可能的话,TrueFFS会尽量把块池分配到一个拥有最多可用空间的擦除单元内。
这种集结关联数据的途径有几个好处。首先,如果TrueFFS必须从一个小的存储窗口(memory window)来访问flash,那么这样集结了的关联数据可以减少调用映射物理块(physical blocks)到该窗口的次数。这样可以加快文件继续访问速度(通常是这样)。其次,这种策略可以减少碎片的产生。这是因为删除一个文件可以释放掉更容易回收的完整块。这意味着碎片回收会变得更快。另外,它可以使属于静态文件的多个块存放在同一地方,这样当wear leveling算法决定移动静态区域时,转移这些块就变得更加容易了。
5.TrueFFS中的错误恢复
向flash写数据有时可能会出错,比如在响应文件系统写请求时、碎片回收期间甚至在TrueFFS格式化或擦除flash时。在这些情况下,TrueFFS能够从错误中恢复过来。但在新数据第一次写入flash时,如果出错就会丢掉这些数据。然而,TrueFFS非常仔细地保证所有已经存放在flash上的数据是可恢复的。
TrueFFS健壮的关键是它使用了一种“先写后擦”(erase afer write)的策略。当更新flash一个扇区的数据时,只有在更新操作完成并且新存储的数据校验成功后,先前的数据才会被允许擦掉。这样的结果是数据扇区不能处于部分写状态。操作成功的话新扇区的数据有效,否则老扇区的数据有效。很明显,这样有利于用户已经写到flash媒体上的数据的稳定性。“先写后擦”对flash存储映射表也有积极的影响。比如,尽管TrueFFS采用了用一张RAM-resident的映射表来记录flash存储器内容的方式,但TrueFFS还会非常小心,决不将临界映射信息只放在RAM中。因此,如果更新映射信息时遇到掉电或者flash媒体被移除的情况,原来的映射信息依然是可用的。当电源恢复(或者flash重新连接),TrueFFS能够使用存放在flash上的信息来重建或校验flash映射表的RAM-resident版本。这样,映射信息能够存在于媒体的任何地方,这在开始看来是一项不可能的工作。
幸运的是,flash中的每一个擦除单元(erase unit)都在一个可以预知的位置放置了头信息(一般在该扇区的0偏移地址处)。仔细核对在每一个擦除单元(erase unit)中的头信息,TrueFFS可以重建或者校验flash映射表的RAM拷贝。所以掉电后唯一后果是如果这时正在回收碎片则碎片回收需要重新开始。
如果写操作第一次尝试失败,TrueFFS通常不会报告给用户。相反,它会使用它的动态映射能力在flash的另一个不同地方来重新进行一次写操作。TrueFFS通过这种自动修复错误的方法确保了数据的完整性。当flash媒体进入它生命极限的时候,这种写错误修复机制变得显著有用。这时,flash的写/擦失败变得更加频繁,但用户看到的结果只是性能的缓慢降低(因为写操作重试的需要)。
TrueTFFS回收碎片的方式是通过将数据从一个旧的单元移到另一个新的单元(置换单元),然后擦除这个旧单元的方式来完成的。这样在进行写数据或者擦除旧单元的过程中碎片回收可能失败。为了最小化这种失败的发生,TrueTFFS将flash媒体格式成包含多个置换单元的方式。这样,如果写到一个置换单元的操作失败,TrueTFFS就会尝试写到另一个置换单元上去。对用户数据没有直接影响,但原来的置换单元不再接受新的数据,变成了只读状态。
有时,flash第一次格式化时就被发现有些空间不可用。倘若坏单元的数目没有超过置换单元的数目,格式化能够成功。对用户的影响也只是flash容量减少了。
------------------------------------
真是不好意思,由于这一段时间工作都会很忙(公司有几位大虾级人物辞职),“TrueFFS编程者指南”的更新会变慢,但不会停下来。写文章的确很费力气,光是我的打字速度就够呛。希望大家体谅。
[align=right][color=#000066][此贴子已经被作者于2003-7-3 10:30:49编辑过][/color][/align]
关键词: 原创 Tornado TrueFFS 编程 指南
共2条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
vscode+cmake搭建雅特力AT32L021开发环境被打赏30分 | |
【换取逻辑分析仪】自制底板并驱动ArduinoNanoRP2040ConnectLCD扩展板被打赏47分 | |
【分享评测,赢取加热台】RISC-V GCC 内嵌汇编使用被打赏38分 | |
【换取逻辑分析仪】-基于ADI单片机MAX78000的简易MP3音乐播放器被打赏48分 | |
我想要一部加热台+树莓派PICO驱动AHT10被打赏38分 | |
【换取逻辑分析仪】-硬件SPI驱动OLED屏幕被打赏36分 | |
换逻辑分析仪+上下拉与多路选择器被打赏29分 | |
Let'sdo第3期任务合集被打赏50分 | |
换逻辑分析仪+Verilog三态门被打赏27分 | |
换逻辑分析仪+Verilog多输出门被打赏24分 |