奇偶校验方式的开销比较大,而且只能发现错误无法进行修复,后来就发展出了通过特定算法,具备纠错能力的ECC内存。ECC内存同样需要额外空间存储纠错码,纠错码的算法并不唯一,其中的深层原理需要丰富的数学知识才能理解,这里就不多说了。
重要却也有其极限的BCH算法:
固态硬盘上使用的ECC算法最常见的是BCH码。BCH是 Bose、Ray-Chaudhuri 与 Hocquenghem 的缩写,是编码理论尤其是纠错码中研究得比较多的一种编码方法。在很多固态硬盘主控的技术参数中我们常常会看到他的身影。比如在SandForce 2281主控的介绍中对于纠错能力就是这样描述的:
Up to 55 bits correctable per 512-byte sector (BCH)
这代表SandForce的纠错能力允许在每512字节数据中最多纠正55个比特的错误。实际上,BCH纠错级别在开卡设置时未必会设定到最高级别,因为纠错级别设置越高,纠错所需运算越复杂,不但主控运算资源可能跟不上,额外的纠错码存储空间需求也会增长,性能也可能会受到影响。这也是为何SSD主控的纠错能力并不能随心所欲的无限制提高的原因。
事实上,还有一个很少被披露的参数,除了纠错比特数之外,纠错算法还会有个检测比特数的极限,如果错误比特数超过极限后,就会有错误无法被检测到,更不要说纠正了。
BCH纠错纠正不了的错误怎么办?
当颗粒进入寿命末期之后,出错会越来越多,如果检测到超出了BCH纠错所能纠正的范围,也就意味着数据读取失败。当然,一次的读取失败不会打败现代的固态硬盘主控,主控会放出大招——Read Retry重试读取。
下面举个例子,用比较形象的方式形容Read Retry重试读取的过程:我们在去做视力检查的时候,医生会给我们指着视力对数表上的图形让我们辨别,当字越来越小时,我们看的就比较困难了。但这种情况下,我们还是会努力睁大眼睛去看(Read Retry,使劲再看看),然后告诉再医生看到的结果(其实多半已经是猜测出来的结果了),这个时候医生会告诉你答对了还是答错了(医生就像BCH算法,能够检测出读取出来的数据是否有错误)。
还回到上面那个视力检查的例子中,如果医生发现我们的视力的确是坏掉了(近视了..类似颗粒进入寿命末期,出错越来越多),就会开始给我们配眼镜,通过添加和尝试不同的镜片让我们戴上后再尝试识别视力对数表上的图形(近视的同学应该都经历过…镜片就像是Shift Read,调整尝试多组读取参数尝试读取),经过调整后就有可能将数据正确地读取出来。
除了上边的纠错方式之外,有些固态硬盘主控还会使用类似RAID阵列原理的数据冗余存储方式来保证在前边所述的纠错都失败时能最终保住盘上的数据。比如SandForce支持的RAISE特性和美光M500上所使用的RAIN(Redundant Array of Independent NAND,独立NAND冗余阵列)。当然这些也是以消耗固态硬盘可用容量作为代价的,目的就是为数据安全树立最后一道屏障。
总结:
BCH纠错是最基本的纠错方式,他能够检测到错误并在一定范围内修正错误。如果BCH纠错无法解决则尝试Read Retry重试读取,重试读取还包括调整读取参数的Shift Read,当这些都无法纠正错误时,RAISE/RAIN这类冗余纠错措施将是最后一道防线(这道防线不是所有固态硬盘都具备)。纠错算法是有一定额外开销的,比如对于三星840Evo的掉速BUG,现在最为可能的原因就是三星为了提升TLC闪存在耐久度测试中的表现,降低了后台数据刷新的频率,出错增多后依靠Read Retry来强行读取,重试读取次数过多导致读取速度的下降。
【本文由易迅网达人“ 钟楼叔叔 ”原创,转载请获得易迅授权。】
欢迎关注玩出范儿微信公众号(wanchufaner),无人机、小米平衡车各种福利等你来拿!
关注后回复下列序号查看精彩文章:
回复3: 给跪了,牛人DIY, 吊炸天的小米手环新玩法
回复9: 80后香港夫妻用黑科技爆改28㎡蜗居成豪宅,大赞!
回复10: 奶爸拆光了120㎡精装修,给女儿造了个游乐场 !返回搜狐,查看更多