Главная страница  Межпроцессное взаимодействие (состязание) 

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 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 [ 152 ] 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187

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

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

Номер блока

9 101112131415

Занятые блоки

Свободные блоки

Номер блока 012345678 9 101112131415

Занятые блоки

Свободные блоки

012345678 9 101112131415

Занятые блоки

Свободные блоки

012345678 9101112131415

Занятые блоки

Свободные блоки

Рис. 5.1 е. Состояния файловой системы: а - непротиворечивое; б - пропавший блок; в - дубликат блока в списке свободных блоков; г - дубликат блока данных



Другая возможная ситуация показана на рис. 5.16, в. Здесь мы видим блок номер 4, дважды появляющийся в списке свободных. (Дубликаты свободных блоков могут появиться лишь тогда, когда в файловой системе действительно применены списки свободных блоков; в случае битового массива это невозможно.) Решение этой проблемы также несложно: построить список свободных блоков заново.

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

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

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

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

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

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



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

Часто эти две операции, проверки блоков и проверки каталогов, для увеличения эффективности объединяют в один проход. Возможно также проведение и других проверок. Например, формат каталогов должен соответствовать определенным требованиям относительно г-узлов и АЗСП-имен. Если г-узел оказывается больше числа г-узлов на диске, это означает, что каталог поврежден.

Более того, у каждого г-узла могут оказаться значения режима доступа, являющиеся допустимыми, но странными, как, например, 0007. Такое значение совсем отказывает в доступе владельцу и его группе, но зато разрешает всем посторонним читать, писать и исполнять файл. Программа должна хотя бы сообщать обо всех файлах, предоставляющих сторонним пользователям больше прав, чем владельцам. Каталоги, содержащие, скажем, более 1000 описателей файлов, также подозрительны. Расположенные в каталогах пользователей файлы, владельцем которых является суперпользователь и у которых установлен бит SETUID, представляют собой потенциальную проблему безопасности, так как такие файлы при запуске любым пользователем приобретают полномочия суперпользователя. Список технически возможных, но необычных ситуаций, о которых программа должна информировать, можно продолжать довольно долго.

До сих пор мы обсуждали проблему защиты пользователя от сбоев. Некоторые файловые системы также пытаются защитить пользователя от самого себя. Если пользователь собирается ввести команду

гт *.о

чтобы удалить все файлы с расширением .о (созданные компилятором объектные файлы), но случайно вместо этого набьет строку

гт * .0

(обратите внимание на пробел после звездочки), программа rm удалит все файлы в текущем каталоге, после чего сообщит, что не может найти файл .о. В системе MS-DOS и некоторых других системах при удалении файла устанавливается всего лишь один бит в каталоге или г-узле, отмечая, что файл удален. Блоки диска не возвращаются в список свободных блоков до тех пор, пока они не понадобятся. Таким образом, если пользователь быстро обнаружит ошибку, он сможет восстановить удаленные файлы. В Windows удаленные файлы обычно помещаются в мусорную корзину , откуда их можно при необходимости из-

В MS-DOS первый символ имени удаленного файла заменяется символом 0хЕ5, а блоки-секторы, занимаемые файлом, освобождаются. Создаваемый после этого новый файл может занять эти блоки-секторы и запись в каталоге. Но сразу после удаления файл может быть восстановлен по сохранившемуся (кроме первого символа имени) описателю в каталоге. - Примеч перев.



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 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 [ 152 ] 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187

© 2000 - 2024 ULTRASONEX-AMFODENT.RU.
Копирование материалов разрешено исключительно при условии цититирования.