6

И что происходит сбой системы во время записи вашего файла вашей программой?

Кроме того, так ли это, что когда ваша программа пишет в файл, она на самом деле записывает не напрямую на диск, а вместо этого в память?

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

В любом случае, как диск восстанавливает данные, независимо от того, записывает ли ваша программа непосредственно на диск или готовый файл копируется системой в различные места на диске?

2 ответа2

7

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

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

В любом случае, как диск восстанавливает данные, независимо от того, записывает ли ваша программа непосредственно на диск или готовый файл копируется системой в различные места на диске?

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

Вы можете прочитать о журнализированных файловых системах и транзакционных файловых системах.

Другие стратегии также возможны. Целые учебники доступны по файловым системам и отказоустойчивости.

Наконец, иногда файловая система не может восстановить ваш файл. Иногда это не может восстановиться вообще. Стратегии, которые я упомянул выше, являются ответом на те проблемы, о которых вы спрашиваете, и, насколько я знаю, они довольно эффективны для поддержания диска в согласованном состоянии. Старые файловые системы были не так хороши в этом, и если вы потеряли питание только во время записи диска, файл или весь диск могли быть скомпрометированы. Раньше был большой рынок утилит для восстановления дисков, таких как Norton Disk Doctor. Этот рынок, похоже, ослаб с появлением более надежных реализаций ОС, но некоторые из этих продуктов все еще доступны.

5

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

Википедия имеет это:

Чтобы предотвратить эту [потерю данных при сбое], журнализируемая файловая система выделяет специальную область - журнал, в которой она записывает изменения, которые она внесет, заблаговременно. После сбоя восстановление просто включает чтение журнала из файловой системы и воспроизведение изменений из этого журнала до тех пор, пока файловая система снова не станет согласованной. Таким образом, изменения называются атомарными (или неделимыми) в том смысле, что они либо: успешны (изначально успешно выполнены, либо полностью воспроизводятся во время восстановления), либо вообще не воспроизводятся (пропускаются, поскольку до этого они еще не были полностью записаны в журнал). произошла авария).

В Windows (Vista и далее) существует технология Volume Shadow Copy (VSS), которая заставляет файловую систему работать в режиме «копирования при записи», то есть при записи в файл этот старый файл не уничтожен, и фактически сохраняется нетронутым. Это позволяет восстанавливать после сбоев, но, что более важно, оно также позволяет получить доступ к последней стабильной версии файла в случае блокировки файла, и процессу (например, службе резервного копирования) необходимо прочитать этот файл.

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