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