答案1
闪存设备(用于当今的 SSD)无法随时写入任意数据;写入之前必须先擦除一个单元(通常为 4KB)。不幸的是,擦除操作非常慢;这就是为什么闪存设备比磁盘驱动器慢得多,尽管没有移动部件。
现代 SSD 通过维护一组预擦除单元来隐藏擦除时间,这意味着写入命令不会立即覆盖现有数据,而是由驱动器的控制器选择一个已擦除的单元,重新映射它,并用新数据写入。这(以及几种写入缓存策略)为驱动器提供了巨大的速度大大超越了磁力驱动。
为了确保始终有一组预擦除的单元,任何时候不需要某个单元时,驱动器都会将其安排在后台擦除,并将其添加到费用单元列表中。
不幸的是,现有的文件系统不会费心告诉驱动器某个扇区何时空闲。毕竟,驱动器应该只是一个无意义的位存储库。从文件系统的角度来看,删除文件或将扇区标记为空闲的任何其他操作只是某些元数据结构上的标记。扇区本身没有受到影响。即使文件系统通过在其上写入零来清除它,驱动器也无法知道这是否意味着扇区空闲,或者用户是否想要在文件上写入一些零。一段时间后,驱动器在写入之前将没有任何空闲单元可以擦除;性能会大幅下降。
TRIM 指令很快就被起草出来并被目前维护的大多数文件系统采用。这是一个简单的信号,文件系统用它来告诉驱动器某个扇区的内容不再重要。一旦映射到单元上的所有扇区都空闲,SSD 控制器就会取消映射该单元并安排擦除。如果主机读取这些扇区,SSD 不会费心从闪存中获取,它会立即以零响应;但最重要的效果是始终补充预擦除单元列表。
不过,大多数 SSD 的容量都小于闪存的物理大小,有时甚至低至 75%。这样,即使在 100% 满载的系统中,它也可以保留一些未使用的单元,因此(覆盖)写入已使用的扇区仍然很快。
答案2
引入 TRIM 的目的是让操作系统(操作系统内的文件系统)能够通知 ATA 存储介质某个扇区不再被文件系统使用。这与写入磁盘无关。
TRIM 不保证扇区在介质上归零。但它保证当文件系统请求从该扇区读取时返回零(请注意,由于 SSD 知道扇区应该为零,因此无论介质中实际存储了什么,它都会返回零;虽然 SSD 通常确实会擦除内存,但可能可以从简单修剪过的磁盘中恢复数据)。
文件系统确实倾向于分散其写入(出于各种原因,从尝试写入均衡,到垃圾收集,再到随机化存储位置等等)。因此,如果介质不知道文件系统未使用哪些扇区,那么简单地写入零并不一定意味着该扇区未使用,然后它最终必须假设整个磁盘都在使用中。
对于 SSD,此假设意味着必须在写入时擦除扇区,从而降低写入速度;而不是在删除文件时擦除内存位置。与虚拟化系统中的虚拟磁盘文件类似,动态磁盘文件最终将包含虚拟磁盘的全部容量。如果虚拟化系统实施 TRIM,那么它将知道何时不再使用扇区,因此动态磁盘不需要跟踪该位置。