FTL潜规则:调优,才是算法精华

前言

在存储领域中有一个FTL的概念,这是一种Flash的内存管理算法,属于各个厂商的核心机密,每个厂商的处理方式不同,有的处理简单,有的处理复杂。

FTL,即Flash Translations layer,也就是闪存转换层,可以完成从逻辑地址到物理地址的转换,简称为映射。

 

为什么需要FTL

因为Flash的质量参差不齐,里面坏掉的区域是完成不能使用的。

Host发送命令下来,要求把一段数据存放在A地址中,此时A就是逻辑地址,而好死不死,Flash中的A地址刚好是坏块,那怎么办?

此时B地址是好的,FTL就将数据存放在B地址中,此时B丢置就是物理地址了,同时将A逻辑地址——B物理地址记录下来,这一段记录就是映射关系了。

下一次,当主机需要读取A逻辑地址的数据时,FTL就会将B物理地址的数据读取出来返回给主机。

FTL的位置

先了解几个名词

UCL

USB Control layer,USB控制层,主要用于解析从Host发送下来的USB命令

FTL

Flash Translation layer,Flash转换层,主要用于将逻辑地址转换成物理地址

FCL

Flash Control layer,Flash控制层,主要用于将经过映射处理后的地址解析成flash指令发送给Flash

UCL、FTL、FCL所处的位置

 

FTL遵循的规则

FTL这种内存管理算法,自然是遵循着着Flash特性,一切都是在Flash特性下才能运行起来的。

  • 写数据以page为最小单位
  • 写入的数据必须打乱存储才会稳定
  • 写满整个Block数据才会稳定
  • 擦除以Block为最小单位,一般不轻易做整块擦除

当然也有其他特性,但是Flash由于批次不同,制造工艺和厂商不同,出厂的flash也各有一些差异性的特性,这些,就实际问题实际分析。

FTL中各种调优

不同的厂商,FTl的方案各不相同,除了逻辑地址和物理地址的映射作用外,一个好的FTL还具备以下的调优:

映射颗粒度

逻辑地址和物理地址之间的映射方式有两种:块映射和页映射。

使用块映射,逻辑块映射到物理块,看起来挺好的,但是如果遇到操作page的情况,比如说要修改刚写满的某个Block中的某一个page,往往需要做整块擦除,大大降低了效率。

使用页映射,虽然弥补了上面的问题,但是每一页都做映射的话,页的数量一多,映射页多,要知道存储映射关系也是要消耗内存的。页映射需要消耗很大的空间。

所以市面上的做法大多数采用:块映射+页映射,简称混合映射,既可以满足存储需求,还能做到以page颗粒进行维护。

映射表存储

映射表是可以随时变化的,也是随时都要用到的,一般用的时候在RAM中使用,不用的时候就需要存储起来,一般都是用一些空闲块存储起来,这些空闲块不存数据,只放映射表。

merge处理

存储领域,少不了数据搬运这一块,一般来说,merge和GC是一起工作的。

GC回收

现在无论什么都会涉及一些垃圾回收,内存永远是一个好的算法需要考量的点。

垃圾回收需要选好时机,谁都不希望一个存储设备,会在没有能用的内存后才开始做GC回收,这就像开启了一段完全看不到进度的卡顿一样。

好的固件往往未雨绸缪,在不知不觉下做好了GC回收的工作。

寿命均衡

逻辑地址和物理地址的映射本身会对寿命均衡产生正面影响。

就刚才讲到的,映射表可以被随时修改,那么逻辑地址对应的物理地址也就被修改了,一些物理Block经常被擦写,往往会加速损坏。

我们可以通过修改逻辑块,让每次物理块不同而避免经常擦写相同的物理块,这本身就保证不会有物理块被经常擦写。

但是有一种情况它没有办法处理,即闲置的数据块,它们被写入后没有更改,就一直占据某些物理块,而这些物理块寿命还很长,而别的块却在飞速损耗中。

面对这种情况,我们只有在合适的时机帮它们换个位置了,如何选择这个时机很重要,而且这个merge搬运动作本身也会损耗寿命本身。

以上这些策略也是各个FTL算法的精华了。

我收集了一些linux的资料、算法小抄和计算机基础的资料,仅供个人学习使用,欢迎大家一起学习探讨。

linux保姆级教程完整版文档资料

 

热门相关:冉冉心动   横行霸道   豪门重生盛世闲女   特工重生:快穿全能女神   重生当学神,又又又考第一了!