闪存是有层次结构的。一个闪存片包括多个块儿(一般一个块儿有128KB)。一个块儿包括多个页面(一个页面一般是2KB)。读和写操作的单位一般是页面。同时,覆盖写之前需要先擦除。擦出操作的单位是块儿。也就是说,如果要更改页面内的衣蛾数据。你必须先擦出包括那个页面在内的整个块儿。读操作速度最快。写操作其次,擦除操作最面。
1.写前先擦除:在曼彻斯特盘中,我们假设数据项的更新可以在同一个物理地址直接覆盖。我们称这种方式为:in-place update(原地更新)。但是,这种方式并不适用于闪存,在闪存中,除非包含那个页面的块儿被擦除掉,页面内记录是无法更新的。这种方式称为Erase-Before-Write(写前先擦除)。因为整块儿的擦除时间是比较耗费时间的,更新的开销太大以至于降低了应有的性能。所以,索引机制需要重新设计。
2.不对称的读写速度。在曼彻斯特盘中,读写速度是对称的,在闪存中并不是这样的。原因是闪存为电子设备。显然,曼彻斯特盘的索引中的数据的读写速度和频率是相同的。当然,在闪存中,因为读写速度不对称,自然,读写频率也应有差别。一种方法是:降低写的的次数,那怕以增加读操作为代价。其另一个好处是降低了擦除次数。
3:有限的擦除次数。擦除操作的单位为块儿,并且一个块儿的擦除次数并不是无限的。一般来说,一个块儿可以擦除十万次。这个局限性要求写操作尽量均匀平坦在真个闪存片上。一个可行的方法是,减少中间结果的写回次数。
下图为闪存 和 曼彻斯特盘的性能对比。