Есть заблуждение. Обрезка не вызывает дополнительных записей, она уменьшает их.
SSD, или, скорее, его NAND, имеет два понятия «блоков», один из которых фактически называется блоком (обычно что-то от 128k до 512k), а другой - гораздо ближе к тому, что вы имеете в виду, когда говорите о «блоке» в Термины вашей файловой системы называются страницами (обычно что-то около 4к). Вы можете написать полную страницу за раз, как на старом жестком диске, без проблем. Вещи просто работают, как ожидалось.
Однако вы не можете перезаписать страницу, они однократные. После этого вы можете только стереть его, сделав его снова доступным для записи. Это то, что имеет значение для жизни NAND. Проблема просто ... на самом деле вы не можете стереть страницы. Вы можете стирать только блоки (то есть кластеры по 32-64 страницы за раз).
Это означает, что когда вы перезаписываете страницу («блок» в терминах файловой системы), контроллер должен:
- читать в полном блоке
- если существует «девственный» или уже стертый блок, используйте этот
- в противном случае очистите тот же блок
- выписать полный блок, соответственно изменив содержимое перезаписанной страницы
- сделать некоторую неопределенную «магию», чтобы циклы стирания были равномерно распределены по всем блокам, предотвращая преждевременную смерть
Это несколько упрощено, но принцип таков. Умный контроллер может сделать что - то немного другое (например, ReMap страниц логически, заполнить все страницы, пока никто не останется, и как - то «запомнить», какие из них хорошие, а какие из них являются устаревшими, и т.д., и т.д.), но, в принципе, рабочий процесс, как описано выше.
Это проблема, поскольку мелкие записи являются обычным делом, поэтому вскоре у вас есть все блоки на диске, которые были записаны хотя бы один раз. Теперь, что может сделать контроллер? Немного. Он на самом деле не знает, что делает файловая система или что ожидается, поэтому он должен работать в наиболее консервативном предположении. То есть все и все, что когда-то было написано, должно быть сохранено.
TRIM решает эту проблему. Он сообщает контроллеру, что такой-то большой диапазон не используется, поэтому контроллер может также отказаться от него. Это ничего не пишет. Если вообще, он будет стирать только блоки (хотя, только один раз, а не каждый раз).
Поскольку вы сказали контроллеру, что не используете эти данные, он может рискнуть выбросить их без вреда. Теперь неожиданно снова доступны доступные для записи блоки без необходимости копировать данные и многократно стирать блоки. Что не только делает запись быстрее, но и уменьшает количество стираний, которые должны произойти.