Linux Kernel (Ядро линукса) (часть 3)


Записи журнала

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

Таким образом, записи журнала представлены в нем как обычные блоки данных (или метаданных). Каждый такой блок ассоциирован с небольшим тегом типа journai biock tag t, который содержит логический номер блока в файловой системе и несколько флагов состояния.

Впоследствии, когда слой журналирующего блочного устройства изучает буфер, либо потому что он принадлежит записи журнала, либо потому что это блок данных должен быть записан на диск до соответствующего блока с метаданными (в режиме ведения журнала "Упорядоченный”), ядро прикрепляет структуру journai head к голове буфера. В этом случае поле b private головы буфера содержит адрес структуры journai head и установленный флаг bh jbd

Пакеты атомарных операций

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

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

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

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

Каждый пакет атомарных операций представлен дескриптором, имеющим тип handie t. Чтобы начать атомарную операцию, файловая система Ext3 вызывает функцию слоя журналирующего блочного устройства, journai_ start о, которая выделяет, если необходимо, новый пакет атомарных операций и заносит его в текущие транзакции Поскольку любая дисковая операция низкого уровня может приостановить выполнение процесса, адрес активного пакета хранится в поле journai info дескриптора процесса. Для уведомления о завершении атомарной операции файловая система Ext3 вызывает функцию journai stop .

Предыдущая страница | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 | Следующая страница




Возможно, Вас также заинтересует:

ОС Knoppix - это Linux без про...

ВведениеЕсли вы цените свое время, умеете считать деньги и знаете стоимость информации, то эта книга...

Linux Kernel (Ядро линукса) (ч...

Спин-блокировкаСпин-блокировка необходима в многопроцессорной системе, потому что могут возникнуть...

Linux Kernel (Ядро линукса) (ч...

Копирование при записи В системах Unix первых поколений создание процесса было реализовано довольно...

Linux Kernel (Ядро линукса) (ч...

Буферы блоков и головы буферовУ каждого буфера есть дескриптор голова буфера, имеющий тип buffer...