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


Транзакции

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

Сразу после своего создания транзакция может принимать журнальные записи новых пакетов. Транзакция прекращает прием новых пакетов, когда возникнет одна из следующий ситуаций:
- прошел определенный период времени (как правило, 5 секунд);
- в журнале не осталось свободных блоков для нового пакета.
Транзакция представлена дескриптором, имеющим тип transaction t. Самым важным его полем является t state, которое описывает текущее состояние транзакции.
Вообще говоря, транзакция может быть:
- завершенной — все записи журнала, включенные в транзакцию, были физически записаны в журнал. При восстановлении после сбоя программа e2fsck рассматривает каждую завершенную транзакцию журнала и записывает соответствующие блоки в файловую систему. В этом случае поле t_state содержит значение t_finished;
- незавершенной— хотя бы одна запись журнала, включенная в транзакцию, не была физически записана в журнал, либо новые записи журнала все еще добавляются в транзакцию. В случае сбоя системы образ транзакции, хранящийся в журнале, скорее всего, будет устаревшим. Следовательно, при восстановлении после сбоя программа e2fsck не доверяет незавершенным транзакциям в журнале и пропускает их. В этом случае поле t state содержит одно из следующих значений:
• t running — транзакция все еще принимает новые пакеты атомарных операций;
• t locked — транзакция не принимает новые пакеты атомарных операций, но некоторые из них еще не завершены;
• t flush— все пакеты атомарных операций завершены, но некоторые записи еще заносятся в журнал;
• t commit— все журнальные записи пакетов атомарных операций сохранены на диске, но транзакцию еще следует пометить как завершенную в журнале.

В любой момент журнал может содержать несколько транзакций, но только одна из них находится в состоянии t running, т. е. является активной транзакцией, которая принимает новые запросы на пакеты атомарных операций, выдаваемые файловой системой.
Несколько транзакций в журнале могут быть незавершенными, поскольку буферы, содержащие соответствующие записи журнала, могут быть еще не переписаны в журнал.

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

Предыдущая страница | 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...