Борьба с авариями
Одним из требований, которым должна удовлетворять файловая система, является обеспечение устойчивости к различного рода авариям. Аварии можно классифицировать следующим образом: "мягкие аварии" - это отказы ОС, аппаратуры , остановы, зацикливания и т.д.,в результате чего происходит потеря содержимого оперативной памяти; "жесткие аварии" - это разрушение информации на дисках.
Последствия "мягких аварий" - рассогласование системной критической информации на внешней памяти. Для ликвидации последствий "мягких аварий" обычно используются системные обслуживающие программы, которые приводят в соответствие системную информацию.
Результат "жестких аварий" - утрата на внешней памяти отдельных объектов или целых поддеревьев. Основным методом борьбы с "жесткими авариями" является архивное копирование файловой системы .
Файловая система ОС ОМ устойчива к "мягким авариям": согласованное состояние критической информации поддерживается ФС без привлечения дополнительных обслуживающих программ.
ФС обладает определенной устойчивостью и по отношению к "жестким авариям": даже полная потеря информации на отдельном внешнем носителе не приводит к выходу из строя всей файловой системы, а только к частичной потери данных - тех файлов, которые располагались на этом внешнем устройстве.
Наиболее важные файлы можно явно дублировать на разных дисках. Предполагается, что "жесткие аварии" одновременно на двух внешних устройствах - событие маловероятное.
Остановимся подробнее на том, каким образом ФС обеспечивает устойчивость к авариям.
Отметим сначала, что критической информацией в ФС является таблица распределения свободной памяти на диске и справочники, содержащие таблицу отображения объектов ФС на внешнюю память. Рассогласование или потеря критической информации приводит к неприятным последствиям. Поэтому для повышения надежности таблица распределения свободной памяти хранится в двух экземплярах на диске, а справочники - в двух экземплярах на разных дисках.
Таким образом, при потере всей информации на отдельном диске структура файловой системы сохранится.
Сосредоточим теперь внимание на обеспечении согласованного состояния таблицы распределения свободной памяти и таблицы отображения объектов ФС на внешнюю память.
В начале работы таблица распределения свободной памяти переписывается с дисковой памяти в массовую память. В массовой памяти таблица хранится в двух экземплярах. Первый экземпляр - копия таблицы на диске - используется для обновления таблицы на диске (далее ее будем называть исходной), второй экземпляр - текущая таблица распределения - используется для удовлетворения всех запросов на дисковую память. Начальное состояние обеих таблиц одинаково.
Таблица распределения памяти на диске и таблица отображения объекта на внешнюю память изменяются, например, при увеличении размеров файла. Рассмотрим, какие действия при этом происходят.
После открытия файла таблица отображения файла на диски находится в таблице активных файлов задачи ОБМЕНМД. При увеличении размера необходимо расширить таблицу отображения. Задача АРХИВ производит поиск новой области приращений через текущую таблицу распределения памяти. После получения необходимой области таблица отображения в задаче ОБМЕНМД расширяется. До закрытия файла расширение файла может происходить неоднократно по той же схеме: поиск в текущей таблице распределения - наращивание таблицы отображения в задаче ОБМЕНМД. Одновременно такая же работа может происходить и с другими файлами для других задач: все запросы на расширение файлов проходят через текущую таблицу распределения памяти.
Изменения попадают в исходную таблицу, а затем на диск при закрытии файла. Закрытие файлов происходит строго синхронно. Команды закрытия выстраиваются в очередь к задаче АРХИВ в отличие от команд открытия, выполняемых параллельно.
Закрытие файла происходит следующим образом. АРХИВ получает таблицу отображения из задачи ОБМЕНМД. Исходную таблицу отображения получаем из элемента справочника, относящегося к модифицируемому файлу.
Сравнивая эти таблицы отображений, полу чаем все изменения, какие претерпел данный файл за время его обработки. Эти изменения заносятся в исходную таблицу распределения, и она отображается в таблицу распределения памяти на диск. На диске данная таблица хранится в двух экземплярах. Последовательные обновления таблицы распределения свободной памяти идут поочередно то в один экземпляр, то в другой. После очередного обновления таблицы распределения сохраняется и предыдущая версия таблицы. Для того, чтобы отследить хронологию, таблицы распределения помечаются уникальным идентификатором(в начале таблицы и в ее конце). Выработка уникальных идентификаторов ведется задачей АРХИВ. Уникальный идентификатор - это счетчик, устанавливающийся в нуль при генерации ФС и увеличивающийся на единицу при каждом запросе следующего идентификатора.
В состав таблицы распределения свободной памяти включена так называемая область согласованности, в которой хранятся имена объектов, обновление которых привело к отображению данной таблицы на внешнюю память. При закрытии файла в области согласованности будет храниться имя справочника, в котором описывается модифицированный файл.
После отображения на диск исходной таблицы с уникальным идентификатором, выработанным на момент закрытия, на диск будет отображен справочник закрываемого файла. Справочник также снабжается тем же самым уникальным идентификатором момента закрытия. Справочник отображается последовательно сначала в один дубль, потом в другой. После отображения справочника на внешнюю паямть таблица распределения свободной памяти и отображение файла в справочнике будут находиться в согласованном состоянии.
В случае отказов ОМ на любом из этапов работы с файлом система гарантирует согласованное состояние таблицы распределения памяти и таблицы отображения файла на диск без потери пространства на диске. Рассогласованным может оказаться лишь содержимое самого файла.
Рассмотрим более подробно те действия, которые осуществляет ФС в начале работы (после перевызова ОС).
Перед переносом таблицы распределения с диска в массовую память анализируются уникальные идентификаторы в обоих экземплярах. Если начальный идентификатор не совпал с конечным в одном из экземпляров, то это означает, что сбой произошел именно при отображении данной таблицы. Таблица восстанавливается из второго экземпляра и переносится в массовую память - система готова к работе.
Если в обеих таблицах начальные идентификаторы равны конечным, то из области согласованности таблицы с максимальным идентификатором выбираются все имена справочников (их может быть несколько (см. 3.3.8), участвующих в обновлении состояния файловой системы, и проверяются их уникальные идентификаторы. Возможны такие ситуации:
·
уникальные идентификаторы всех справочников во всех дублях равны идентификатору таблицы;
· все идентификаторы в первом дубле равны идентификатору таблицы;
· не все идентификаторы в первом дубле равны идентификатору таблицы;
· все идентификаторы в первом дубле не равны идентификатору таблицы.
В первом случае таблица и справочники согласованы. Во втором случае расходящиеся дубли справочников согласовываются (во вторые дубли записываются первые). Первый и второй случаи соответствуют новому согласованному состоянию системы. В качестве таблицы распределения берется таблица с максимальным идентификатором. В третьем и четвертом случаях рассогласованные дубли справочников восстанавлииваются по второму дублю и в качестве таблицы распределения берется таблица с минимальным уникальным идентификатором.
Приведенная схема распространяется и на произвольное число дисков. В этом случае в области согласованности хранятся кроме имен справочников имена тех дисков, в которых произошли изменения.
По такой же схеме осуществляется обработка файла в массовой памяти. При закрытии файла он будет отображаться из массовой памяти на старое место дисковой памяти, возможно, с увеличением пространства.
Используемый механизм позволяет поддерживать в согласованном состоянии критическую системную информацию, но не содержимое файлов. Однако, ФС ОС ОМ предоставляет дополнительные возможности, преодолевающие и этот недостаток.