本帖最后由 haierccc 于 2012-5-28 16:30 编辑
研究SSD这么长时间了,长时间对Trim的作用不明所以,接触本论坛以后,终于有所领悟,我说说我对Trim的理解吧。
不管是FAT16,FAT32,还是NTFS,在删除文件的时候,仅仅是在文件系统的数据结构里,给文件对应的“簇”打上删除标记,声明“此簇已经被释放”。也就是磁盘空间已经被回收,但是“簇”中的数据并不被删除。
下次有文件再次写入的时候,直接可以写入这些簇,对于磁盘的写入原理来说,写入新数据,和覆盖原有的旧数据是同时完成的,也就是说写入数据的同时除原有的数据(覆盖了)。
但是NAND闪存在写入的时候,必须要保证单元处于“空白”状态,也就是说不能有数据,如果有,必须要“删除”。所以SSD在写入空白块的时候有很快的速度,但是写入原来有数据的块时,要经历“删除旧数据”和“写入新数据”2个步骤,从而拖慢了速度(磁盘只有一个步骤)。
对于空白的SSD,肯定都是没有数据的,读写速度很快,当所有的空白块都写入以后,SSD就“脏”了。
这里的“写入”有2层含义,1是用户有用的数据,2是被删除的数据,因为如上文所述,数据被删除,仅仅是做了个标记而已,而SSD控制器并不理解这个标记(仅被操作系统所理解)。所以从SSD控制器来看,被删除的数据仍然占用NAND闪存空间,是“有用”的。
而Trim的存在就是为了让SSD控制器能够知道哪些数据是被删除的,在操作系统删除数据的时候,就告诉主控,如下这些这些数据是被删除的。主控听到以后,就会在内部给这些数据打上标记。这样在做GC的时候就不用把这些数据合并写入了(也就是直接删除)。
总之一句话:Trim的作用,是在GC的时候减少写入放大。
如果我的理解是正确的,那么又带来另一个问题
现在有主控宣称,哪怕操作系统不支持Trim,也可以做低写入放大的GC。如果这是真的,那主控从何知道,哪些数据是被删除的呢?
我认为,这就需要主控能够"理解"FAT32和NTFS的数据结构了。能够从二进制的层面上分析文件系统,从而判断出被删除的数据。 |