Устойчивость к сбоям питания На самом
деле, неожиданное прекращение работы с ФС может произойти не только при
сбое питания, но и в следующих ситуациях:
- извлечении носителя из дисковода (подробнее об этом
см. далее);
- нажатии кнопки RESET нетерпеливым пользователем;
- фатальном аппаратном сбое;
- аппаратном сбое, который сам по себе не был фатальным,
но система не смогла правильно восстановиться, что привело к ее разрушению;
- разрушении системы из-за чисто программных проблем.
На практике часто сложно провести границы между тремя последними типами
сбоев. В качестве примера можно привести проблему, описанную в разд. Обмен
данными с пользовательским процессом. В системах класса ДОС последняя
причина возникает очень часто, поэтому в таких системах можно использовать
только устойчивые сбоям ФС.
В системах класса ОС "спонтанные" зависания происходят намного
реже Система, зависающая по непонятным или неустранимым причинам раз в
несколько дней, считается малопригодной для серьезного использования а
делающая это раз в месяц — подозрительно ненадежной. Поэтому в таких системах
можно позволить себе роскошь использовать неустойчивые к сбоям ФС. Тем
более что такие системы, как правило, обладают более высокой производительностью,
чем устойчивые ФС.
К тому же перед выключением системы, интегрированной в сеть, необходимо
уведомить всех клиентов и все серверы о разъединении. Только чисто клиентская
машина может быть выключена из сети без проблем. Поэтому на сетевых серверах
в любом случае необходима процедура закрытия системы
(shutdown). Так почему бы не возложить на эту процедуру еще и функцию
размонтирования ФС?
В системах же реального времени, которые по роду работы могут часто и
неожиданно перезапускаться, например, при отладке драйверов или программ,
осуществляющих доступ к аппаратуре, стараются использовать устойчивые
к сбоям ФС.
Хотя первая из перечисленных выше причин — извлечение носителя из дисковода
— не является "сбоем" даже в самом широком смысле этого слова,
с точки зрения ФС она мало чем отличается от сбоя. Поэтому на удаляемых
носителях, таких, как дискеты, можно использовать только устойчивые ФС.
Интересный альтернативный подход используется в компьютерах Macintosh
и некоторых рабочих станциях. У этих машин дисковод не имеет кнопки для
извлечения дискеты. Выталкивание дискеты осуществляется программно, подачей
соответствующей команды дисководу. Перед подачей такой команды ОС может
выполнить нормальное размонтирование ФС на удаляемом диске.
В узком смысле слова "устойчивость" означает лишь то, что ФС
после аварийной перезагрузки не обязательно нуждается в восстановлении.
Такие ФС обеспечивают целостность собственных структур данных в случае
сбоя, но, вообще говоря, не гарантируют целостности пользовательских данных
в файлах.
Нужно отметить, что даже если ФС считается в этом смысле устойчивой, некоторые
сбои для нее могут быть опасны. Например, если запустить команду DISKOPT
на "устойчивой" файловой системе FAT и в подходящий момент нажать
кнопку RESET, то значительная часть данных
на диске может быть навсегда потеряна.
С другой стороны, можно говорить об устойчивости в том смысле, что в ФС
после сбоя гарантирована целостность пользовательских данных. Достаточно
простого анализа для того чтобы убедиться, что такую гарантию нельзя обеспечить
на уровне ФС; обеспечение подобной целостности накладывает серьезные ограничения
и на программы, работающие с данными, а иногда оказывается просто невозможным.
Характерный и очень простой пример: архиватор InfoZip работает над созданием
архива. Программа сформировала заголовок файла, упаковала и записала на
диск около 50% данных, и в этот момент произошел сбой. В zip-архивах каталог
находится в конце архивного файла и записывается туда после завершения
упаковки всех данных. Обрезанный в случайном месте zip-файл не содержит
каталога и поэтому, безусловно, является безнадежно испорченным. Поэтому
при серьезном обсуждении проблемы устойчивости к сбоям говорят не о гарантии
целостности пользовательских данных, а об уменьшении вероятности их порчи.
Поддержание целостности структур ФС обычно гораздо важнее, чем целостность
недописанных в момент сбоя пользовательских данных. Дело в том, что если
при сбое оказывается испорчен создававшийся файл, это достаточно неприятно;
если же окажется испорчена файловая система, в худшем случае это может
привести к потере всех данных на диске, т. е. к катастрофе. Поэтому обычно
обеспечению целостности ФС при сбоях уделяется гораздо больше внимания.
Упоминавшаяся выше "врожденная" устойчивость к сбоям файловой
системы FAT объясняется тем, что в этой ФС удаление блока из списка свободных
и выделение его файлу производится одним действием — модификацией элемента
FAT (рис. 11.16). Поэтому если во время этой процедуры произойдет сбой
или дискета будет вынута из дисковода, то ничего страшного не случится:
просто получится файл, которому выделено на один блок больше, чем его
длина, записанная в каталоге. При стирании этого файла все его блоки будут
помечены как свободные, поэтому вреда практически нет.

Рис. 11.16. Модификация FAT
Нужно отметить, что при активном использовании отложенной записи FAT
и родственные ФС теряют это преимущество. Отложенная запись FAT является
единственным способом добиться хоть сколько-нибудь приемлемой производительности
от ФС с 32-битовым FAT. Поэтому, хотя Novell NetWare и использует ФС,
основанную на 32-битной FAT, после аварийной перезагрузки эта система
вынуждена запускать программу аварийною становления дисковых томов. Аналогичным
образом ведет себя и FAT3? Если же система хранит в одном месте список
или карту свободных блоков, а в другом месте списки блоков, выделенных
каждому файлу (рис. 11.17) как это делают HPFS или ФС систем семейства
Unix, то при прерывании операции выделения места в неподходящий момент
могут либо теряться блоки (если мы сначала удаляем блок из списка свободных—
рис. 11.18) либо получаться блоки, которые одновременно считаются и свободными,
и занятыми (если мы сначала выделяем блок файлу).
Первая ситуация достаточно неприятна, вторая же просто недопустима: первый
же файл, созданный после перевызова системы, будет "перекрещиваться"
с испорченным (рис. 11.19). Поэтому все ОС, использующие файловые системы
такого типа (системы семейства Unix, OS/2, Windows NT и т. д.), после
аварийной перезагрузки первым делом проверяют своп ФС соответствующей
программой восстановления.

Рис. 11.17. Модификация структур данных сложной ФС

Рис. 11.18. Потерянный блок

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