Как файловая система атомарно записывает блок на диск?

PowerShell стал открытым в 2016 году. С тех пор он становится все более и более многоплатформенным. Исходный код доступен на GitHub , как и установочные пакеты для ряда UNIX-подобных систем.

6
28.04.2016, 12:07
3 ответа

Диск должен обеспечивать, чтобы сектор записывался атомарно. Размер сектора был 512 байт, а сегодня обычно составляет 4096 байт для больших дисков.

Чтобы не было проблем с частично записанными "блоками", важно записывать все в особом порядке.

Обратите внимание, что единственная причина, по которой в файловой системе может оказаться частично записанная часть - это отключение питания или что-то подобное.

Метод следующий:

  • Сначала записывается все содержимое файла и проверяется, что это сработало

  • Затем записываются метаданные и проверяется, что все структуры данных в метаданных умещаются в одном секторе диска и не пересекают границу сектора. Это важно, например, для имен файлов переменной длины в качестве содержимого каталога.

4
27.01.2020, 20:29

Это зависит от базовой технологии хранения.

Некоторое хранилище позволяет хранить блок определенного размера атомарно, обычно степень 2, которая составляет не менее 256 и обычно находится в диапазоне от 1 до 4 кБ. Если это так, то уровень файловой системы может заменить блоки на месте, при условии, что замена блока дает допустимое состояние системы. Это нормально при записи содержимого файла (Unix не дает для этого никаких гарантий атомарности), но не всегда при записи метаданных файловой системы.

Другой подход, который не требует какого-либо взаимодействия со стороны уровня диска (кроме знания того, что запись в блок не может повредить содержимое других блоков), заключается в том, чтобы никогда не стирать существующие блоки, а всегда записывать в блоки хранения, которые в настоящее время не в использовании. Если запись прошла успешно, то ссылку на этот блок можно добавить к другому блоку, заменив ссылку на более раннюю версию этого блока; блок, содержащий более раннюю версию, помечается как свободный. Это медленнее, поскольку обновление блока требует обновления другого блока, что, в свою очередь, требует обновления другого блока и т. Д. Рекурсия останавливается на блоке, для которого система хранит несколько копий; если при записи одной из копий происходит сбой, вместо них используются другие копии. Выбор правильной копии может быть сделан на основе сравнения большинства, если их три или более, или на основе контрольных сумм, если есть две копии.

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

(Примечание: этот ответ касается общих проблем реализации файловой системы, я не проверял, что на самом деле делают различные файловые системы на различных носителях в различных вариантах Unix.)

1
27.01.2020, 20:29

Обычно во всех современных операционных системах есть системный вызов для записи данных в файл (в Linux у нас есть write системный вызов).

И потому, что все системные вызовы должны быть атомарными. Таким образом, запись всего размера блока (с использованием только одного системного вызова) будет атомарной.

-2
27.01.2020, 20:29

Теги

Похожие вопросы