18

При перемещении файла на один диск файл не копируется и не удаляется. Таблица, которая ссылается на файлы, только что обновлена. И, насколько я знаю, это не относится к двум дискам на жестком диске. Но твердотельные накопители разные, для каждого диска нет физического места. (источник)

Поэтому мой вопрос: что происходит, когда файл перемещается с одного диска на другой на одном и том же SSD, копируются ли байты и удаляются ли исходные данные, или обновляется какая-то таблица, тем самым уменьшая количество SSD?

Там уже дубликат вопрос здесь. Но оба ответа утверждают:

каждый раздел будет иметь свою собственную физическую область диска для себя

а также

Разделение жесткого диска фактически обозначает физические области для каждого раздела. [и в комментарии:] SSD - все еще жесткий диск, у него просто нет диска.

Насколько я знаю, это неправильно. Смотрите здесь.

Так, скажет ли мне кто-то, кто знает больше о твердотельных накопителях, если они верны в своих оценках, несмотря на свою ошибку?

2 ответа2

38

Насколько я знаю, это неправильно

Приведенное описание наполовину правильно, наполовину неправильно. Но это также наполовину неправильно для жестких дисков.

Разделение диска обозначает логические области для каждого раздела. ОС вообще не заботится о физическом расположении - она просто просит диск «прочитать логический блок # 31415926», и сам диск решает, где находятся данные. Это работает одинаково для магнитной и флэш-памяти.

Это на самом деле то же самое, что и с жесткими дисками за последние 20–25 лет: хотя в ранних операционных системах использовались места расположения физических цилиндров / головок / секторов, этого уже давно нет. Вы не знаете точно, где на каком блюде находится LBA # 1234. Жесткие диски даже автоматически перераспределяют поврежденные физические сектора, поэтому один и тот же LBA может внезапно считываться из совершенно другой физической области - как и в случае с твердотельными накопителями.

Таким образом, как с жесткими дисками, так и с твердотельными накопителями, ОС просто имеет диапазон LBA (например, 0–999999) для чтения и записи данных. Цель разделения состоит в том, чтобы выделить в нем поддиапазоны - например, раздел A получает 10–499999, раздел B получает 500000–999999. Каждый раздел имеет независимую файловую систему, и файловые системы внутри каждого раздела не могут ссылаться на данные вне его - они не могут пересекать границы раздела. (Например, раздел А не может иметь файл, данные которого хранятся в секторе # 600000.)

В результате все файлы, перемещающиеся из одного в другой, должны быть скопированы полностью.

(Тем не менее, теоретически ОС может попросить сам диск дублировать данные из одной области в другую (например, «скопировать LBA # 1234 в # 567890»), без необходимости копировать ее в основную память и затем обратно, и, конечно, это полностью обойдет границы раздела. Это может использовать, например, «слой трансляции флэш-памяти» SSD. Но на практике, насколько я знаю, это не сделано.)

9

То, что происходит, когда данные записываются на твердотельный диск, достойно нескольких статей (хорошее резюме здесь), потому что это очень сложно и зависит от базовой технологии. Короткая история заключается в том, что твердотельные накопители вообще не могут записать нулевые биты в память. Вместо этого они должны обнулить (стереть) целый раздел памяти, а затем они могут хранить данные после этого, просто записывая их в него. Обычно в эти дни они пишут блоки по 512 байт, но стирают страницу из 8 блоков, что составляет 4096. Это, а также тот факт, что каждый цикл записи / стирания вызывает некоторый физический износ памяти, а память со временем изнашивается, делает SSD сильно отличающимися от вращающихся магнитных HDD.

Кроме этого, диски SATA (и диски AFAIK SAS) не реализуют встроенную команду для копирования данных из одного сектора в другой. (Или, по крайней мере, в спецификации SATA или SAS этого не требуется, поэтому ОС не может рассчитывать на наличие такой команды) Таким образом, копирование файла через раздел будет включать чтение данных из одного сектора диска в память хоста, а затем запись их обратно на диск в другом секторе.

Это связано с тем, что в отношении ОС диск представляет собой набор пронумерованных логических секторов, и все, что он может сделать, - это читать из секторов и записывать в сектора. ОС не может сказать, чтобы диск переназначил секторы.

Кроме того, файловая система (HFS+, NTFS, ext3 и т.д.) Представляет собой набор структур данных, которые устанавливают порядок в наборе логических блоков. Эти структуры данных реализуют "файлы", "имена файлов", "каталоги", "разрешения" и т.д. Итак, да, когда вы перемещаете файл из одного каталога в другой, он не копируется; обновляются только данные файловой системы, указывающие, в каком каталоге находится файл.

Концепция раздела заключается в том, что он представляет собой набор логических секторов на диске, заявленных одной файловой системой. Следствием этого является то, что файловая система не может получить доступ к секторам за пределами своего раздела. В значительной степени это функция безопасности, но она также вытекает из того факта, что все структуры данных файловой системы построены вокруг учета каждого сектора диска, находящегося в собственности файловой системы, и нетрудно добавлять или удалять сектора к этим структурам. Вот почему вы должны запускать специальные подпрограммы для настройки размера раздела, а также почему файловые системы настаивают на работе на непрерывном наборе секторов.

Поэтому нецелесообразно и опасно реализовывать копию файла как просто перенос секторов из одной файловой системы в другую. На вращающемся магнитном диске это также было бы кошмаром производительности, потому что, хотя диск будет делать исключения для плохих секторов, в целом он обеспечивает физическое расположение секторов таким образом, чтобы оптимизировать скорость чтения и записи последовательно пронумерованных сектора.

Кроме того, две файловые системы могут не хранить данные на диске одинаковым образом, что означает, что замена секторов не будет работать, даже если это будет практично. Даже если они относятся к одним и тем же типам файловых систем, например NTFS, одна может использовать шифрование или сжатие, а другая нет, или оба могут шифровать данные, но с разными ключами. Не требуется, чтобы данные в файле были именно тем, что хранится на диске, все, что нужно сохранить, - это обратимое преобразование данных, чтобы файловая система могла получить данные файла, выполнив что-то с данные на диске. Таким образом, если обе файловые системы не используют одно и то же преобразование, простое переключение секторов не приведет к цели передачи данных файла.

По всем этим причинам для создателей ОС и разработчиков файловой системы слишком много работы и слишком мало выгоды для реализации функции, оптимизирующей перемещение по разделам для твердотельных накопителей. Таким образом, любое перемещение между разделами будет чтение и запись.

Внутри SSD это немного другая история. Хотя ОС не сообщала накопителю о том, что копирует данные из одного места в другое, запись на твердотельные накопители настолько дорогая (и сложная), что контроллеры твердотельных накопителей выполняют большую работу для минимизации операций записи. Некоторые SSD пытаются обнаружить, когда сектор, записываемый в хранилище, соответствует уже сохраненному сектору, и пометить этот физический фрагмент памяти как теперь отображающийся на 2 различных логических секторах, а не копировать его, делая на уровне внутреннего диска то, что ОС не смогла.

Но не рассчитывай на это.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .