Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
спо_экзамен.docx
Скачиваний:
6
Добавлен:
27.09.2019
Размер:
3.3 Mб
Скачать

2 Кэш (быстродействующая память на основе sram)

ОП (на основе DRAM)

Внешняя (вторичная) память

~5-8нс

~10-20нс

кэш

Десятки мс

Объём (ёмкость) уменьшает- ся

Стоимость хранения

1 бита воз-

растает

СОП – сверхоперативная память;

ОП – оперативная (основная) память;

SRAM – статическое ЗУПВ (запоминающее устройство произвольной выборки – Random Acces Мemory);

DRAM – динамическое ЗУПВ

Рисунок 3.15 Иерархия памяти (memory hierarchy)

К программам и данным, хранящимся на первых трёх уровнях иерархии памяти (см. рисунок 3.15), ЦП может обращаться непосредственно; для того же, что бы ЦП мог обращаться к программам и данным, хранящимся во внешней памяти, их необходимо предварительно переписать в оперативную память. Часто СОП (сверхоперативная память) не рассматривают как память. Кэш-памятью или кэшем (cache, memory cache) называют ЗУ («быстрое» ЗУ), используемое в качестве буфера между ЦП и ОП в быстродействующих

168

системах (см. рисунок 3.15), а также другими устройствами в случае дисбаланса в их быстродействии (см. подраздел 3.8). Здесь кэш предназначен для выравнивания степени доступности устройств этих двух типов (регистров ЦП и ячеек ОП, которая выступает в роли «медленного» ЗУ) за счет врéменного хранения содержимого ячеек ОП. Основной задачей кэша является подкачка из ОП команд и данных, которые понадобятся в ближайшем будущем (это могут быть целые программы), и процессор читает их оттуда, а не из ОП. Кэш-память вносит в систему ещё один уровень обменов, однако разработчики систем, применяющие концепцию кэш-памяти, надеются на то, что затраты, связанные с перезаписью программ из ОП в кэш-память и обратно, окажутся гораздо меньше того выигрыша в быстродействии, который может быть получен благодаря сокращению времени выполнения программ, находящихся в кэш- памяти.

Оперативная, основная или первичная память (ОП, ОЗУ) (read/write memory, main memory, main stor, main storage, primary memory) ЗУ произвольной выборки (RAM), служащее основным хранилищем информации, подлежащей обработке, т.е. в нём хранятся машинные программы, порождающие последовательности операций, и данные, участвующие в эти операциях в качестве операндов. Иногда под первичной памятью понимают ту часть ОП, которая используется в качестве среды для хранения команд и данных, необходимых для текущего процесса (т.е. исполняемого на процессоре).

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

должна быть передана в ОП. По этой причине (и по причине более низкого по сравнению с ОП быстродействия) она используется как вспомогательное ЗУ.

Разные уровни памяти имеют разные объём, стоимость (хранения одного бита) и быстродействие (время доступа) (см. рисунок 3.15), причём эти три характеристики, как правило, для одного и того же устройства «удачно» не сочетаются. И если пользователю хотелось бы иметь и недорогую, и быструю память, то компромиссное решение этой проблемы представляет кэш-память

  1. Кэш-память и принцип её действия

3.8.1 В предыдущем подразделе мы упоминали о кэш-памяти как о типе

«быстрого» ЗУ, по иерархии стоящего выше ОП. Вообще же, кэш-память, или просто кэш (cache), это способ совместного функционирования двух типов

запоминающих устройств, отличающихся временем доступа и стоимостью хранения данных, который за счёт динамического копирования в «быстрое» ЗУ

169

наиболее часто используемой информации из «медленного» ЗУ позволяет, с одной стороны, уменьшить среднее время доступа к данным, а с другой стороны, экономить более дорогую быстродействующую память.

Неотъемлемым свойством кэш-памяти является её прозрачность для программ и пользователей. Это значит, что система не требует никакой внешней информации об интенсивности использования данных; ни пользователи, ни программы не принимают никакого участия в перемещении данных из ЗУ одного типа в ЗУ другого типа, всё это делается автоматически системными средствами.

Кэширование это универсальный метод, пригодный для ускорения доступа к ОП, к диску и к другим видам ЗУ. Если кэширование применяется для уменьшения среднего времени доступа к ОП, то в качестве кэша используется быстродействующая статическая память. Если кэширование используется системой ввода-вывода для ускорения доступа к данным, хранящимся на диске,

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

3.8.2 Одна из возможных схем кэширования представлена на рисунке 3.16.

Содержимое кэш-памяти представляет собой совокупность записей обо всех загруженных в неё элементах данных из основной памяти. При каждом

обращении к основной памяти по физическому адресу просматривается

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

если данные обнаруживаются в кэш-памяти, т.е. произошло кэш- попадание (cache-hit), то они считываются из неё и результат передаётся источнику запроса;

если нужные данные отсутствуют в кэш-памяти, т.е. произошёл кэш- промах (cache-miss), то они считываются из ОП, передаются источнику запроса и одновременно с этим копируются в кэш-память.

Очевидно, что эффективность кэширования зависит от вероятности

попадания в кэш. Покажем это путём нахождения зависимости среднего времени доступа к ОП от вероятности кэш-попаданий. Пусть имеется основное ЗУ со средним временем доступа к данным t1 и кэш-память, имеющая время доступа t2,

170

Источник запросов к основной памяти (ОП)

Медленный ответ (кэш-промах)

Запрос ОП

Быстрый ответ (кэш-попадание)

Кэш

Структура кэш-памяти

Адрес данных в основной памяти

Данные

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

Записи

Рисунок 3.16 Схема функционирования кэш-памяти

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

t t1 (1 - p)

t 2 p

(t - t )p t

2 1

1

14243

0

[t 2 , t1 ] . (3.1)

Таким образом [см. (3.1)], среднее время доступа к данным в системе с кэш- памятью линейно зависит от вероятности попадания в кэш и изменяется (уменьшается) от среднего времени доступа в основное ЗУ t1 при р=0 до среднего времени доступа непосредственно в кэш-память t2 при р=1. Отсюда видно, что использование кэш-памяти имеет смысл только при высокой вероятности кэш- попадания.

3.8.3 Вероятность обнаружения данных в кэше зависит от разных факторов

– объёма кэша, объёма кэшируемой памяти, алгоритма замещения данных в кэше, особенностей выполняемой программы, времени её работы, уровня мультипрограммирования и других особенностей вычислительного процесса. Заметим, что в большинстве реализаций кэш-памяти процент кэш-попаданий оказывается весьма высоким свыше 90%. Такое высокое значение вероятности нахождения данных в кэш-памяти объясняется наличием у данных двух объективных свойств:

временнóй локальности если произошло обращение по некоторому

171

адресу, то следующее обращение по тому же адресу с большой вероятностью произойдет в ближайшее время;

пространственной локальностиесли произошло обращение по

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

Вначале работы системы, когда кэш-память ещё пуста, почти каждый запрос к основной памяти выполняется «по полной программе»: просмотр кэша, констатация промаха, чтение данных из основной памяти, передача результата источнику запроса и копирование данных в кэш. Затем, по мере заполнения кэша, в соответствии со свойством временнóй локальности возрастает вероятность обращения к данным, которые уже были использованы на предыдущем этапе работы системы, т.е. к данным, которые содержатся в кэше и могут быть считаны значительно быстрее, чем из основной памяти. Свойство пространственной

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

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

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

сквозная запись (write through) при каждом запросе к основной памяти, в том числе и при записи, просматривается кэш. Если данные по запрашиваемому адресу отсутствуют, то запись выполняется только в основную память. Если же данные, к которым выполняется обращение, находятся в кэше, то запись выполняется одновременно в кэш и в основную память;

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

вытеснении этих данных из кэша необходимо переписать их в основную память,

чтобы актуализировать устаревшее содержимое основной памяти.

172

В некоторых алгоритмах замещения предусматривается первоочередная выгрузка модифицированных, или, как ещё говорят, «грязных» данных. Модифицированные данные могут выгружаться не только при освобождении места в кэш-памяти для новых данных, но и в «фоновом режиме», когда система не очень загружена.

  1. Способы отображения основной памяти на кэш

3.9.1 При кэшировании данных из ОП широко используются две основные схемы отображения:

случайное отображение;

детерминированное отображение.

При случайном отображении элемент ОП в общем случае может быть размещён в произвольном месте кэш-памяти, причём он помещается туда

вместе со своим адресом в оперативной памяти. При каждом запросе к ОП

выполняется поиск в кэше, и критерием поиска выступает адрес ОП из запроса. Поскольку схема простого перебора для поиска нужных данных в кэше оказывается непригодной из-за недопустимо больших временных затрат, то для кэшей со случайным отображением используется так называемый ассоциативный поиск, при котором сравнение выполняется не последовательно с каждой записью кэша, а параллельно со всеми его записями (рисунок 3.17). Признак, по которому выполняется сравнение, называется тегом (tag). В данном случае тегом является адрес данных в ОП. Из-за дороговизны реализации ассоциативная кэш-память используется в тех случаях, когда для обеспечения высокого процента попадания достаточно небольшого объёма памяти.

В кэшах со случайным отображением вытеснение старых данных

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

Детерминированный способ отображения предполагает, что любой элемент ОП всегда отображается в одно и то же место кэш-памяти. В этом случае кэш-память разделена на строки, каждая из которых предназначена для хранения одной записи об одном элементе данных (в действительности запись в кэше обычно содержит несколько элементов данных) и имеет свой номер. Между номерами строк кэш-памяти и адресами оперативной памяти устанавливается соответствие «один ко многим»: одному номеру строки соответствует несколько (обычно достаточно много) адресов ОП. В качестве отображающей

функции может использоваться простое выделение нескольких разрядов из адреса оперативной памяти, которые интерпретируются как номер строки

173

Адрес в ОП из запроса

12345678

тег

Кэш-память

Адреса в

ОП (теги)

Данные

Управляющая информация

12345678

Искомые данные

Совпадение адреса

Рисунок 3.17 Ассоциативный поиск в кэше со случайным отображением

кэш-памяти (такое отображение называется прямым). Однако, поскольку в найденной строке могут находиться данные из любой ячейки ОП, младшие разряды адреса которой совпадают с номером строки, необходимо выполнить дополнительную проверку. Для этих целей каждая строка кэш-памяти дополняется тегом, содержащим старшую часть адреса данных в ОП. При совпадении тега с соответствующей частью адреса из запроса констатируется кэш-попадание (рисунок 3.18). Если же произошел кэш-промах, то данные считываются из ОП и копируются в кэш, причём если строка кэш-памяти при этом содержит другие данные, то последние вытесняются из кэша. Заметим, что процесс замещения данных в кэш-памяти на основе прямого отображения существенно отличается от процесса замещения данных в кэш-памяти со случайным отображением. Во-первых, вытеснение данных происходит не только в случае отсутствия свободного места в кэше, во-вторых, никакого выбора данных на замещение не существует.

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

группе на предмет совпадения старших частей адресов ОП. При промахе данные

174

Адрес в ОП из запроса

11100111010111 1101100011

Номер элемента

Прямой доступ к записи по номеру строки

Тег

(строки) кэш-памяти

Кэш

(делается в пер-

вую очередь)

11100111010111

Память тегов

Память данных

Искомые данные

00…0

Совпадение

Дополни- тельная проверка на совпа- дение тега

1101100011

11…1

Рисунок 3.18 Кэш-память с прямым отображением

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

  1. Задачи управления файлами и устройствами

4.1.1 Задачи подсистемы ввода-вывода

Подсистема ввода-вывода (Input-Output Subsystem) мультипрограммной

ОС при обмене данными с внешними устройствами компьютера должна решать

175

следующие задачи (первые четыре основные):

организация параллельной работы устройств ввода-вывода (I/O) и центрального процессора;

согласование скоростей обмена и кэширование данных (согласование скоростей работы ЦП, ОП и устройств I/O);

разделение устройств и данных между процессами;

обеспечение удобного логического интерфейса между устройствами и остальной частью системы;

поддержка широкого спектра драйверов с возможностью простого включения в систему нового драйвера;

динамическая загрузка и выгрузка драйверов;

поддержка нескольких файловых систем;

поддержка синхронных и асинхронных операций ввода-вывода.

Заметим, что любые операции по управлению вводом-выводом объявляются привилегированными и могут выполняться только кодом самой ОС. Причём в ряде ОС системный ввод-вывод имеет существенно более высокие привилегии, чем ввод-вывод задач пользователя.

4.1.2 Организация параллельной работы устройств ввода-вывода и процессора

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

определённую область терминала или записать в определённый сектор диска). Под управлением контроллера устройство может некоторое время выполнять свои операции автономно, не требуя внимания со стороны ЦП. Это время зависит от многих факторов – объёма выводимой информации, степени интеллектуальности управляющего устройством контроллера, быстродействия устройства и т.п. Даже самый примитивный контроллер, выполняющий простые функции, обычно тратит довольно много времени на самостоятельную реализацию подобной функции после получения очередной команды от процессора. Это же справедливо и для сложных контроллеров, так как скорость работы любого устройства ввода-вывода, даже самого скоростного, обычно существенно ниже скорости работы процессора.

Процессы, происходящие в контроллерах, протекают в периоды между выдачами команд (от ЦП) независимо от ОС. От подсистемы ввода-вывода

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

176

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

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

4.1.3 Согласование скоростей обмена и кэширование данных

При обмене данными всегда возникает задача согласование скорости.

Например, если один пользовательский процесс вырабатывает некоторые данные и передаёт их другому пользовательскому процессу через ОП, то в общем случае

скорости генерации данных и их чтения не совпадают. Согласование скорости

обычно достигается за счёт буферизации данных в ОП и синхронизации доступа процессов к буферу (см. рисунок В.3 и пункт 2.6.1).

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

качестве врéменного буфера можно было бы использовать оперативную память

её объёма может просто не хватить. Для таких случаев необходимо предусмотреть особые меры, и часто в качестве буфера используется дисковый файл, называемый также спул-файлом (от spool – шпулька, являющаяся буфером для ниток). Типичный пример применения спулинга (spooling) даёт организация вывода данных на принтер. Для печатаемых документов объём в несколько десятков мегабайт – не редкость, поэтому для их врéменного хранения (а печать каждого документа занимает от нескольких минут до десятков минут) объёма ОП явно недостаточно, и для промежуточного хранения данных используется диск.

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

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

177

Буферизация данных, кроме согласования скоростей работы ЦП и внешнего устройства, позволяет сократить количество реальных операций ввода-вывода за счёт кэширования данных (см. подраздел 3.8). Дисковый кэш является непременным атрибутом подсистем ввода-вывода практически всех ОС, значительно сокращая время доступа к хранимым данным. Дисковый кэш используется для ускорения обмена данными с дисковыми накопителями и располагается между слоем драйверов файловых систем и блок- ориентированными драйверами дисков. Буферный пул дискового кэша находится в системной области ОП. При поступлении запроса на чтение некоторого блока диспетчер дискового кэша просматривает свой буферный пул и если требуемый блок имеется в кэше, то диспетчер копирует его в буфер запрашивающего процесса. Операция ввода-вывода считается выполненной, хотя физического обмена с устройством не происходило, при этом выигрыш во времени доступа к файлу очевиден. При записи данные также попадают сначала в буфер, и только потом, при необходимости освободить место в буферном пуле или же по требованию приложения они действительно переписываются на диск. Операция же записи считается завершённой по завершении обмена с кэшем, а не с диском [так называемая отложенная запись (lazy write – «ленивая» запись, если переводить дословно)]. Данные блоков диска за время пребывания в кэше могут быть многократно прочитаны прикладными процессами и модулями ОС без выполнения операций ввода-вывода с диском, что также существенно повышает производительность ОС.

Кэширование или, точнее, буферизация данных при работе с диском,

повышая производительность подсистемы ввода-вывода, создаёт ряд проблем:

при использовании отложенной записи программа не знает, успешно ли завершилась физическая запись. Дело в том, что при работе с дисками один из

основных источников ошибок – физические ошибки диска. Однако, многие современные файловые системы поддерживают так называемый hotfixing («горячую починку») – механизм, обеспечивающий динамическую замену

«плохих» логических блоков на «хорошие», что в значительной мере компенсирует эту проблему;

если в промежутке между запросом и физической записью произойдёт сбой всей системы, то данные будут потеряны (это свойственно всем механизмам отложенной записи). Например, пользователь сохраняет отредактированный файл и, не дождавшись окончания физической записи, выключает питание – содержимое файла оказывается потеряно или повреждено. Если откладывается запись не только пользовательских данных, но и модифицированных структур файловой системы, ситуация ещё хуже: системный сбой может привести не только к потере данных, находившихся в кэше, но и к

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

178

данных на диске без отказа от использования отложенной записи;

выделение памяти под дисковый кэш: уменьшения кэша приводит к снижению производительности подсистемы ввода-вывода; увеличение же кэша отнимает память у пользовательских процессов. В системах с виртуальной памятью это может привести к увеличению дисковой активности за счёт увеличения объёма подкачки, что ведёт к снижению как дисковой, так и общей производительности системы. Здесь возникает вполне естественное желание возложить подбор размера кэша на саму систему, т.е. менять размер кэша динамически в зависимости от рабочей нагрузки. На практике часто также вводятся параметры, ограничивающие минимальный и максимальный размеры кэша. Вполне возможно, что низкая производительность Windows NT/2000/XP на машинах с небольшим объёмом памяти (ОП) объясняется вовсе не низким качеством реализации системы, а просто плохо сбалансированным динамическим кэшем.

4.1.4 Разделение устройств и данных между процессами

Устройства ввода-вывода могут предоставляться процессам как в монопольное, так и в совместное (разделяемое) использование. При этом ОС должна обеспечивать контроль доступа теми же способами, что и при доступе процессов к другим ресурсам вычислительной системы путём проверки прав пользователя или группы пользователей, от имени которых действует процесс, на выполнение той или иной операции над устройством. Например, определённой группе пользователей последовательный порт разрешено захватывать в монопольное владение, а другим пользователям это запрещено.

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

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

Одно и то же устройство в разные периоды времени может использоваться как в разделяемом, так и в монопольном режимах (хотя

существуют устройства, для которых обычно характерен один из этих режимов;

например, последовательные порты и алфавитно-цифровые терминалы чаще

179

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

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

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

4.1.5 Обеспечение удобного логического интерфейса между устройствами

и остальной частью системы

Практически все современные ОС поддерживают в качестве основы такого интерфейса файловую модель периферийных устройств, когда любое устройство выглядит для прикладного программиста последовательным набором байт, с которым можно работать с помощью унифицированных системных вызовов (например, read и write), задавая имя файла-устройства и смещение от начала последовательности байт. Для поддержания такого интерфейса подсистема ввода-вывода должна проделать немалую работу, учитывая разницу в организации операций обмена данными, например, с жёстким диском и графическим терминалом.

Привлекательность модели файла-устройства состоит в её простоте и унифицированности для устройств любого типа, однако во многих случаях для программирования операций ввода-вывода некоторого устройства она является

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

180

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

4.1.6 Поддержка широкого спектра драйверов и простота включения нового драйвера в систему

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

(именно в такой ситуации оказались пользователи первых версий OS/2, и это обстоятельство послужило в своё время не последней причиной сдачи позиций этой неплохой ОС в пользу богатой на драйверы ОС Windows 3.x).

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

ядра ОС (модулями подсистемы ввода-вывода, модулями системных вызовов, модулями подсистем управления процессами и памятью и т.д.), а с другой стороны с контроллерами внешних устройств. Поэтому существуют два типа интерфейсов:

интерфейс «драйвер-ядро» (DKI Driver Kernel Interface) должен быть стандартизован в любом случае;

интерфейс «драйвер-устройство» (DDI Driver Device Interface) имеет смысл стандартизировать тогда, когда подсистема ввода-вывода не разрешает драйверу непосредственно взаимодействовать с аппаратурой контроллера, а выполняет эти операции самостоятельно.

Экранирование драйвера от аппаратуры является весьма полезной функцией, так как драйвер в этом случае становится независимым от аппаратной платформы. Подсистема ввода-вывода может поддерживать

несколько различных типов интерфейсов DKI/DDI, предоставляя специфический интерфейс для устройств определённого класса.

181

Обычно подсистема ввода-вывода поддерживает большое количество системных функций, которые драйвер может вызывать для выполнения некоторых типовых действий (операции обмена с регистрами контроллера, ведение буферов для промежуточного хранения данных ввода-вывода, синхронизация работы нескольких драйверов, копирование данных из пользовательского пространства в пространство системы и т.д.). Для поддержки процесса разработки драйверов операционной системы обычно выпускается так называемый пакет DDK (Driver Development Kit), представляющий собой набор соответствующих инструментальных средств – библиотек, компиляторов и отладчиков.

  1. Динамическая загрузка и выгрузка драйверов

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

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

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

исключением (для некоммерческих версий UNIX), чем правилом. Кроме того, в этом варианте работающую предыдущую версию ОС необходимо остановить и заменить новой, а перерывы в работе ОС в некоторых применениях могут и не допускаться.

  1. Многослойная модель подсистемы ввода-вывода

4.2.1 Общая схема

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

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

4.2.1.2 Общий принцип многослойности для устройств определённого типа реализуется по-разному, со своим количеством слоёв и их функциями, причём ПО ввода-вывода делится не только на горизонтальные слои, но и на вертикальные.

Например, в подсистеме управления дисками (дисковой подсистемы) на верхнем уровне высокоуровневые драйвера реализуют блок-ориентированный интерфейс, на нижнем – аппаратные драйвера реализуют обмен блоками байтов с контроллерами дисковых устройств; в подсистемах управления графическими устройствами (мониторами, принтерами и плоттерами) и сетевыми адаптерами на верхнем уровне соответствующими драйверами реализуется байт- ориентированный интерфейс, а на нижнем – аппаратные драйвера осуществляют обмен байтами с соответствующими контроллерами внешних устройств. Естественно, к этому перечню можно добавить и другие, например подсистему управления символьными терминалами или какими-либо специализированными устройствами, такими как аналого-цифровые и цифро-аналоговые преобразователи (соответственно АЦП и ЦАП).

4.2.2 Менеджер ввода-вывода

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

184

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

верхний слой менеджера поддерживает пользовательский интерфейс ввода-вывода, принимая от пользовательских процессов или модулей ядра ОС запросы на ввод-вывод и переадресуя их отвечающим за определённый класс устройств модулям и драйверам, а также возвращает процессам результаты операций ввода-вывода;

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

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

сведения об источнике запроса;

менеджер ввода-вывода осуществляет передачу сообщений об ошибках,

если таковые происходят в процессе управления операциями ввода-вывода;

менеджер ввода-вывода посылает сообщения о завершении операций ввода-вывода запросившей эту операцию задаче и снимает её с состояния ожидания ввода-вывода, если задача ожидала завершения операции (синхронный ввод-вывод);

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

менеджер ввода-вывода организует взаимодействие модулей ввода-

вывода с модулями других подсистем ОС, таких как подсистема управления

185

процессами, виртуальной памятью и другими.

4.2.2.2 В случае, если устройство ввода-вывода является инициативным, управление со стороны менеджера ввода-вывода будет заключаться в активизации соответствующего вычислительного процесса (переводе его в состояние готовности к выполнению). Инициативным называют такое устройство ввода-вывода, по сигналу прерывания от которого запускается соответствующая ему программа (обычно это не стандартное устройство ввода- вывода, а набор датчиков). Такая программа, с одной стороны, не является драйвером, поэтому ей не нужно управлять операциями обмена данными, но, с другой стороны, запуск такой программы осуществляется именно по событиям, связанным с генерацией устройством ввода-вывода соответствующего сигнала. Разница между драйверами, работающими по прерываниям, и инициативными программами заключается в их статусе. Драйвер является компонентом ОС и выполняется не как процесс, а как системный объект (ресурс), а инициативная программа является обычным вычислительным процессом, только её запуск осуществляется по инициативе внешнего устройства.

П р и м е ч а н ие – Примерами подобного менеджера являются менеджер ввода-вывода ОС Windows NT, а также среда STREAMS, существующая во многих версиях ОС UNIX. Менеджер ввода-вывода Windows NT организует взаимодействие между модулями с помощью пакетов запросов ввода-вывода – IRP (I/O Request Packet). Получив запрос от процедуры системного вызова, менеджер формирует IRP и передаёт его нужному драйверу. Драйвер после выполнения запрошенной операции возвращает ответ в виде другого IRP менеджеру, а тот, в свою очередь, может при необходимости передать этот IRP другому драйверу. Менеджер позволяет драйверам задавать взаимосвязи (bindings) между собой, и на основании информации о взаимосвязях и происходит передача пакетов IRP. Кроме того, менеджер ввода-вывода Windows NT поддерживает динамическую загрузку-выгрузку драйверов без останова системы.

4.2.3 Многоуровневые драйверы

4.2.3.1 Первоначально термин «драйвер» применялся в достаточно узком смысле: под драйвером понимался программный модуль, который:

входит в состав ядра ОС, работая в привилегированном режиме;

непосредственно управляет внешним устройством, взаимодействуя с его контроллером с помощью команд ввода-вывода компьютера;

обрабатывает прерывания от контроллера устройства;

предоставляет прикладному программисту удобный логический интерфейс работы с устройством, экранируя от него низкоуровневые детали управления устройством и организации его данных;

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

186

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

Согласно этому определению драйвер вместе с контроллером устройства и

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

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

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

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

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

Высокоуровневые драйверы оформляются по тем же правилам и придерживаются тех же внутренних интерфейсов, что и аппаратные драйверы.

187

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

4.2.3.3 Рассмотрим, как общие принципы построения многоуровневых драйверов могут быть реализованы при управлении определёнными типами внешних устройств. В качестве примера рассмотрим управление дисками. В

подсистеме управления дисками аппаратные драйверы поддерживают для верхних уровней представление диска как последовательного набора блоков одинакового размера, преобразуя вместе с контроллером номер блока в более сложный адрес, состоящий из номеров цилиндра, головки и сектора. Однако такие понятия, как «файл» и «файловая система», аппаратные драйверы дисков не поддерживают эти удобные для пользователя и программиста логические абстракции создаются на более высоком уровне программным обеспечением файловых систем, которое в современных ОС также оформляется как драйвер, только высокоуровневый. Наличие универсальной среды, создаваемой менеджером ввода-вывода, позволяет достаточно просто решить проблему поддержки в ОС нескольких файловых систем одновременно. Для этого в ОС устанавливается несколько высокоуровневых драйверов, например, драйверы файловых систем ufs, NTFS и FAT, работающих с общими аппаратными драйверами, но по-своему организующими хранение данных в блоках диска и по- своему представляющими файловую систему пользователю и прикладным процессам. Для унификации представления различных файловых систем в подсистеме ввода-вывода может использоваться общий драйвер верхнего уровня, играющий роль диспетчера нескольких драйверов файловых систем, например диспетчер VFS (Virtual File System), применяемый в ОС UNIX, реализованных на основе кода SVR4.

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

примером модуля, который чаще всего не оформляется в виде драйвера, является диспетчер окон графического интерфейса. Иногда этот модуль вообще выносится из ядра ОС и реализуется в виде пользовательского процесса. Таким образом был

188

реализован диспетчер окон (а также высокоуровневые графические драйверы) в Windows NT 3.5 и 3.51, но этот микроядерный подход заметно замедлял графические операции, поэтому в Windows NT 4.0 диспетчер окон и высокоуровневые графические драйверы, а также графическая библиотека GDI были перенесены в пространство ядра.

Аппаратные драйверы после запуска операции ввода-вывода должны своевременно реагировать на завершение контроллером заданного действия, и для решения этой задачи они взаимодействуют с системой прерываний. Драйверы более высоких уровней вызываются уже не по прерываниям, а по инициативе аппаратных драйверов или драйверов вышележащего уровня. Не все процедуры аппаратного драйвера нужно вызывать по прерываниям, поэтому драйвер обычно имеет определённую структуру, в которой выделяется секция обработки прерываний (ISR Interrupt Service Routine), которая и вызывается

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

4.2.3.4 В унификацию драйверов большой вклад внесла ОС UNIX. В ней все драйверы были разделены на два больших класса: блок-ориентированные (block- oriented) драйверы и байт-ориентированные (character-oriented) драйверы.

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

в ОП, а это обстоятельство значительно влияет на общую организацию ввода-

вывода для блок-ориентированных драйверов.

Устройства, с которыми работают байт-ориентированные драйверы, не адресуемы и не позволяют производить операцию поиска данных; они генерируют (или потребляют) последовательности байт. Примерами таких устройств, которые также называют устройствами последовательного доступа, служат терминалы (например, графические дисплеи), строчные принтеры, сетевые адаптеры.

Блок- или байт-ориентированность является характеристикой как самого устройства, так и драйвера. Очевидно, что если устройство не поддерживает обмен адресуемыми блоками данных, а позволяет записывать или считывать последовательность байт, то и устройство, и его драйвер можно назвать байт- ориентированными. Для байт-ориентированного устройства невозможно

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

189

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

Деление всех драйверов на блок-ориентированные и байт- ориентированные оказывается полезным для структурирования подсистемы управления вводом-выводом. Тем не менее, необходимо учитывать, что эта схема

является упрощённой – имеются внешние устройства, драйверы которых не относятся ни к одному классу, например таймер, который, с одной стороны, не содержит адресуемой информации, а с другой стороны, не порождает потока байт. Это устройство только выдаёт сигнал прерывания в некоторые моменты времени.

4.2.4 Специальные файлы

Понятие «специальный файл» впервые появилось в ОС UNIX. Специальный файл, называемый иногда виртуальным, связан с некоторым устройством ввода-вывода и представляет его (устройство) для остальной части ОС и прикладных процессов в виде обычного файла (см. пункт 4.3.1). Однако в отличие от обычного файла специальный файл не хранит статичные наборы данных (на дисках), а является интерфейсом к одному из аппаратных драйверов ОС.

Со специальным файлом можно работать так же, как и с обычным, т.е.

открывать, считывать из него определённое количество байт или же записывать в него определённое количество байт, а после завершения операции закрывать. Для этого используются те же системные вызовы, что и для работы с обычными файлами: open, create, read, write и close. Очевидно, что представление устройства в виде файла и использование для управления устройством файловых системных вызовов позволяет выполнять только простые операции управления, которые сводятся к передаче в устройство последовательности байт.

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

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

190

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

Концепция специальных файлов ОС UNIX была реализована во многих ОС, хотя для связи с драйверами в них часто используются механизмы, отличные от принятых в ОС UNIX. Так, в ОС Windows NT для связи виртуальных устройств (аналогов специальных файлов) с драйверами используется механизм объектов. При этом в объектах-устройствах имеются ссылки на объекты- драйверы, за счёт чего при открытии виртуального устройства система находит нужный драйвер.

  1. Логическая организация файловой системы

4.3.1 Цели и задачи файловой системы

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

Дадим некоторые определения файла. Файл (file дословно переводится с

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

Основными целями использования файлов являются:

долговременное и надёжное хранение информации – долговременность достигается за счёт использования ЗУ, не зависящих от питания (энергонезависимых ЗУ), а высокая надёжность определяется средствами защиты

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

191

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

Эти цели реализуются в ОС файловой системой. Файловая система (ФС)

включает:

совокупность всех файлов на диске;

наборы структур данных, используемых для управления файлами, такие, например, как каталоги файлов, дескрипторы файлов, таблицы распределения свободного и занятого пространства на диске;

специальное системное ПО, реализующее различные операции над файлами, такие как создание, уничтожение, чтение, запись, именование и поиск файлов, а также отвечающее за управление доступом к файлам и за управление

ресурсами, используемыми файлами; эту часть ФС часто называют системой управления файлами (СУФ).

Назначение СУФ предоставление более удобного доступа к данным, организованным как файлы, т.е. вместо низкоуровневого доступа к данным с указанием конкретных физических адресов нужной нам записи (номер сектора, дорожки и поверхности диска) используется логический доступ с указанием имени файла и записи в нём. Другими словами, СУФ отображает логическую модели файловой системы на физическую организацию хранилища данных. Благодаря системам управления файлами пользователям предоставляются следующие возможности:

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

пользователя с его данными и активно использующих систему управления файлами;

работа с недисковыми периферийными устройствами как с файлами

(специальные файлы см. пункт 4.2.4);

обмен данными между файлами, между устройствами, между файлом и устройством (и наоборот);

работа с файлами путём обращений к программным модулям СУФ

(часть API ориентирована именно на работу с файлами);

защита файлов от несанкционированного доступа (в многопользовательских ОС).

Как правило, все современные ОС имеют соответствующие СУФ, а некоторые из них (ОС) имеют возможность работать с несколькими файловыми системами (либо с одной из нескольких, либо сразу с несколькими одновременно).

В этом случае говорят о монтируемых файловых системах (монтируемую СУФ

можно установить как дополнительную), и в этом смысле они самостоятельны.

192

Следует заметить, что любая СУФ не существует сама по себе она разрабатывается для работы в конкретной ОС. В качестве примера можно привести всем известную файловую систему FAT (File Allocation Table – таблица размещения файлов), которая имеет множество реализаций как система управления файлами. Так, система, получившая это название и разработанная для первых персональных компьютеров, называлась просто FAT (сейчас её называют FAT12, где число 12 означает количество двоичных разрядов, используемых для указания адреса данных). Хотя её разрабатывали для работы с дискетами, некоторое время она использовалась при работе с жёсткими дисками. Потом её доработали для работы с жёсткими дисками бóльшего объёма, и новая реализация получила название FAT16.Это название файловой системы мы употребляем и по отношению к подсистеме управления файлами самой системы MS-DOS, однако реализацию системы управления файлами для OS/2, которая использует основные принципы системы FAT, называют super-FAT; основное отличие этой ФС – возможность поддерживать для каждого файла расширенные атрибуты. Есть версии системы управления файлами с принципами FAT и для Windows 95/98/ME, и для Windows NT/2000/XP и для других ОС (например, Linux). Таким образом, для работы с файлами, организованными в соответствии с некоторой ФС, для каждой ОС должна быть разработана соответствующая СУФ. И эта СУФ будет работать только в той ОС, для которой создана, но при этом обеспечит доступ к файлам, созданным с помощью СУФ другой ОС, но работающей по тем же принципам файловой системы.

  1. Логические и физические устройства

  2. Форматирование логических дисков

  3. Типы файлов

4.3.2.1 Файловые системы поддерживают несколько функционально различных типов файлов, в число которых, как правило, входят:

обычные файлы;

файлы-каталоги;

специальные файлы;

символические (символьные) связи;

именованные конвейеры;

отображаемые в память файлы и другие.

4.3.2.2 Обычные файлы, или просто файлы, содержат информацию произвольного характера, которую заносит в них пользователь или которая образуется в результате работы системных и пользовательских программ. Большинство современных ОС (например, UNIX, Windows, OS/2) никак не ограничивает и не контролирует содержимое и структуру обычного файла. Содержание обычного файла определяется приложением, которое с ним работает. Например, текстовый редактор создаёт текстовые файлы, состоящие из строк символов, представленных в каком-либо коде. Это могут быть документы,

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

193

часто имеют сложную внутреннюю структуру, например исполняемый код программы или архивный файл. Все ОС должны уметь распознавать хотя бы один тип файлов – их собственные исполняемые файлы.

4.3.2.3 Каталоги, папки (folder) или директории (directory) это особый тип файлов, которые содержат системную справочную информацию о наборе файлов, сгруппированных пользователями по какому-либо неформальному признаку (например, в одну группу объединяются файлы, содержащие документы одного договора, или файлы, составляющие один программный пакет). Во многих ОС в каталог (файл-каталог) могут входить файлы любых типов, в том числе другие каталоги, за счёт чего образуется древовидная структура, удобная для поиска. Каталоги устанавливают соответствие между именами файлов и их характеристиками, используемыми файловой системой для управления файлами. В число таких характеристик входит, в частности, информация (или указатель

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

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

4.3.2.5 Символическая связь (symbolic link или simlink) это фиктивный

файл, инод (см. подпункт 4.4.5.2) которого вместо указателей на блоки данных содержит текстовую строку имя того файла, с которым создана связь. Это может быть файл из другой ФС, в том числе и из такой, которая сама по себе не поддерживает символических связей, например, FAT, HPFS или файловый сервер Novell Netware. Такого файла может и вообще нет существовать, например, потому, что его уже удалили, или потому, что ФС, в которой он находится, не смонтирована, или просто потому, что имя было задано неправильно. Тогда попытка открыть символическую связь будут завершаться неудачей с кодом ошибки «файла не существует». Символические связи обеспечивают полную свободу в размещении и именовании файлов и присущи только ОС семейства UNIX.

4.3.2.6 Именованные конвейеры (named pipes) имеют имя, которое является записью в каталоге файловой системы ОС, поэтому они пригодны для

обмена данными между двумя произвольными процессами или потоками этих процессов (см. пункт 2.6.7). Именованный конвейер является специальным файлом типа FIFO и не имеет области данных на диске. Напомним, что

194

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

4.3.2.6 Отображаемые в память файлы позволяют работать с данными файла с помощью адресных указателей как с обычными переменными программы, без использования несколько громоздких файловых функций read, write и lseek. При отображении файлов в память широко используются механизмы подсистемы виртуальной памяти. Подсистема виртуальной памяти связывает некоторый сегмент виртуального адресного пространства процесса с некоторым файлом или частью файла. Отображение данных файла в память осуществляется с помощью системного вызова, который указывает, какую часть какого файла нужно отобразить в память, а также задаёт виртуальный адрес, с которого должен начинаться новый сегмент виртуальной памяти процесса (например, в ОС UNIX

SVR4 отображение файла в память выполняется с помощью системного вызова mmap). Подсистема управления виртуальной памяти создаёт по этому системному вызову новый сегмент процесса, в дескриптор которого помещает указатель на открытый отображаемый файл. При первом же обращении приложения по виртуальному адресу, принадлежащему новому сегменту, происходит страничный отказ, при обработке которого из отображаемого файла читается несколько блоков и данные из них помещаются в физическую страницу. В общем случае не все типы файлов можно отобразить в память, например в ОС UNIX SVR4 нельзя отображать каталоги и символьные связи, в то же время там допускается отображать не только обычные файлы, но и специальные. Отображение файла эффективней непосредственного использования файловых операций по следующим причинам:

исключаются операции копирования данных из системной памяти в

пользовательскую при выполнении файловых операций read и write данные сначала попадают в системный буфер, а затем копируются в пользовательскую память, а при отображении они сразу копируются в страницы пользовательской памяти;

программист применяет более удобный интерфейс, использующий адресные указатели;

уменьшается количество системных вызовов – при использовании

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

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

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

195

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

  1. Файлы-каталоги и их свойства

  2. Специальные файлы

  3. Символические связи

  4. Проецируемые в память файлы

  1. Атрибуты файлов

Понятие «файл» включает не только хранимые им данные и имя, но и атрибуты. Атрибуты (attributes) это информация, описывающая свойства файла. Приведём примеры возможных атрибутов файла:

тип файла (обычный файл, каталог, специальный файл и т.п.);

владелец файла;

создатель файла;

пароль для доступа к файлу;

информация о разрешенных операциях доступа к файлу;

времена создания, последнего доступа и последнего изменения;

текущий размер файла;

максимальный размер файла;

признак «только для чтения» (read only) показывает, что данный файл не подлежит изменению; этот атрибут в основном используется для примитивной защиты от пользовательских ошибок, т.е. он помогает избежать неумышленного удаления или изменения ключевых файлов;

признак «скрытый файл» (hidden) к скрытым относятся также файлы с установленным атрибутом «системный файл»;

признак «системный файл» (system) показывает, что файл является частью ОС или специально отмечен подобным образом прикладной программой, что иногда делается для защиты от копирования; большинство файлов,

отмечаемых в качестве системных, отмечаются также атрибутами

«скрытый» и «только для чтения»;

200

Файловая система 1

/(root)

dev usr home bin

tfy

rkl

man local

– каталог

Файловая система 2

/(root)

– обычный файл

– специальный файл-устройство

а

man1 man2

write susman

/(root)

dev usr home bin

tfy

rkl

man local

man1 man2

write susman

б

Рисунок 4.2 – Монтирование файловых систем: а – две ФС до монтирования; б – общая ФС после монтирования

201

признак «архивный файл» (archive) показывает, что файл был открыт программой таким образом, чтобы у неё была возможность изменить содержимое этого файла. Программы резервного копирования (архивирования) нередко сбрасывают его в ходе резервного копирования файла. Если применяется подобная методика, то в следующую создаваемую по порядку резервную копию будут добавлены только те файлы, в которых данный атрибут был установлен;

признак «двоичный/символьный»;

признак «временный» (удалить после завершения процесса);

признак блокировки;

длина записи в файле;

указатель на ключевое поле в записи;

длина ключа.

Набор атрибутов файла определяется спецификой файловой системы: в файловых системах разного типа для характеристики файлов могут

использоваться разные наборы атрибутов. Например, в ФС, поддерживающих

неструктурированные файлы, нет необходимости использовать три последних атрибута в приведённом списке, связанных со структуризацией файла. В однопользовательской ОС в наборе атрибутов будут отсутствовать характеристики, имеющие отношение к пользователям и защите, такие как владелец файла, создатель файла, пароль для доступа к файлу, информация о разрешенном доступе к файлу.

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

размер файла ему не разрешается.

Значения атрибутов файлов могут непосредственно содержаться в каталогах, как это сделано в файловой системе MS-DOS. Структура записи в каталоге длиной в 16 байт содержит простое символьное имя и атрибуты файла, располагаемые в двенадцатом байте.

Другим вариантом является размещение атрибутов в специальных таблицах, когда в каталогах содержатся только ссылки на эти таблицы. Такой подход реализован, например, в файловой системе ufs ОС UNIX. В этой ФС структура каталога очень простая. Запись о каждом файле содержит короткое символьное имя файла и указатель на индексный дескриптор файла, так называется в ufs таблица, в которой сосредоточены значения атрибутов файла.

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

атрибутов, делает систему более гибкой. Например, файл может быть легко включен сразу в несколько каталогов. Записи об этом файле в разных каталогах

202

могут содержать разные простые имена, но в поле ссылки будет указан один и тот же номер индексного дескриптора.

  1. Логическая организация файла

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

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

количество байт, которые необходимо считать или записать. Поступивший к приложению поток байт интерпретируется в соответствии с заложенной в программе логикой. Например, компилятор генерирует, а редактор связей воспринимает вполне определённый формат объектного модуля программы. При этом формат файла, в котором хранится объектный модуль, известен только этим программам. Подчеркнём, что интерпретация данных никак не связана с действительным способом их хранения в файловой системе. Модель файла, в соответствии с которой содержимое файла представляется неструктурированной последовательностью (потоком) байт, возникла вместе с ОС UNIX, а теперь она широко используется в большинстве современных ОС, в том числе в MS-DOS, Windows NT/2000/ХР, NetWare. Неструктурированная модель файла позволяет легко организовать разделение файла между несколькими приложениями: разные приложения могут по-своему структурировать и интерпретировать данные, содержащиеся в файле.

Другая модель файла, которая применялась в ОС OS/360, DEC RSX и VMS, а в настоящее время используется достаточно редко, – это структурированный файл. В этом случае поддержание структуры файла поручается файловой системе. Файловая система видит файл как упорядоченную последовательность логических записей. Приложение может обращаться к ФС с запросами на ввод-вывод на уровне записей, например «считать запись 25 из файла file.doc». ФС должна обладать информацией о структуре файла, достаточной для того, чтобы выделить любую запись. ФС предоставляет приложению доступ к записи, а вся дальнейшая обработка данных, содержащихся в этой записи, выполняется приложением. Развитием этого подхода стали системы управления базами данных (СУБД), которые поддерживают не только сложную структуру данных, но и взаимосвязи между ними.

4.3.7.2 Логическая запись является наименьшим элементом данных,

которым может оперировать программист при организации обмена с внешним

203

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

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

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

файловой системе, могут иметь различный размер.

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

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

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

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

Все вышесказанное в бóльшей степени относится к обычным файлам, которые могут быть как структурированными, так и неструктурированными. Что же касается других типов файлов, то они обладают определённой структурой, известной файловой системе. Например, ФС должна понимать структуру данных,

хранящихся в файле-каталоге или файле типа «символьная связь».

  1. Физическая организация файловой системы

4.4.1 Общие замечания

Представление пользователя о файловой системе как об иерархически организованном множестве информационных объектов имеет мало общего с

порядком хранения файлов на диске. Файл, имеющий образ цельного,

непрерывающегося набора байт, на самом деле очень часто разбросан

«кусочками» по всему диску, причем это разбиение никак не связано с логической структурой файла, например, его отдельная логическая запись может быть

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

описываются физической организацией файловой системы. Очевидно, что разные

файловые системы имеют разную физическую организацию.

4.4.2 Диски, разделы, секторы, кластеры

4.4.2.1 Основным типом устройства, которое используется в современных

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

стеклянных или металлических пластин, каждая из которых покрыта с одной или

двух сторон магнитным материалом. Таким образом, жёсткий диск в общем случае состоит из пакета пластин и его схема представлена на рисунке 4.3.

Рисунок 4.3 Схема устройства жёсткого диска

205

На каждой стороне каждой пластины размечены тонкие концентрические кольца – дорожки (traks), на которых хранятся данные. Количество дорожек зависит от типа диска. Нумерация дорожек начинается с 0 от внешнего края к центру диска. Когда диск вращается, элемент, называемый головкой, считывает двоичные данные с магнитной дорожки или записывает их на магнитную дорожку. Головка может позиционироваться над заданной дорожкой. Головки перемещаются над поверхностью диска дискретными шагами, каждый шаг соответствует сдвигу на одну дорожку. Запись на диск осуществляется благодаря способности головки изменять магнитные свойства дорожки. В некоторых дисках вдоль каждой поверхности перемещается одна головка, а в других – имеется по головке на каждую дорожку. В первом случае для поиска информации головка должна перемещаться по радиусу диска. Обычно все головки закреплены на едином перемещающем механизме и двигаются синхронно. Поэтому, когда головка фиксируется на заданной дорожке одной поверхности, все остальные головки останавливаются над дорожками с такими же номерами. В тех же случаях, когда на каждой дорожке имеется отдельная головка, никакого перемещения головок с одной дорожки на другую не требуется, за счёт этого экономится время, затрачиваемое на поиск данных.

Совокупность дорожек одного радиуса на всех поверхностях всех пластин пакета называется цилиндром {cylinder). Каждая дорожка разбивается на фрагменты, называемые секторами (sectors), или блоками (blocks), так что все дорожки имеют равное число секторов, в которые можно максимально записать одно и то же число байт. Сектор имеет фиксированный для конкретной системы размер, выражающийся степенью двойки. Чаще всего размер сектора составляет 512байт. Учитывая, что дорожки разного радиуса имеют одинаковое число секторов, плотность записи становится тем выше, чем ближе дорожка к

центру. Иногда внешняя дорожка имеет несколько дополнительных секторов, используемых для замены поврежденных секторов в режиме горячего резервирования. Сектор – наименьшая адресуемая единица обмена данными дискового устройства с ОП. Для того чтобы контроллер мог найти на диске нужный сектор, необходимо задать ему все составляющие адреса сектора: номер цилиндра, номер поверхности и номер сектора.

4.4.2.2 ОС при работе с диском использует, как правило, собственную единицу дискового пространства, называемую кластером (cluster). Кластер представляет собой один или несколько смежных секторов в логическом дисковом пространстве (точнее только в области данных). Кластер это минимальная адресуемая единица дисковой памяти, выделяемая файлу (или некорневому каталогу). Кластеры введены для того, чтобы уменьшить количество адресуемых единиц в области данных логического диска. При

создании файла место на диске ему выделяется кластерами. Например, если файл имеет размер 2560байт, а размер кластера в файловой системе определён в

1024байта, то файлу будет выделено на диске 3 кластера.

206

П р и м е ч а н ие – Иногда кластер называют блоком (например, в ОС Unix), что может привести к терминологической путанице. Вообще, терминология, используемая при описании форматов дисков и файловых систем, зависит от аппаратной платформы (RISC, Wintel и т.п.) и операционной системы. Это нужно учитывать и трактовать термины в зависимости от контекста.

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

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

4.4.2.3 Прежде чем форматировать диск под определённую ФС, он

может быть разбит на разделы. Раздел (partition) это непрерывная часть физического диска, которую ОС представляет пользователю как логическое устройство (используются также названия логический диск и логический раздел). Логическое устройство функционирует так, как если бы это был отдельный физический диск. Именно с логическими устройствами работает пользователь, обращаясь к ним по символьным именам, используя, например, обозначения А, В, С, SYS и т.п. ОС разного типа используют единое для всех них представление о разделах, но создают на его основе логические устройства, специфические для каждого типа ОС. На каждом логическом устройстве может создаваться только одна файловая система.

П р и м е ч а н ие – Во многих ОС используется термин «том» (volume). В разных ОС толкование этого термина имеет свои нюансы, но чаще всего он обозначает логическое устройство, отформатированное под конкретную файловую систему.

На разных логических устройствах одного и того же физического диска могут располагаться файловые системы разного типа. На рисунке 4.4 показан пример диска, разбитого на три раздела, в которых установлены две файловых системы NTFS (разделы С и Е) и одна файловая система FAT (раздел D).

Все разделы одного диска имеют одинаковый размер блока (сектора), определённый для данного диска в результате низкоуровневого форматирования. Однако в результате высокоуровневого форматирования в разных разделах одного

207

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

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

Рисунок 4.4 – Разбиение диска на разделы

4.4.3 Физическая организация и адресация файла

4.4.3.1 Важным компонентом физической организации ФС является физическая организация файла, т.е. способ размещения файла на диске. Основными критериями эффективности физической организации файлов являются:

скорость доступа к данным;

объем адресной информации файла;

степень фрагментированности дискового пространства;

максимально возможный размер файла.

Различают следующие способы физической организации файлов:

непрерывное размещение;

связанный список кластеров;

связанный список индексов;

перечень номеров кластеров.

4.4.3.2 Непрерывное размещение – простейший вариант физической организации, при котором файлу предоставляется последовательность кластеров диска, образующих непрерывный участок дисковой памяти. Основным

208

достоинством этого метода является высокая скорость доступа, так как затраты на поиск и считывание кластеров файла минимальны. Также минимален объём адресной информации достаточно хранить только номер первого кластера и объём файла. Данная физическая организация не ограничивает максимально возможный размер файла. Однако этот вариант имеет существенные недостатки, которые затрудняют его применимость на практике, несмотря на всю его логическую простоту. Например, какого размера должна быть непрерывная область, выделяемая файлу, если файл при каждой модификации может увеличить свой размер? Еще более серьёзной проблемой является фрагментация (речь идёт о фрагментации дисковой памяти, а не файла!). Спустя некоторое время после создания файловой системы в результате выполнения многочисленных операций создания и удаления файлов пространство диска неминуемо превращается в

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

памяти может быть очень большим, а выбрать место для размещения файла

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

4.4.3.3 Размещение файла в виде связанного списка кластеров дисковой памяти предполагает, что в начале каждого кластера содержится указатель на следующий кластер. В этом случае адресная информация минимальна: расположение файла может быть задано одним числом номером первого кластера. В отличие от предыдущего способа каждый кластер может быть присоединён к цепочке кластеров какого-либо файла, следовательно, фрагментация на уровне кластеров отсутствует. Файл может изменять свой размер во время своего существования, наращивая число кластеров. Недостатком является сложность реализации доступа к произвольно заданному

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

4.4.3.4 Связанный список индексов является некоторой модификацией предыдущего способа организации файла (см. подпункт 4.4.3.3) и применяется, например, в файловой системе FAT. Память файлу также выделяется в виде связанного списка кластеров. Номер первого кластера запоминается в записи каталога, где хранятся характеристики этого файла. Остальная адресная информация отделена от кластеров файла. С каждым кластером диска связывается некоторый элемент индекс. Индексы располагаются в отдельной

области диска в MS-DOS это таблица FAT (File Allocation Table), занимающая один кластер. Когда память свободна, все индексы имеют нулевое значение. Если

209

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

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

кластер целиком, а значит, имеют объем, равный степени двойки.

П р и м е ч а н ие – При отсутствии фрагментации на уровне кластеров на диске всё равно имеется определённое количество областей памяти небольшого размера, которые невозможно использовать, т.е. фрагментация всё же существует. Эти фрагменты представляют собой неиспользуемые части последних кластеров, назначенных файлам, поскольку объём файла в общем случае не кратен размеру кластера. На каждом файле в среднем теряется половина кластера. Это потери особенно велики, когда на диске имеется большое количество маленьких файлов, а кластер имеет большой размер. Размеры кластеров зависят от размера раздела и типа ФС. Примерный диапазон, в котором может меняться размер кластера, составляет от 512байт до десятков килобайт.

4.4.3.5 Ещё один способ задания физического расположения файла представляет собой перечень номеров кластеров, занимаемых этим файлом. Этот перечень и служит адресом файла. Недостаток данного способа очевиден: длина адреса зависит от размера файла и для большого файла может составить значительную величину. Достоинством же является высокая скорость доступа к произвольному кластеру файла, так как здесь применяется прямая адресация, которая исключает просмотр цепочки указателей при поиске адреса произвольного кластера файла. Фрагментация на уровне кластеров в этом способе также отсутствует.

Последний подход с некоторыми модификациями используется в традиционных файловых системах ОС UNIX s5 и ufs (современные версии UNIX поддерживают и другие типы ФС, в том числе и пришедшие из других ОС, как, например, FAT). Для сокращения объёма адресной информации прямой способ адресации сочетается с косвенным.

  1. Файловая система FAT (File Allocation Table)

4.4.4.1 Файловая система FAT (File Allocation Table таблица размещения файлов) получила своё название благодаря простой таблице, в которой

210

указываются:

непосредственно адресуемые участки логического диска, отведённые для размещения в них файлов или их фрагментов;

свободные области дискового пространства;

дефектные области диска (эти области содержат дефектные участки и не

гарантируют чтение и запись данных без ошибок).

Логический раздел иск), отформатированный под файловую систему

FAT, состоит из следующих областей (рисунок 4.5): системной области и

области данных.

BR ResSecs FAT1 FAT2(копия) RDir Каталоги и файлы

Системная область Область данных

Рисунок 4.5 Физическая структура логического диска в ФС FAТ

Системная область состоит из следующих компонентов (расположенных в логическом адресном пространстве друг за другом):

загрузочной записи (BR Boot Record), состоящей из двух частей: блока параметров диска (DPB Disk Parameter Block) и системного загрузчика (SB System Bootstrap). Она располагается в загрузочном секторе (512байт) для FAT12 и FAT16 или в трёх секторах для FAT32 (расширенная загрузочная запись). Блок параметров диска служит для идентификации физического и логического форматов логического диска, а системный загрузчик зависит от типа ОС, которая

будет загружаться из этого раздела;

зарезервированных секторов (ResSecs Reserved Sectors);

таблицы размещения файлов FAТ, содержащей информацию о размещении файлов и каталогов на диске (FAT1 основная копия; FAT2 резервная копия);

корневого каталога (RDir Root Directory), занимающего фиксированную область размером в 32 сектора (16Кбайт), что позволяет хранить 512 записей о файлах и каталогах, так как каждая запись каталога состоит из 32байт. Корневой каталог в FAT32 представлен в виде обычной цепочки кластеров, следовательно, он может находиться в произвольном месте диска, что снимает действовавшее раньше ограничение на размер корневого каталога (512 элементов).

211

Область данных логического диска содержит обычные файлы и файлы- каталоги (кроме корневого каталога); эти объекты образуют иерархию, подчинённую корневому каталогу. Подчеркнём, что ФС FAT поддерживает всего два типа файлов: обычный файл и каталог. Область данных, в отличие от системной области, доступна через пользовательский интерфейс ОС.

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

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

принимать следующие значения, характеризующие состояние связанного с ним кластера:

кластер свободен (не используется);

кластер используется файлом и не является последним кластером файла; в этом случае индексный указатель содержит номер следующего кластера файла;

последний кластер файла;

дефектный кластер;

резервный кластер.

Таблица FAT является общей для всех файлов раздела. В исходном состоянии (после форматирования) все кластеры раздела свободны и все индексные указатели (кроме тех, которые соответствуют резервным и дефектным блокам) принимают значение «кластер свободен». При размещении файла ОС

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

Для каждого файла и каталога в файловой системе хранится информация

в соответствии со структурой, представленной в таблице 4.1.

212

Таблица 4.1 Структура элемента каталога

Содержание поля

Размер поля данных, байт

Имя файла (формата «8.3») или каталога

11

Атрибуты файла

1

Резервное поле

1

Время создания

3

Дата создания

2

Дата последнего доступа

2

Зарезервировано

2

Время последней модификации

2

Дата последней модификации

2

Номер начального кластера в FAT

2

Размер файла

4

Всего

32

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

4.4.4.3 Размер таблицы FAT и разрядность используемых в ней индексных указателей определяется количеством кластеров в области данных. Для уменьшения потерь из-за фрагментации желательно кластеры делать небольшими, а для сокращения объёма адресной информации и повышения скорости обмена, наоборот, чем больше, тем лучше. При форматировании диска под файловую систему FAT обычно выбирается компромиссное решение и размеры кластеров выбираются из диапазона от 1 до 128 секторов, или от

512байт до 64Кбайт. Вообще, в современных ФС размеры кластеров ограничиваются (обычно от 512байт до 4Кбайт), либо предоставляется возможность выбирать размер кластера.

Очевидно, что разрядность индексного указателя должна быть такой, чтобы в нём можно было задать максимальный номер кластера для диска определённого объёма. Существует несколько разновидностей FAT, отличающихся разрядностью индексных указателей, которая и используется в качестве условного обозначения: FAT12, FAT16 и FAT32. В файловой системе FAT12 используются 12-разрядные указатели, что позволяет поддерживать до

212=4096 кластеров в области данных диска, в FAT16 16-разрядные указатели для 216=65536 кластеров. Реально это число кластеров немного меньше, так как несколько значений индексного указателя расходуется для идентификации специальных ситуаций, таких как «Последний кластер», «Неиспользуемый

213

кластер», «Дефектный кластер» и «Резервный кластер». Самое принципиальное отличие FAT32 от предыдущих версий заключается в том, что эта ФС намного эффективнее расходует дисковое пространство. Прежде всего, размер кластера в этой системе меньше, чем в предыдущих версиях, и даже для дисков размером до байт FAT32 может использовать кластеры размером в 4Кбайта. В результате по сравнению с дисками FAT16 экономится значительное дисковое пространство в среднем до 10-15%. В FAT32 проблема решается за счёт того, что собственно сама таблица размещения файлов в этой ФС может содержать

до 228 элементов.

П р и м е ч а н ие – В 32-разрядном слове FAT32, используемом для представления номера кластера, фактически учитываются только 28 разрядов, что приводит к тому, что размер таблицы размещения файлов в этой системе не может превышать 228 элементов.

Форматирование FAT12 обычно характерно только для небольших дисков объёмом не более 16Мбайт, чтобы не использовать кластеры более 4Кбайт. По этой же причине считается, что FAT16 целесообразнее для дисков с объёмом не более 512Мбайт, а для больших дисков лучше подходит FAT32, которая способна использовать кластеры 4Кбайт при работе с дисками объёмом до 8Гбайт и только для дисков бóльшего объёма начинает использовать 8, 16 и 32Кбайт. Максимальный размер раздела FAT16 ограничен 4Гбайт, такой объём даёт

65536 кластеров по 64Кбайт каждый, а максимальный размер раздела FAT32

практически неограничен 228 кластеров размером 32Кбайта.

4.4.4.4 Таблица FAT при фиксированной разрядности индексных указателей имеет переменный размер, зависящий от объёма области данных диска.

При удалении файла из ФС FAT в первый байт соответствующей записи

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

В связи с тем, что таблица FAT используется при доступе к диску очень

интенсивно, она обычно загружается в ОП (в буферы ввода-вывода или в кэш) и остаётся там настолько долго, насколько это возможно. Если таблица большая,

214

а дисковый кэш, напротив, относительно небольшой, то в памяти размещаются только фрагменты этой таблицы, к которым обращались в последнее время.

В связи с чрезвычайной важностью таблицы FAT она хранится в двух

идентичных экземплярах. Резервная копия FAT всегда синхронизируется с основной копией при любых операциях с файлами, используется же только первый экземпляр. Резервная копия может быть полезна только в том случае, когда секторы основной памяти оказываются физически повреждёнными и не читаются. Так, например, утилита проверки и восстановления файловой структуры ScanDisk из ОС Windows 9x при обнаружении несоответствия основной и резервной копии FAT предлагает восстановить главную таблицу, используя данные из копии. ФС FAT32 может использовать резервную копию FAT вместо основной (стандартной).

Используемый в FAT метод хранения адресной информации о файлах не

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

4.4.4.5 Файловые системы FAT12 и FAT16 оперировали с именами файлов, состоящими из 12 символов по схеме «8.3». В версии FAT16 ОС Windows NT был введён новый тип записи каталога «длинное имя» (LFN Long File Name), что позволяет использовать имена длиной до 255 символов, причём каждый символ длинного имени хранится в двухбайтном формате Unicode. Имя по схеме «8.3», названное теперь коротким (не нужно путать его с простым именем файла, также называемого иногда коротким), по-прежнему хранится в 11-байтовом поле имени файла в записи каталога, а длинное имя помещается порциями по 13 символов в одну или несколько записей, следующих непосредственно за основной записью

каталога, т.е. для длинного имени файла используется несколько элементов (записей) каталога. Каждый символ в формате Unicode кодируется двумя байтами, поэтому 13 символов занимают 26 байт, а оставшиеся 6 отведены под служебную информацию. Таким образом, у файла появляются два имени короткое, для совместимости со старыми приложениями, не понимающими длинных имён в Unicode, и длинное, удобное в использовании имя. Поскольку длинное имя может содержать до 255 символов, то всего один файл с длинным именем занимает до 25 элементов FAT (один элемент для имени формата «8.3» и ещё 24 для самого длинного имени). В этом случае количество элементов корневого каталога VFAT уменьшается до 21. Файловая система FAT32 также поддерживает короткие и длинные имена.

П р и м е ч а н ия

1 ФС VFAT (виртуальная система FAT) впервые появилась в Windows 3.11 (Windows for Workgroups). С выходом Windows 95 в VFAT добавилась поддержка длинных имён файлов при сохранении совместимости с исходным вариантом

215

FAT. Это означает, что наряду с длинными именами в ней поддерживаются имена формата «8.3», а также существует специальный механизм для преобразования имён формата «8.3» в длинные имена, и наоборот.

2 Длина полной файловой спецификации, включающей путь и имя файла (длинное или в формате «8.3»), тоже ограничивается 255 символами. ФС FAT32 успешно справляется с проблемой длинных имён в корневом каталоге, но проблема с ограничением длины полной файловой спецификации остаётся. По этой причине фирма Microsoft рекомендует ограничивать длинные имена

75-80 символами, чтобы оставить достаточно места для пути (175-180 символов).

Файловые системы FAT12 и FAT16 получили большое распространение благодаря их применению в ОС MS-DOS и Windows 3.x – самых массовых ОС первого десятилетия эры персональных компьютеров. По этой причине эти ФС поддерживаются сегодня и другими ОС, такими как UNIX, OS/2, Windows NT/2000/ХР и Windows 95/98. Однако из-за постоянно растущих объёмов жёстких дисков, а также возрастающих требований к надёжности, эти ФС быстро вытесняются как системой FAT32, впервые появившейся в Windows 95 OSR2, так и ФС других типов.

  1. Файловая система NTFS (New Technology File System)

4.4.6 Физическая организация NTFS

4.4.6.1 Файловая система NTFS (New Technology File System файловая система новой технологии) была разработана в качестве основной файловой

219

системы для ОС Windows NT в начале 90-х годов с учётом опыта разработки файловых систем FAT и HPFS (основная файловая система для OS/2), а также других существовавших в то время файловых систем. Основными отличительными свойствами NTFS являются:

поддержка больших размеров тома [в Windows NT логический раздел принято называть томом (volume)] и файлов объёмом до 16Эбайт (один экзабайт равен 260байт, или приблизительно 1 млрд. гигабайт), в то время как при работе ОС Windows NT/2000/XP диск с FAT16 не может иметь размер более

4Гбайт, а с FAT32 – 32Гбайт;

неограниченность количества файлов в корневом и некорневом каталогах;

встроенные средства сжатия для экономии дискового пространства,

причём сжатие можно применять как к отдельным файлам, так и целым каталогам и даже томам;

восстанавливаемость после сбоев и отказов программ и аппаратуры

управления дисками – система NTFS поддерживает различные механизмы проверки целостности системы, включая ведение журналов транзакций, позволяющих воспроизвести файловые операции по специальному системному журналу. При протоколировании файловых операций СУФ фиксирует в специальном служебном файле (журнале) происходящие изменения. В начале операции, связанной с изменением файловой структуры, делается соответствующая пометка. Если во время файловых операций происходит какой- нибудь сбой, то из-за упомянутой отметки операция остаётся помеченной как незавершённая. При выполнении процедуры проверки целостности файловой системы после перезагрузки машины эти незавершённые операции отменяются, и файлы возвращаются в исходное состояние. Если же операция изменения данных

в файлах завершается нормальным образом, то в файле журнала эта операция отмечается как завершённая. Для повышения надёжности введён механизм аварийной замены дефектных секторов резервными. Другими словами, если обнаруживается сбой при чтении данных, то система постарается прочесть эти данные, переписать их в специально зарезервированное для этой цели пространство диска, а дефектные сектора пометить как плохие и более к ним не обращаться;

высокая скорость операций, в том числе и для больших дисковпоскольку в основу структуры каталогов NTFS заложена эффективная структура данных, называемая «двоичным деревом», то время поиска файлов в NTFS не связано линейной зависимостью с их количеством (в отличие от систем на базе FAT);

низкий уровень фрагментации, в том числе и для больших дисков;

гибкая структура, допускающая развитие за счёт добавления новых типов записей и атрибутов файлов с сохранением совместимости с предыдущими версиями ФС;

220

поддержка длинных символьных имен;

контроль доступа пользователей к томам, каталогам и отдельным файлам, введение квотирования, при котором пользователи могут хранить свои файлы только в пределах отведённой им квоты на дисковое пространство.

4.4.6.2 Как и многие другие файловые системы, NTFS делит всё полезное дисковое пространство тома на кластеры блоки данных, адресуемые как единицы данных. ФС NTFS поддерживает размеры кластеров от 512байт до

64Кбайт; неким же стандартом считается кластер размером 2 или 4Кбайт. К сожалению, при увеличении размера кластера свыше 4Кбайт становится невозможным сжимать файлы и каталоги.

Всё дисковое пространство в NTFS делится на две неравные части

(рисунок 4.8):

первые 12% диска отводятся под так называемую зону MFT. Главная таблица файлов (MFT Master File Table) является основой структуры тома

NTFS и содержит, по крайней мере, одну запись для каждого файла тома,

включая одну запись для самой себя. Каждая запись MFT имеет фиксированную длину, зависящую от объёма диска, – 1, 2 или 4Кбайт (для большинства дисков, используемых сегодня, размер записи MFT равен 2 Кбайт, который мы далее будет считать размером записи по умолчанию). Первые 16 файлов (им соответствуют записи 0-15 таблицы MFT) носят служебный характер и недоступны через интерфейс ОС они называются метафайлами, причём самый первый метафайл (нулевая запись) это сам файл MFT. Запись каких-либо данных в зону MFT невозможна она всегда остаётся пустой, чтобы при росте MFT по возможности не было её фрагментации;

остальные 88% тома представляют собой обычное пространство файлов.

MFT

Зона MFT

Зона для размещения файлов и каталогов

Копия первых 16

записей MFT

Зона для размещения файлов и каталогов

Рисунок 4.8 Структура тома NTFS

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

221

надёжности, поскольку они очень важны) хранится в середине тома. Оставшаяся часть файла MFT может располагаться, как и любой другой файл, в произвольных местах диска восстановить его положение можно с помощью самого файла MFT. Для этого достаточно взять первую запись таблицы MFT.

Упомянутые первые 16 файлов NTFS (метафайлы) являются служебными; каждый из них отвечает за какой-либо аспект работы системы. Метафайлы находятся в корневом каталоге тома NTFS. Их имена начинаются с символа «$», хотя получить какую-либо информацию о них стандартными средствами сложно. В частности, можно узнать, например, сколько ОС тратит на каталогизацию тома, посмотрев размер файла $MFT.

4.4.6.3 Весь том NTFS состоит из последовательности кластеров, что отличает эту ФС от рассмотренных ранее, где на кластеры делилась только область данных. Порядковый номер кластера в томе NTFS называется

логическим номером кластера (LCN Logical Cluster Number,). Файл NTFS также состоит из последовательности кластеров, при этом порядковый номер кластера внутри файла называется виртуальным номером кластера (VCN Virtual Cluster Number,).

Базовая единица распределения дискового пространства для ФС NTFS непрерывная область кластеров, называемая отрезком. В качестве адреса отрезка NTFS использует логический номер его первого кластера, а также количество кластеров в отрезке k, то есть пара (LCN, k). Таким образом, часть файла, помещённая в отрезок и начинающаяся с виртуального кластера VCN, характеризуется адресом, состоящим из трёх чисел: (VCN, LCN, k).

Файл на томе NTFS идентифицируется так называемой файловой ссылкой (file reference), которая представляет собой 64-разрядный указатель. Файловая ссылка состоит из номера файла, который соответствует позиции

его файловой записи в таблице MFT, и номера последовательности. Этот способ идентификации файла близок к способу, используемому в файловых системах s5 и ufs, где файл однозначно идентифицируется номером его записи в области индексных дескрипторов.

Итак, все файлы тома представлены в таблице MFT. В этой структуре хранится вся информация о файлах: имя файла, размер, положение на диске отдельных фрагментов и т.д. Если для информации не хватает одной записи MFT, то используется несколько записей, причём не обязательно последовательных. Если файл имеет не очень большой размер, то данные файлы хранятся прямо в соответствующей записи таблицы MFT в оставшемся от служебных данных месте. Таким образом, файлы, занимающие не более сотни байтов, обычно не имеют своего «физического» воплощения в основной файловой области все данные таких файлов хранятся прямо в таблице MFT. В том же

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

222

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

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

Из приведенного описания видно, что сама таблица MFT

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

4.4.6.4 Каждый файл и каталог на томе NTFS состоит из набора

атрибутов [их ещё называют потоки данных (streams)]. Важно отметить, что имя файла и собственно данные файла также рассматриваются как его атрибуты, т.е. в трактовке NTFS кроме атрибутов у файла нет никаких других компонентов. Таким образом, получается, что оснóвой файла является номер записи в таблице MFT, а всё остальное, включая его атрибуты, не обязательно.

Каждый атрибут файла NTFS состоит из следующих полей: тип

атрибута, длина атрибута, значение атрибута и, возможно, имя атрибута. Тип атрибута, длина и имя образуют заголовок атрибута.

Имеется системный набор атрибутов, определяемых структурой тома NTFS. Системные атрибуты имеют фиксированные имена и коды их типа, а также определённый формат. Могут применяться также атрибуты, определяемые пользователями. Их имена, типы и форматы задаются исключительно пользователем. Так, файлу можно назначить атрибут, записав в него любые данные, например информацию об авторе и содержании файла, как это сделано в Windows 2000 (эта информация представлена на одной из вкладок диалогового окна свойств файла). Атрибуты файлов упорядочены по убыванию кода атрибута, причём атрибут одного и того же типа может повторяться несколько раз. Существуют два способа хранения атрибутов файла – резидентное хранение в записях таблицы MFT и нерезидентное хранение вне её, во внешних отрезках. Таким образом, резидентная часть файла состоит из резидентных атрибутов, а нерезидентная из нерезидентных атрибутов. Сортировка может осуществляться только по резидентным атрибутам.

Системный набор атрибутов файлов и каталогов в системе NTFS

представлен в таблице 4.2.

223

Таблица 4.2 Стандартные атрибуты файлов в системе NTFS

Системный атрибут

Описание атрибута

Стандартная информация (SI

– Standard Information)

Стандартная информация о файле: «только для

чтения», «скрытый», «системный»; отметки

времени, включая время создания, время

последней модификации, число каталогов,

ссылающихся на файл

Список атрибутов (AL – Attribute List)

Список атрибутов файла и ссылки на номер

записи MFT, где расположен каждый атрибут;

этот редко используемый атрибут нужен только в

том случае, если атрибуты файла не умещаются в основной записи и занимают дополнительные

записи MFT

Имя файла (FN – File Name)

Содержит длинное имя файла в формате Unicode,

а также номер входа в таблице MFT для

родительского каталога; если этот файл содержится в нескольких каталогах, то у него будет несколько атрибутов типа File Name; этот

атрибут всегда должен быть резидентным

Имя MS-DOS (MS-DOS Name)

Содержит имя файла в формате 8.3

Дескриптор безопасности (SD

– Security Descriptor)

Содержит информацию о защите файла: список

прав доступа ACL (Access Control List)) и поле аудита, которое определяет, какого рода операции

над этим файлом нужно регистрировать

Данные (Data)

Собственно данные файла, его содержимое

Битовая карта MFT (MFT

bitmap)

Карта использования блоков (кластеров) на томе

Корень индекса (IR – Index

Root)

Корень В-дерева, используемого для поиска

файлов в каталоге

Размещение индекса (IA –

Index Allocation)

Нерезидентные части индексного списка В-дерева

(используется для больших каталогов)

Примечание – Последние три атрибута используются только для каталогов

4.4.6.5 Файлы NTFS в зависимости от способа размещения делятся на файлы:

небольшие (small);

большие (large);

очень большие (huge);

сверхбольшие (extremely huge).

Если файл имеет небольшой размер, то он может целиком располагаться внутри одной записи MFT, имеющей, например, размер 2Кбайт. Небольшие файлы NTFS состоят, по крайней мере, из атрибутов,

представленных на рисунке 4.9 (см. также таблицу 4.2). Из-за того, что файл может иметь переменное количество атрибутов, а также из-за переменного размера атрибутов нельзя наверняка утверждать, что файл уместится внутри

224

записи. Однако обычно файлы размером менее 1500байт помещаются внутри записи MFT, размером 2Кбайт.

SI

FN

Data

SD

Записи MFT

Рисунок 4.9 Небольшой файл NTFS

Данные больших файлов не помещаются в одну запись МFТ, и этот факт отражается в заголовке атрибута Data, который содержит признак того, что этот атрибут является нерезидентным, т.е. находится в отрезках вне таблицы MFT. В этом случае атрибут Data содержит адресную информацию (LCN, VCN, k) (см. подпункт 4.4.6.3) каждого отрезка данных (рисунок 4.10).

SI FN

Data

VCN1 VCN2 VCN3

LCN1 LCN2 LCN3 SD

k1 k2 k3

Запись MFT

Отрезок данных 1

Отрезок данных 2

Отрезок данных 3

Рисунок 4.10 Большой файл NTFS

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

225

(рисунок 4.11). Сам атрибут данных по-прежнему содержит адреса нерезидентных отрезков данных.

SI

AL N=106

FN

SD

Data

VCN1,LCN1,k1; VCN2,LCN2,k2; VCN3,LCN3,k3;…; VCNm,LCNm,km

Отрезок данных 1

Отрезок данных 2

Отрезок данных 3

Отрезок данных m

25

Записи MFT

→106

Рисунок 4.11 Очень большой файл NTFS

Для сверхбольших файлов в атрибуте Attribute List можно указать несколько атрибутов, расположенных в дополнительных записях MFT (рисунок 4.12). Кроме того, можно использовать двойную косвенную адресацию, когда нерезидентный атрибут будет ссылаться на другие нерезидентные атрибуты, поэтому в NTFS не может быть атрибутов слишком большой для системы длины.

4.4.6.6 Каждый каталог NTFS представляет собой один вход в таблицу MFT, который содержит атрибут Index Root. Корень индекса содержит список файлов, входящих в каталог. Он позволяет сортировать файлы для ускорения поиска, основанного на значении определённого атрибута. Обычно в файловых системах файлы сортируются по имени. ФС NTFS позволяет использовать для сортировки любой атрибут, если он хранится в резидентной форме.

Имеются две формы хранения списка файлов:

небольшие каталоги (small indexes);

большие каталоги (large indexes).

226

AL

SI N1, N2, N3 FN SD

Data

Отрезки данных

Записи MFT

Data

Data

Рисунок 4.12 Сверхбольшой файл NTFS

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

SI

FN

IR

<a.bat, 26> <b.sys, 83>

<c.doc, Nc.doc> <####>

SD

#### – признак конца списка файлов

Рисунок 4.13 Небольшой каталог NTFS

227

По мере того как каталог растёт, список файлов может потребовать нерезидентной формы хранения. Однако начальная часть списка всегда остаётся резидентной в корневой записи большого каталога в таблице MFT (рисунок 4.14). Имена файлов резидентной части списка файлов являются узлами так называемого В-дерева воичного дерева). Остальные части списка файлов размещаются вне таблицы MFT. Для их поиска используется специальный атрибут Index Allocation, представляющий собой адреса отрезков, хранящих остальные части списка файлов каталога. Одни части списков являются листьями дерева, а другие являются промежуточными узлами, т.е. содержат наряду с именами файлов атрибут Index Allocation, указывающий на списки файлов более низких уровней.

SI

FN

IR

<f1.exe, Nf1.exe>

<ltr.exe, Nltr.exe >

<####>

IA

VCN1 VCN2 VCN3

LCN1 LCN2 LCN3

k1 k2 k3

SD

IR <avia.doc, Navia.doc>

<az.exe, Naz.exe>

<emax.exe, Nemax.exe> <####>

IR <gl.htm, Ngl.htm>

<green.com, Ngreen.com>

<caw.doc, Ncaw.doc> <####>

IR <main1.c, Nmain1.c>

<zero.txt, Nzero.txt> <####>

Рисунок 4.14 Большой каталог NTFS

Узлы двоичного дерева делят весь список файлов на несколько групп. Имя каждого файла-узла является именем последнего файла в соответствующей группе. Считается, что имена файлов сравниваются лексикографически, т.е. сначала принимаются во внимание коды первых символов двух сравниваемых имён, при этом имя считается мéньшим, если код его первого символа имеет

228

мéньшее арифметическое значение; при равенстве кодов первых символов сравниваются коды вторых символов имен и т.д. Например, файл f1.ехе, являющийся первым узлом двоичного дерева, показанного на рисунке 4.14, имеет имя, лексикографически большее имен avia.exe, az.exe,...,emax.exe, образующих первую группу списка имён каталога. Соответственно файл ltr.exe имеет наибольшее имя среди всех имён второй группы, а все файлы с именами, бóльшими ltr.exe, образуют третью и последнюю группу.

Поиск в каталоге уникального имени файла, которым в NTFS является номер основной записи о файле в MFT, по его символьному имени происходит следующим образом. Сначала искомое символьное имя сравнивается с именем первого узла в резидентной части индекса. Если искомое имя меньше, то это означает, что его нужно искать в первой нерезидентной группе, для чего из атрибута Index Allocation извлекается адрес отрезка (VCN1, LCN1, K1), хранящего имена файлов первой группы. Среди имён этой группы поиск осуществляется прямым перебором имён и сравнением до полного совпадения всех символов искомого имени с хранящимся в каталоге именем. При совпадении из каталога извлекается номер основной записи о файле в MFT, и остальные характеристики файла берутся уже оттуда.

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

В результате вместо перебора большого количества имён (в худшем случае

– всех имён каталога) выполняется сравнение с гораздо мéньшим количеством имён узлов и имён в одной из групп каталога.

  1. Файловые операции

4.5.1 Два способа организации файловых операций

4.5.1.1 ФС ОС должна предоставлять пользователям набор операций работы с файлами, оформленный в виде системных вызовов. Этот набор обычно состоит из таких системных вызовов, как creat (создать файл), read (читать из файла), write (записать в файл) и некоторых других.

Чаще всего с одним и тем же файлом пользователь выполняет не одну

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

При выполнении любой операции над файлом ОС должна выполнить ряд универсальных для всех операций действий:

229

а) по символьному имени файла найти его характеристики, которые хранятся в ФС на диске;

б) скопировать характеристики файла в ОП, так как только таким

образом программный код может их использовать;

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

г) очистить область ОП, отведённую под врéменное хранение характеристик файла.

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

например чтение определённого набора кластеров диска, удаление файла и т.п.

4.5.1.2 ОС может выполнять последовательность действий над файлом двумя способами (рисунок 4.15):

для каждой операции выполняются как универсальные, так и уникальные действия (см. рисунок 4.15,а). Такая схема иногда называется схемой без запоминания состояния операций (stateless);

все универсальные действия выполняются в начале и конце последовательности операций, а для каждой промежуточной операции выполняются только уникальные действия (см. рисунок 4.15,б).

open read1 close open read2 close open read3 close

а t

open read1 read2 read3 close

б t

Рисунок 4.15 Два способа выполнения файловых операций

Подавляющее большинство ФС поддерживает второй способ организации файловых операций как более экономичный и быстрый. Первый способ обладает одним преимуществом он более устойчив к сбоям в работе системы, так как каждая операция является самодостаточной и не зависит от результата предыдущей. Поэтому первый способ иногда применяется в распределённых сетевых ФС (например, в Network File System, NFS компании Sun), когда сбои из-

230

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

При втором способе в ФС вводятся два специальных системных вызова:

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

Далее основные системные вызовы файловых операций рассматриваются более детально на примере их реализации в ОС UNIX, в которой они приобрели

тот вид, который сегодня поддерживается практически всеми ОС.

4.5.2 Открытие файла

4.5.2.1 Системный вызов open в ОС UNIX работает с двумя аргументами: символьным именем открываемого файла и режимом открытия файла. Режим открытия говорит системе, какие операции будут выполняться над файлом в последовательности операций до закрытия файла по системному вызову close (только чтение, только запись или чтение и запись).

При открытии файла ОС сначала выполняет преобразование первого аргумента системного вызова, т.е. символьного имени файла, в его уникальное числовое имя, которым в традиционных файловых системах UNIX является номер индексного дескриптора (см. подпункт 4.4.5.2). По номеру индексного дескриптора inode ФС находит нужную запись на диске и копирует из неё характеристики файла в ОП. Для хранения копии индексного дескриптора

используются буферные области системного виртуального пространства. Характеристики индексного дескриптора, перенесённые в ОП, помещаются в структуру так называемого виртуального дескриптора vnode (virtual node). Структура vnode включает поля индексного дескриптора файла inode, а также несколько перечисленных ниже дополнительных полей, полезных при выполнении операций с файлом:

состояние индексного дескриптора в памяти, отражающее:

1) заблокирован ли файл;

2) ждёт ли снятия блокировки с файла какой-либо процесс;

3) отличается ли представление характеристик файла в памяти от своей дисковой копии в результате изменения содержимого индексного дескриптора;

4) отличается ли представление файла в памяти от своей дисковой

копии в результате изменения содержимого файла;

5) является ли файл точкой монтирования;

231

логический номер устройства ФС, содержащей файл;

номер индексного дескриптора – в дисковом индексном дескрипторе это поле отсутствует, так как номер определяется положением дескриптора относительно начала области индексных дескрипторов;

счётчик ссылок на данную структуру vnode.

4.5.2.2 С одним и тем же файлом одновременно могут работать различные процессы, но ОС не создаёт для каждого процесса отдельную копию структуры vnode, а для каждого файла, с которым в данный момент работает хотя бы один процесс, хранит ровно одну копию виртуального дескриптора. При очередном открытии файла ОС проверяет, имеется ли в системной памяти структура vnode открываемого файла (по номеру логического устройства и номеру индексного дескриптора, которые определяются при преобразовании символьного имени), и если имеется, то счётчик ссылок на неё увеличивается на

единицу. При очередном закрытии этого файла счётчик ссылок уменьшается на единицу, и если он становится равным 0, то буфер, хранящий данный vnode, считается свободным.

Для учёта индивидуальных характеристик каждого процесса, выполняющего некоторую последовательность операций с определённым файлом, в UNIX используется структура типа file, которая так же, как и vnode, хранится в системной области памяти. При каждом открытии процессом файла ОС проверяет права пользовательского процесса на выполнение запрошенной операции с файлом и, если проверка прошла успешно, создаёт в системной области памяти новую структуру file, которая описывает как открытый файл, так и операции, которые процесс собирается производить с файлом (например, чтение).

Структура file содержит следующие поля:

признак режима открытия (только для чтения, для чтения и записи и

т.п.);

указатель на структуру vnode;

текущее смещение в файле (переменная offset) при операциях

чтения/записи;

счётчик ссылок на данную структуру;

указатель на структуру, содержащую права процесса, открывшего файл

(эта структура находится в дескрипторе процесса);

указатели на предыдущую и последующую структуры file, связывающие все такие структуры в двойной список.

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

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

232

Прикладной программист может явно управлять положением указателя с помощью системного вызова lseek.

При каждом новом открытии какого-либо файла ОС создаёт новую

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

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

файлом.

Для открытия, например, файла /bin/prog1.ехе в режиме «только для чтения» прикладной программист может использовать следующее выражение на языке С:

fd=open("/bin/prog1.exe", 0_RDONLY);

Здесь fd – это целочисленная переменная, сохраняющая значение дескриптора открытого файла. Её значение должно использоваться в операциях обмена данными с файлом /bin/prog1.exe. При неудачной попытке открытия файла (нет прав для выполнения затребованной операции, неверное имя файла) переменной fd присваивается значение -1, которое является индикатором ошибки для всех системных вызовов UNIX.

Закрытие файла осуществляется с помощью системного вызова close:

close(fd);

4.5.3 Обмен данными с файлом

4.5.3.1 Для обмена данными с предварительно открытым файлом в ОС UNIX существуют системные вызовы read и write. В том случае, когда необходимо явным образом указать, с какого байта файла необходимо читать или записывать данные, используется также системный вызов lseek.

4.5.3.2 Системный вызов чтения данных из файла read имеет три аргумента:

read(fd,buffer,nbytes);

Первый аргумент fd является целочисленной переменной, имеющей значение дескриптора открытого файла (см. подпункт 4.5.2.3). Второй аргумент buffer является указателем на область пользовательской памяти, в которую система должна поместить считанные данные. Количество байт этой области памяти задаётся третьим целочисленным аргументом nbytes. Функция read

233

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

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

4.5.3.3 Вид системного вызова записи данных write аналогичен вызову

read:

write(fd,buffer,nbytes);

Функция write записывает nbytes из буфера ОП buffer в файл, описываемый

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

4.5.3.4 Все описанные системные вызовы являются синхронными, т.е. пользовательский процесс переводится в состояние ожидания до тех пор, пока операция ввода-вывода не завершится.

Описанный набор системных вызовов, появившийся в ОС UNIX еще в 70-х годах прошлого века, стал стандартом де-факто для современных ОС. Эти традиционные системные вызовы часто в конкретных ОС дополняются оригинальными системными вызовами ввода-вывода, например операциями асинхронного типа. На основе системных вызовов ввода-вывода обычно строятся более мощные библиотечные функции ввода-вывода, составляющие прикладной интерфейс ОС.

4.5.4 Блокировки файлов

4.5.4.1 Блокировки файлов и отдельных записей в файлах являются средством синхронизации между работающими в кооперации процессами, пытающимися использовать один и тот же файл одновременно. Приведём пример одновременного редактирования одного и того же документа несколькими пользователями, имеющими соответствующие права на доступ к файлу, содержащему этот документ. Если доступ к файлу не управляется блокировками, то каждый пользователь, который имеет право записи в файл, работает со своей копией данных файла. Результат такого редактирования непредсказуем – он зависит от того, в какой последовательности записывали изменения в файл применяемые пользователями приложения-редакторы.

4.5.4.2 Многопользовательские ОС обычно поддерживают специальный системный вызов, позволяющий программисту установить и проверить блокировки на файл и его отдельные области. В UNIX такой системный вызов

называется fcntl. В его аргументах указывается дескриптор файла, для которого нужно установить или проверить блокировки (блокирование или проверка), тип

234

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

При проверке наличия блокировок, установленных другими процессами,

вызов fcntl немедленно возвращает управление с сообщением результата. При установке блокировки можно задать два режима работы системного вызова:

с переходом процесса в состояние ожидания в том случае, если блокировку установить невозможно (синхронный системный вызов);

с немедленным возвратом в такой ситуации с сообщением отрицательного результата (асинхронный системный вызов).

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

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

4.5.4.3 В ОС UNIX существуют два режима действия блокировок:

консультативный (advisory);

обязательный (mandatory).

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

когда процесс делает системные вызовы read или write.

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

4.5.5 Стандартные файлы ввода-вывода, перенаправление вывода

  1. Синхронный и асинхронный ввод-вывод

  2. Перенаправление стандартного ввода и вывода.

4.5.5.1 В ОС UNIX в своё время были введены такие понятия, как стандартный файл ввода, стандартный файл вывода и стандартный файл ошибок. Эти три уже открытых файла существуют у любого пользовательского процесса с момента его возникновения. Процесс в любое время может организовать ввод данных из стандартного файла ввода, выполнив следующий системный вызов:

read(stdin, buffer, nbytes);

Здесь stdin предопределённое имя константы, обозначающей дескриптор

235

стандартного файла ввода.

Аналогично, так как stdout – предопределённое имя дескриптора стандартного файла вывода, процесс может вывести данные в стандартный файл вывода, применив следующий системный вызов:

write(stdout, buffer, nbytes);

За стандартным файлом ошибок закреплено имя stderr.

4.5.5.2 Фактически при создании нового процесса ОС помещает в его таблицу открытых файлов три записи:

а) с номером 0 для стандартного файла ввода (следовательно, stdin

всегда имеет значение 0);

б) с номером 1 для стандартного файла вывода (stdout=l); в) с номером 2 для стандартного файла ошибок (stderr=2). Соответственно создаются и три структуры типа file, на которые

указывают первые три записи таблицы открытых файлов процесса.

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

Модель стандартных файлов ввода-вывода рассчитана в основном на алфавитно-цифровые терминалы, управление которыми хорошо описывается потоком выводимых байт (поток отображается в виде строк символов на экране) и потоком вводимых байт (поток порождается последовательными

нажатиями клавиш).

4.5.5.3 Наиболее известной программой, широко использующей стандартные файлы ввода-вывода, является интерпретатор команд, называемый также оболочкой (shell) ОС. Интерпретатор постоянно читает вводимые пользователем с клавиатуры команды (из стандартного файла ввода) и либо выполняет их самостоятельно (с помощью своих внутренних команд), либо интерпретирует команду как имя исполняемого файла на диске, который необходимо запустить на выполнение в качестве отдельного процесса (внешние команды). Сообщения интерпретатор выводит на экран терминала – стандартный файл вывода.

Стандартные файлы ввода и ввода широко используются не только интерпретатором команд; но и самими командами. Многие внутренние и внешние команды устроены так, что они либо читают свои исходные данные из

стандартного файла ввода, либо выводят результаты в стандартный файл вывода. Если же команда делает то и другое, она называется фильтром.

236

Интерпретатор команд выполняет также такую важную функцию, как перенаправление стандартного ввода и вывода. Под этим понимается замена файла-терминала, используемого по умолчанию в качестве стандартных файлов ввода и вывода, на произвольный файл. Механизм перенаправления основан на том, что приложение не знает, какой именно файл является стандартным, а просто использует определённый дескриптор в качестве указателя на этот файл. Поэтому для перенаправления ввода-вывода достаточно создать процесс выполнения команды с нестандартной связью стандартной записи в таблице открытых файлов. Механизм перенаправления ввода-вывода, введённый ОС UNIX, получил широкое распространение в интерпретаторах команд многих ОС, например MS-DOS, Windows, OS/2.

Перенаправление осуществляется с помощью специальных конструкций командного языка (таблица 4.3).

Таблица 4.3 Средства перенаправления вводаывода в MS-DOS

Командный символ

Действие

Команда > имя_файла

Перенаправление в файл сообщений,

выводимых с помощью указанной команды (если файл уже существовал, то он заменяется новым)

Команда >> имя_файла

Перенаправление в файл сообщений,

выводимых с помощью указанной команды

(если файл уже существовал, то сообщения добавляются в конец этого файла)

Команда < имя_файла

Чтение входных данных команды не с

клавиатуры, а из файла

Команда | команда

Передача сообщений, выводимых на экран

первой командой, в качестве входных данных для второй команды

П р и м е ч а н ие – Команды можно вводить в командной строке сеанса MS-

DOS. В пункте Выполнить главного меню Windows выполняются только внешние команды

Например, показанная ниже командная строка запишет данные о содержимом корневого каталога диска f в создаваемый на диске c файл с.txt:

dir f:\ > c:\c.txt

  1. Разрешения на доступ к каталогам и файлам

4.6.1 Объекты и субъекты доступа

4.6.1.1 Файлы и каталоги являются одним из видов разделяемых ресурсов,

доступ к которым должна контролировать ОС. Существуют и другие виды

237

ресурсов, с которыми пользователи работают в режиме совместного использования (принтеры, модемы, графопостроители и т.п.).

Во всех этих случаях действует общая схема: пользователи пытаются

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

дифференцированно по операциям, например, пользователю может быть разрешена операция чтения и выполнения файла, а операция удаления – запрещена.

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

У каждого объекта доступа существует владелец. Владельцем может

быть как отдельный пользователь, так и группа пользователей. Владелец объекта имеет право выполнять с ним любые допустимые для данного объекта операции. Во многих ОС существует особый пользователь (superuser, root, administrator), который имеет все права по отношению к любым объектам системы, не обязательно являясь их владельцем. Под таким именем работает администратор системы, которому необходим полный доступ ко всем файлам и устройствам для управления политикой доступа.

  1. Избирательный доступ к каталогам и файлам

  1. Мандатный доступ к каталогам и файлам

4.6.1.2 Различают два основных подхода к определению прав доступа:

избирательный доступ имеет место, когда для каждого объекта сам владелец может определить допустимые операции с объектами. Этот подход называется также произвольным (discretionary – предоставленный на собственное усмотрение) доступом, так как позволяет администратору и владельцам объектов определить права доступа произвольным образом, по их

желанию. По умолчанию администратор наделяется всеми правами;

мандатный доступ (mandatory обязательный, принудительный) это такой подход к определению прав доступа, при котором система наделяет

238

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

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

идти речь ниже.

  1. Механизмы контроля доступа к каталогам и файлам

4.6.2.1 Каждый пользователь и каждая группа пользователей обычно имеют символьное имя, а также уникальный числовой идентификатор. При выполнении процедуры логического входа в систему пользователь сообщает своё символьное имя и пароль, а ОС определяет соответствующие числовые идентификаторы пользователя и групп, в которые он входит. Вся идентификационные данные, в том числе имена и идентификаторы пользователей и групп, пароли пользователей, а также сведения о вхождении пользователя в группы хранятся в специальном файле (файл /etc/passwd в UNIX) или специальной базе данных (в Windows NT).

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

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

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

создание файла;

уничтожение файла;

открытие файла;

закрытие файла;

чтение файла;

239

запись в файл;

дополнение файла;

поиск в файле;

получение атрибутов файла;

установка новых значений атрибутов;

переименование;

выполнение файла;

чтение каталога;

смена владельца;

изменение прав доступа.

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

разрешённые операции (например, читать, писать, выполнять, создать).

Практически во всех операционных системах матрица прав доступа хранится

«по частям», т.е. для каждого файла или каталога создаётся так называемый список управления доступом (ACL – Access Control List), в котором описываются права на выполнение операций пользователей и групп пользователей по отношению к этому файлу или каталогу. Список управления доступа является частью характеристик файла или каталога и хранится на диске в соответствующей области, например в индексном дескрипторе inode файловой системы ufs. He все ФС поддерживают списки управления доступом, например, его не поддерживает файловая система FAT, так как она разрабатывалась для однопользовательской однопрограммной ОС MS-DOS, для которой задача защиты от несанкционированного доступа не актуальна.

Обобщённо формат списка управления доступом можно представить в

виде набора идентификаторов пользователей и групп пользователей, в котором для каждого идентификатора указывается набор разрешённых операций над объектом. Говорят, что список ACL состоит из элементов управления доступом (АСЕ – Access Control Element), при этом каждый элемент соответствует одному идентификатору. Список ACL с добавленным к нему идентификатором владельца называют характеристиками безопасности.

  1. Индивидуальные разрешения на файлы и каталоги

  2. Стандартные разрешения на файлы и каталоги

  3. Специальные разрешения на файлы и каталоги

4.6.2.2 Рассмотрим более подробно организацию доступа в ОС Windows NT. Windows NT поддерживает три класса операций доступа, которые отличаются типом субъектов и объектов, участвующих в этих операциях:

разрешения (permissions) это множество операций, которые могут быть определены для субъектов всех типов по отношению к объектам любого типа: файлам, каталогам, принтерам, секциям памяти и т.д.;

права (user rights) определяются для субъектов типа группа на

выполнение некоторых системных операций: установку системного времени, архивирование файлов, выключение компьютера и т.п. В этих операциях участвует особый объект доступа ОС в целом. В основном именно права, а не

240

разрешения отличают одну встроенную группу пользователей от другой. Некоторые права у встроенной группы являются также встроенными – их у данной группы нельзя удалить. Остальные права встроенной группы можно удалять (или добавлять из общего списка прав);

возможности пользователей (user abilities) определяются для отдельных пользователей на выполнение действий, связанных с формированием их операционной среды, например изменение состава главного меню программ, возможность пользоваться пунктом меню Run (выполнить) и т.п. За счёт уменьшения набора возможностей (которые по умолчанию доступны пользователю) администратор может «заставить» пользователя работать с той операционной средой, которую администратор считает наиболее подходящей и ограждающей пользователя от возможных ошибок.

П р и м е ч а н ие – Для системы безопасности Windows NT характерно наличие большого количества различных предопределённых (встроенных) субъектов доступа – как отдельных пользователей, так и групп. Так, в системе всегда имеются такие пользователи, как Administrator, System и Guest, а также группы Users, Administrators, Account Operators, Server Operators, Everyone и другие. Смысл этих встроенных пользователей и групп состоит в том, что они наделены некоторыми правами, облегчая администратору работу по созданию эффективной системы разграничения доступа. При добавлении нового пользователя администратору остаётся только решить, к какой группе или группам отнести этого пользователя.

Права и разрешения, данные группе, автоматически предоставляются её членам, позволяя администратору рассматривать большое количество пользователей как единицу учётной информации и минимизировать свои действия.

При входе пользователя в систему для него создаётся так называемый токен доступа (access token), включающий идентификатор пользователя и идентификаторы всех групп, в которые входит пользователь. В токене также имеются: список управления доступом (ACL) по умолчанию, который состоит из разрешений и применяется к создаваемым процессом объектам; список прав пользователя на выполнение системных действий.

Все объекты, включая файлы, потоки, события, даже токены доступа, когда они создаются, снабжаются дескриптором безопасности. Дескриптор безопасности содержит список управления доступом ACL. Владелец объекта, обычно пользователь, который его создал, обладает правом избирательного управления доступом к объекту и может изменять ACL объекта, чтобы позволить или не позволить другим осуществлять доступ к объекту. Встроенный администратор Windows NT (в отличие от суперпользователя UNIX) может не

иметь некоторых разрешений на доступ к объекту. Для реализации этой возможности идентификаторы администратора и группы администраторов

241

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

При запросе процессом некоторой операции доступа к объекту в Windows NT управление всегда передаётся монитору безопасности, который сравнивает идентификаторы пользователя и групп пользователей из токена доступа с идентификаторами, хранящимися в элементах ACL объекта. В отличие от UNIX в элементах ACL Windows NT могут существовать как списки разрешённых, так и списки запрещённых для пользователя операций. Заметим, что проверка

выполняется только при каждом открытии, а не при каждом использовании объекта.

В Windows NT однозначно определены правила, по которым вновь создаваемому объекту назначается список ACL. Если вызывающий код во время создания объекта явно задаёт все права доступа к вновь создаваемому объекту, то система безопасности приписывает этот ACL объекту. Если же вызывающий код не снабжает объект списком ACL, а объект имеет имя, то применяется принцип наследования разрешений. Система безопасности просматривает ACL того каталога объектов, в котором хранится имя нового объекта. Некоторые из входов ACL каталога объектов могут быть помечены как наследуемые. Это означает, что они могут быть приписаны новым объектам, создаваемым в этом каталоге. В том же случае, когда процесс не задал явно список ACL для создаваемого объекта и объект-каталог не имеет

наследуемых элементов ACL, используется список ACL по умолчанию из токена доступа процесса.

4.6.3 Разрешения NTFS

4.6.3.1 В Windows NT администратор может управлять доступом пользователей к каталогам и файлам только в разделах диска, в которых установлена ФС NTFS. Разделы FAT не поддерживаются средствами защиты Windows NT, так как в FAT у файлов и каталогов отсутствуют атрибуты для хранения списков управления доступом. Доступ к каталогам и файлам контролируется за счёт установки соответствующих разрешений.

Разрешения NTFS это набор специальных расширенных атрибутов файла или каталога (папки), заданных для ограничения доступа пользователей к этим объектам. В NTFS для Windows NT различают разрешения:

индивидуальные;

стандартные;

специальные.

Индивидуальные разрешения относятся к элементарным операциям над

242

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

4.6.3.2 В таблице 4.4 представлены шесть индивидуальных разрешений

(элементарных операций), смысл которых отличается для каталогов и файлов.

Таблица 4.4 Индивидуальные разрешения на файлы и каталоги

Разрешение

Разрешённые действия

для каталога

для файла

Чтение (R – Read)

Чтение имён файлов и

каталогов, входящих в

данный каталог, а также атрибутов каталога и

сведений о его владельце

Чтение данных файла, разрешений на доступ к нему, его атрибутов и сведений о его владельце

Запись (W – Write)

Добавление файлов и

каталогов; изменение

атрибутов каталога; чтение атрибутов каталога,

сведений о владельца и разрешений каталога

Чтение разрешений на

доступ к файлу и сведений

о владельце; изменение атрибутов файла,

изменение и добавление данных файла

Выполнение

(X – eXecute)

Чтение атрибутов каталога;

выполнение во вложенных папках; чтение разрешений

на доступ к каталогу и сведений о его владельце

Чтение разрешений на

доступ к файлу, его атрибутов и сведений о его

владельце; выполнение (запуск) файла, если он хранит код программы

Удаление (D–Delete)

Удаление каталога

Удаление файла

Смена разрешений (P

– change Permission)

Изменение разрешений на доступ к каталогу

Изменение разрешений на доступ к файлу

Смена владельца

(O – take Ownership)

Стать владельцем каталога

Стать владельцем файла

Индивидуальные разрешения по отдельности дают весьма ограниченные возможности на доступ к файлам и каталогам и управление ими в разделах NTFS.

4.6.3.3 Для того чтобы не использовать каждый раз сочетания индивидуальных разрешений, введены так называемые стандартные разрешения NTFS, которыми все и пользуются в большинстве случаев. Они представляют собой наиболее применяемые (с точки зрения разработчиков Microsoft) комбинации индивидуальных разрешений. Стандартные разрешения на файлы и каталоги представлены в таблице 4.5.

243

Таблица 4.5 Стандартные разрешения на файлы и каталоги

Стандартные разрешения

Комбинации индивидуальных разрешений

для каталога

для файла

No Access Нет доступа

Нет разрешений

Нет разрешений

List Просмотр

RX

Не определены

Read Чтение

RX

RX

Add Добавление

WX

Не определены

Add & Read Чтение и запись

RWX

RX

Change Изменение

RWXD

RWXD

Full Control Полный доступ

Все разрешения

Все разрешения

П р и м е ч а н ие – Для файлов в Windows NT определены четыре стандартных

разрешения: No Access, Read, Change и Full Control. В последней колонке

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

случае, если файлы наследуют разрешения каталога, т.е. если у каталога установлен признак наследования его разрешений. Например, при создании

файла в каталоге с разрешением Add & Read файл наследует комбинацию RX

Разрешения имеют накопительный эффект, за исключением разрешения No Access. Разрешение No Access (нет доступа) является самым сильным в том смысле, что оно запрещает любой доступ к файлу или папке, даже если пользователь является членом группы, которой дано разрешение на доступ. Стандартное разрешение No Access устанавливается, когда снимают все индивидуальные разрешения NTFS.

4.6.3.4 Специальные разрешения представляют собой комбинации индивидуальных разрешений R, W, X, D, P и O (см. таблицу 4.4), не совпадающие ни с одним из разрешений стандартного набора (см. таблицу 4.5). Установить специальные разрешения NTFS в диалоговом окне разрешений (File Permissions или Directory Permissions) можно только прáвкой существующих разрешений для пользователя или группы. Иными словами, чтобы установить для кого-нибудь специальное разрешение NTFS, вам придётся установить сначала какое-либо из стандартных разрешений и лишь затем преобразовать его в специальное. При этом

для папок можно отдельно регулировать доступ как к самой папке (Special Directory Access), так и к находящимся в ней файлам (Special File Access). Таким образом, удаётся весьма дифференцированно управлять доступом пользователей к файлам и каталогам на томах с ФС NTFS.

  1. Сетевой доступ к файлам и устройствам

  2. Утилиты обслуживания файловых систем

  3. Утилиты управления конфигурацией оборудования

  4. Интерпретатор команд пользователя

  5. Команды и директивы оператора

  6. Переменные среды окружения

  7. Управление сеансами работы пользователя

  8. Исполняемые файлы. Пакетные командные файлы

  9. Состав систем программирования

  10. Динамически подключаемые библиотеки

  11. Функция входа-выхода динамически подкл-х библиотек

  12. Библиотекари и компоновщики