Рефераты

Лекции по предмету Операционные системы

был осуществлять программист.

Развитие методов организации вычислительного процесса в этом направлении

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

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

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

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

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

всю имеющуюся в системе реальную оперативную память. Пользователь пишет

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

память большого объема, но в действительности все данные, используемые

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

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

реальную память.

Таким образом, виртуальная память - это совокупность программно-аппаратных

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

превосходит имеющуюся оперативную память; для этого виртуальная память

решает следующие задачи:

. размещает данные в запоминающих устройствах разного типа, например,

часть программы в оперативной памяти, а часть на диске;

. перемещает по мере необходимости данные между запоминающими

устройствами разного типа, например, подгружает нужную часть программы

с диска в оперативную память;

. преобразует виртуальные адреса в физические.

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

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

пользователю.

Наиболее распространенными реализациями виртуальной памяти является

страничное, сегментное и странично-сегментное распределение памяти, а также

свопинг.

Страничное распределение

На рисунке 2.12 показана схема страничного распределения памяти.

Виртуальное адресное пространство каждого процесса делится на части

одинакового, фиксированного для данной системы размера, называемые

виртуальными страницами. В общем случае размер виртуального адресного

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

страница каждого процесса дополняется фиктивной областью.

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

называемые физическими страницами (или блоками).

Размер страницы обычно выбирается равным степени двойки: 512, 1024 и т.д.,

это позволяет упростить механизм преобразования адресов.

При загрузке процесса часть его виртуальных страниц помещается в

оперативную память, а остальные - на диск. Смежные виртуальные страницы не

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

операционная система создает для каждого процесса информационную структуру

- таблицу страниц, в которой устанавливается соответствие между номерами

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

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

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

такая как признак модификации страницы, признак невыгружаемости (выгрузка

некоторых страниц может быть запрещена), признак обращения к странице

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

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

[pic]

Рис. 2.12. Страничное распределение памяти

При активизации очередного процесса в специальный регистр процессора

загружается адрес таблицы страниц данного процесса.

При каждом обращении к памяти происходит чтение из таблицы страниц

информации о виртуальной странице, к которой произошло обращение. Если

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

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

страница в данный момент выгружена на диск, то происходит так называемое

страничное прерывание. Выполняющийся процесс переводится в состояние

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

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

виртуальную страницу и пытается загрузить ее в оперативную память. Если в

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

немедленно, если же свободных страниц нет, то решается вопрос, какую

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

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

наиболее популярные из них следующие:

. дольше всего не использовавшаяся страница,

. первая попавшаяся страница,

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

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

Рабочее множество определяется для каждого процесса и представляет собой

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

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

После того, как выбрана страница, которая должна покинуть оперативную

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

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

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

уничтожена, то есть соответствующая физическая страница объявляется

свободной.

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

страничной организации памяти (рисунок 2.13).

Виртуальный адрес при страничном распределении может быть представлен в

виде пары (p, s), где p - номер виртуальной страницы процесса (нумерация

страниц начинается с 0), а s - смещение в пределах виртуальной страницы.

Учитывая, что размер страницы равен 2 в степени к, смещение s может быть

получено простым отделением k младших разрядов в двоичной записи

виртуального адреса. Оставшиеся старшие разряды представляют собой двоичную

запись номера страницы p.

[pic]

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

при страничной организации памяти

При каждом обращении к оперативной памяти аппаратными средствами

выполняются следующие действия:

1. на основании начального адреса таблицы страниц (содержимое регистра

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

виртуального адреса) и длины записи в таблице страниц (системная

константа) определяется адрес нужной записи в таблице,

2. из этой записи извлекается номер физической страницы,

3. к номеру физической страницы присоединяется смещение (младшие разряды

виртуального адреса).

Использование в пункте (3) того факта, что размер страницы равен степени 2,

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

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

адреса, а значит повышает производительность компьютера.

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

временные затраты, связанные с обработкой страничных прерываний и

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

страничных прерываниях система может тратить большую часть времени впустую,

на свопинг страниц. Чтобы уменьшить частоту страничных прерываний,

следовало бы увеличивать размер страницы. Кроме того, увеличение размера

страницы уменьшает размер таблицы страниц, а значит уменьшает затраты

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

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

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

странице может составить существенную величину. Время преобразования

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

временем доступа к таблице страниц. В связи с этим таблицу страниц

стремятся размещать в "быстрых" запоминающих устройствах. Это может быть,

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

уменьшения времени доступа ассоциативный поиск и кэширование данных.

Страничное распределение памяти может быть реализовано в упрощенном

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

страницы всех процессов постоянно находятся в оперативной памяти. Такой

вариант страничной организации хотя и не предоставляет пользователю

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

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

загрузке виртуальных страниц никогда не образуется остатков.

Сегментное распределение

При страничной организации виртуальное адресное пространство процесса

делится механически на равные части. Это не позволяет дифференцировать

способы доступа к разным частям программы (сегментам), а это свойство часто

бывает очень полезным. Например, можно запретить обращаться с операциями

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

разрешить только чтение. Кроме того, разбиение программы на "осмысленные"

части делает принципиально возможным разделение одного сегмента несколькими

процессами. Например, если два процесса используют одну и ту же

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

только одна копия этой подпрограммы.

Рассмотрим, каким образом сегментное распределение памяти реализует эти

возможности (рисунок 2.14). Виртуальное адресное пространство процесса

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

смыслового значения содержащейся в них информации. Отдельный сегмент может

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

программы выполняется по умолчанию компилятором.

При загрузке процесса часть сегментов помещается в оперативную память (при

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

подходящий участок свободной памяти), а часть сегментов размещается в

дисковой памяти. Сегменты одной программы могут занимать в оперативной

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

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

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

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

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

другая информация. Если виртуальные адресные пространства нескольких

процессов включают один и тот же сегмент, то в таблицах сегментов этих

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

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

[pic]

Рис. 2.14. Распределение памяти сегментами

Система с сегментной организацией функционирует аналогично системе со

страничной организацией: время от времени происходят прерывания, связанные

с отсутствием нужных сегментов в памяти, при необходимости освобождения

памяти некоторые сегменты выгружаются, при каждом обращении к оперативной

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

того, при обращении к памяти проверяется, разрешен ли доступ требуемого

типа к данному сегменту.

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

парой (g, s), где g - номер сегмента, а s - смещение в сегменте. Физический

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

найденного в таблице сегментов по номеру g, и смещения s.

Недостатком данного метода распределения памяти является фрагментация на

уровне сегментов и более медленное по сравнению со страничной организацией

преобразование адреса.

Странично-сегментное распределение

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

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

сочетает в себе достоинства обоих подходов. Виртуальное пространство

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

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

память делится на физические страницы. Загрузка процесса выполняется

операционной системой постранично, при этом часть страниц размещается в

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

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

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

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

страниц для всех сегментов данного процесса. Адрес таблицы сегментов

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

соответствующий процесс. На рисунке 2.15 показана схема преобразования

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

[pic]

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

сегментно-страничной организации памяти

Свопинг

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

На рисунке 2.16 показан график зависимости коэффициента загрузки процессора

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

проводимого этими процессами в состоянии ожидания ввода-вывода.

[pic]

Рис. 2.16. Зависимость загрузки процессора от числа задач и интенсивности

ввода-вывода

Из рисунка видно, что для загрузки процессора на 90% достаточно всего трех

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

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

десятки таких задач. Необходимым условием для выполнения задачи является

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

был предложен метод организации вычислительного процесса, называемый

свопингом. В соответствии с этим методом некоторые процессы (обычно

находящиеся в состоянии ожидания) временно выгружаются на диск. Планировщик

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

наступлении условий активизации некоторого процесса, находящегося в области

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

свободного места в оперативной памяти не хватает, то выгружается другой

процесс.

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

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

есть в течение некоторого времени процесс может полностью отсутствовать в

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

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

дисковой памяти загружаемому процессу.

Иерархия запоминающих устройств. Принцип кэширования данных

Память вычислительной машины представляет собой иерархию запоминающих

устройств (внутренние регистры процессора, различные типы сверхоперативной

и оперативной памяти, диски, ленты), отличающихся средним временем доступа

и стоимостью хранения данных в расчете на один бит (рисунок 2.17).

Пользователю хотелось бы иметь и недорогую и быструю память. Кэш-память

представляет некоторое компромиссное решение этой проблемы.

[pic]

Рис. 2.17. Иерархия ЗУ

Кэш-память - это способ организации совместного функционирования двух типов

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

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

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

информации из "медленного" ЗУ.

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

запоминающих устройств, но и одно из устройств - "быстрое" ЗУ. Оно стоит

дороже и, как правило, имеет сравнительно небольшой объем. Важно, что

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

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

должен никак участвовать в перемещении данных из ЗУ одного типа в ЗУ

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

Рассмотрим частный случай использования кэш-памяти для уменьшения среднего

времени доступа к данным, хранящимся в оперативной памяти. Для этого между

процессором и оперативной памятью помещается быстрое ЗУ, называемое просто

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

например, ассоциативная память. Содержимое кэш-памяти представляет собой

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

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

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

модификации и признак обращения к данным за некоторый последний период

времени.

[pic]

Рис. 2.18. Кэш-память

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

выполняется в соответствии со следующим алгоритмом:

1. Просматривается содержимое кэш-памяти с целью определения, не

находятся ли нужные данные в кэш-памяти; кэш-память не является

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

- значению поля "адрес в оперативной памяти", взятому из запроса.

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

результат передается в процессор.

3. Если нужных данных нет, то они вместе со своим адресом копируются из

оперативной памяти в кэш-память, и результат выполнения запроса

передается в процессор. При копировании данных может оказаться, что в

кэш-памяти нет свободного места, тогда выбираются данные, к которым в

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

памяти. Если вытесняемые данные были модифицированы за время

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

Если же эти данные не были модифицированы, то их место в кэш-памяти

объявляется свободным.

На практике в кэш-память считывается не один элемент данных, к которому

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

называемого "попадания в кэш", то есть нахождения нужных данных в кэш-

памяти.

Покажем, как среднее время доступа к данным зависит от вероятности

попадания в кэш. Пусть имеется основное запоминающие устройство со средним

временем доступа к данным t1 и кэш-память, имеющая время доступа t2,

очевидно, что t2

системе с кэш-памятью, а через p -вероятность попадания в кэш. По формуле

полной вероятности имеем:

t = t1((1 - p) + t2(p

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

линейно зависит от вероятности попадания в кэш и изменяется от среднего

времени доступа в основное ЗУ (при р=0) до среднего времени доступа

непосредственно в кэш-память (при р=1).

В реальных системах вероятность попадания в кэш составляет примерно 0,9.

Высокое значение вероятности нахождения данных в кэш-памяти связано с

наличием у данных объективных свойств: пространственной и временной

локальности.

. Пространственная локальность. Если произошло обращение по некоторому

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

обращение к соседним адресам.

. Временная локальность. Если произошло обращение по некоторому адресу,

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

произойдет в ближайшее время.

Все предыдущие рассуждения справедливы и для других пар запоминающих

устройств, например, для оперативной памяти и внешней памяти. В этом случае

уменьшается среднее время доступа к данным, расположенным на диске, и роль

кэш-памяти выполняет буфер в оперативной памяти.

| |

[pic]

Управление вводом-выводом

Одной из главных функций ОС является управление всеми устройствами ввода-

вывода компьютера. ОС должна передавать устройствам команды, перехватывать

прерывания и обрабатывать ошибки; она также должна обеспечивать интерфейс

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

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

устройств).

Физическая организация устройств ввода-вывода

Устройства ввода-вывода делятся на два типа: блок-ориентированные

устройства и байт-ориентированные устройства. Блок-ориентированные

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

которых имеет свой собственный адрес. Самое распространенное блок-

ориентированное устройство - диск. Байт-ориентированные устройства не

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

потребляют последовательность байтов. Примерами являются терминалы,

строчные принтеры, сетевые адаптеры. Однако некоторые внешние устройства не

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

адресуемы, а с другой стороны, не порождают потока байтов. Это устройство

только выдает сигнал прерывания в некоторые моменты времени.

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

компонента. Электронный компонент называется контроллером устройства или

адаптером. Механический компонент представляет собственно устройство.

Некоторые контроллеры могут управлять несколькими устройствами. Если

интерфейс между контроллером и устройством стандартизован, то независимые

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

устройства.

Операционная система обычно имеет дело не с устройством, а с контроллером.

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

поток бит в блоки, состоящие из байт, и осуществляют контроль и исправление

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

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

регистры являются частью физического адресного пространства. В таких

компьютерах нет специальных операций ввода-вывода. В других компьютерах

адреса регистров ввода-вывода, называемых часто портами, образуют

собственное адресное пространство за счет введения специальных операций

ввода-вывода (например, команд IN и OUT в процессорах i86).

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

Например, контроллер гибкого диска IBM PC принимает 15 команд, таких как

READ, WRITE, SEEK, FORMAT и т.д. Когда команда принята, процессор оставляет

контроллер и занимается другой работой. При завершении команды контроллер

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

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

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

регистров контроллера.

Организация программного обеспечения ввода-вывода

Основная идея организации программного обеспечения ввода-вывода состоит в

разбиении его на несколько уровней, причем нижние уровни обеспечивают

экранирование особенностей аппаратуры от верхних, а те, в свою очередь,

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

Ключевым принципом является независимость от устройств. Вид программы не

должен зависеть от того, читает ли она данные с гибкого диска или с

жесткого диска.

Очень близкой к идее независимости от устройств является идея

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

приняты единые правила.

Другим важным вопросом для программного обеспечения ввода-вывода является

обработка ошибок. Вообще говоря, ошибки следует обрабатывать как можно

ближе к аппаратуре. Если контроллер обнаруживает ошибку чтения, то он

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

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

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

ошибки, вызванные наличием пылинок на головках чтения или на диске. И

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

ошибке верхнему уровню.

Еще один ключевой вопрос - это использование блокирующих (синхронных) и

неблокирующих (асинхронных) передач. Большинство операций физического ввода-

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

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

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

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

данные не попадут в буфер программы. ОС выполняет операции ввода-вывода

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

форме.

Последняя проблема состоит в том, что одни устройства являются

разделяемыми, а другие - выделенными. Диски - это разделяемые устройства,

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

представляет собой проблему. Принтеры - это выделенные устройства, потому

что нельзя смешивать строчки, печатаемые различными пользователями. Наличие

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

Для решения поставленных проблем целесообразно разделить программное

обеспечение ввода-вывода на четыре слоя (рисунок 2.30):

. Обработка прерываний,

. Драйверы устройств,

. Независимый от устройств слой операционной системы,

. Пользовательский слой программного обеспечения.

[pic]

Рис. 2.30. Многоуровневая организация подсистемы ввода-вывода

Обработка прерываний

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

системы, чтобы как можно меньшая часть ОС имела с ними дело. Наилучший

способ состоит в разрешении процессу, инициировавшему операцию ввода-

вывода, блокировать себя до завершения операции и наступления прерывания.

Процесс может блокировать себя, используя, например, вызов DOWN для

семафора, или вызов WAIT для переменной условия, или вызов RECEIVE для

ожидания сообщения. При наступлении прерывания процедура обработки

прерывания выполняет разблокирование процесса, инициировавшего операцию

ввода-вывода, используя вызовы UP, SIGNAL или посылая процессу сообщение. В

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

заблокированный процесс теперь продолжит свое выполнение.

Драйверы устройств

Весь зависимый от устройства код помещается в драйвер устройства. Каждый

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

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

особенностях какого-либо устройства. Например, только драйвер диска имеет

дело с дорожками, секторами, цилиндрами, временем установления головки и

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

Драйвер устройства принимает запрос от устройств программного слоя и

решает, как его выполнить. Типичным запросом является чтение n блоков

данных. Если драйвер был свободен во время поступления запроса, то он

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

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

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

Первый шаг в реализации запроса ввода-вывода, например, для диска, состоит

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

драйвера это означает преобразование номеров блоков в номера цилиндров,

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

нужным цилиндром. Короче говоря, он должен решить, какие операции

контроллера нужно выполнить и в какой последовательности.

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

себя до окончания заданной операции или нет. Если операция занимает

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

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

прерывания не разблокирует его. Если команда ввода-вывода выполняется

быстро (например, прокрутка экрана), то драйвер ожидает ее завершения без

блокирования.

Независимый от устройств слой операционной системы

Большая часть программного обеспечения ввода-вывода является независимой от

устройств. Точная граница между драйверами и независимыми от устройств

программами определяется системой, так как некоторые функции, которые могли

бы быть реализованы независимым способом, в действительности выполнены в

виде драйверов для повышения эффективности или по другим причинам.

Типичными функциями для независимого от устройств слоя являются:

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

. именование устройств,

. защита устройств,

. обеспечение независимого размера блока,

. буферизация,

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

. распределение и освобождение выделенных устройств,

. уведомление об ошибках.

Остановимся на некоторых функциях данного перечня. Верхним слоям

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

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

объединения нескольких различных блоков в единый логический блок. В связи с

этим верхние уровни имеют дело с абстрактными устройствами, которые

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

физического сектора.

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

ему новые блоки. Для этого ОС должна вести список или битовую карту

свободных блоков диска. На основании информации о наличии свободного места

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

независимый от устройства и реализуемый программным слоем, находящимся выше

слоя драйверов.

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

Хотя большая часть программного обеспечения ввода-вывода находится внутри

ОС, некоторая его часть содержится в библиотеках, связываемых с

пользовательскими программами. Системные вызовы, включающие вызовы ввода-

вывода, обычно делаются библиотечными процедурами. Если программа,

написанная на языке С, содержит вызов

count = write (fd, buffer, nbytes),

то библиотечная процедура write будет связана с программой. Набор подобных

процедур является частью системы ввода-вывода. В частности, форматирование

ввода или вывода выполняется библиотечными процедурами. Примером может

служить функция printf языка С, которая принимает строку формата и,

возможно, некоторые переменные в качестве входной информации, затем строит

строку символов ASCII и делает вызов write для вывода этой строки.

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

которые выполняют ввод-вывод и работают как часть пользовательской

программы.

Другой категорией программного обеспечения ввода-вывода является подсистема

спулинга (spooling). Спулинг - это способ работы с выделенными устройствами

в мультипрограммной системе. Рассмотрим типичное устройство, требующее

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

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

такой способ опасен из-за того, что пользовательский процесс может

монополизировать принтер на произвольное время. Вместо этого создается

специальный процесс - монитор, который получает исключительные права на

использование этого устройства. Также создается специальный каталог,

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

пользовательский процесс помещает выводимую информацию в этот файл и

помещает его в каталог спулинга. Процесс-монитор по очереди распечатывает

все файлы, содержащиеся в каталоге спулинга.

| |

[pic]

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

Файловая система - это часть операционной системы, назначение которой

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

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

несколькими пользователями и процессами.

В широком смысле понятие "файловая система" включает:

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

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

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

распределения свободного и занятого пространства на диске,

. комплекс системных программных средств, реализующих управление

файлами, в частности: создание, уничтожение, чтение, запись,

именование, поиск и другие операции над файлами.

Имена файлов

Файлы идентифицируются именами. Пользователи дают файлам символьные имена,

при этом учитываются ограничения ОС как на используемые символы, так и на

длину имени. До недавнего времени эти границы были весьма узкими. Так в

популярной файловой системе FAT длина имен ограничивается известной схемой

8.3 (8 символов - собственно имя, 3 символа - расширение имени), а в ОС

UNIX System V имя не может содержать более 14 символов. Однако пользователю

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

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

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

этот файл. Поэтому современные файловые системы, как правило, поддерживают

длинные символьные имена файлов. Например, Windows NT в своей новой

файловой системе NTFS устанавливает, что имя файла может содержать до 255

символов, не считая завершающего нулевого символа.

При переходе к длинным именам возникает проблема совместимости с ранее

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

могли обращаться к файлам в соответствии с принятыми ранее соглашениями,

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

(псевдонимы) файлам, имеющим длинные имена. Таким образом, одной из важных

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

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

новыми версиями хорошо известных файловых систем. Например, в ОС Windows 95

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

измененный вариант FAT. Среди многих других усовершенствований одним из

главных достоинств VFAT является поддержка длинных имен. Кроме проблемы

генерации эквивалентных коротких имен, при реализации нового варианта FAT

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

принципиально метод хранения и структура данных на диске не должны были

измениться.

Обычно разные файлы могут иметь одинаковые символьные имена. В этом случае

файл однозначно идентифицируется так называемым составным именем,

представляющем собой последовательность символьных имен каталогов. В

некоторых системах одному и тому же файлу не может быть дано несколько

разных имен, а в других такое ограничение отсутствует. В последнем случае

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

чтобы можно было установить взаимно-однозначное соответствие между файлом и

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

идентификатор и используется программами операционной системы. Примером

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

системе UNIX.

Типы файлов

Файлы бывают разных типов: обычные файлы, специальные файлы, файлы-

каталоги.

Обычные файлы в свою очередь подразделяются на текстовые и двоичные.

Текстовые файлы состоят из строк символов, представленных в ASCII-коде. Это

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

прочитать на экране и распечатать на принтере. Двоичные файлы не используют

ASCII-коды, они часто имеют сложную внутреннюю структуру, например,

объектный код программы или архивный файл. Все операционные системы должны

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

файлы.

Специальные файлы - это файлы, ассоциированные с устройствами ввода-вывода,

которые позволяют пользователю выполнять операции ввода-вывода, используя

обычные команды записи в файл или чтения из файла. Эти команды

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

этапе выполнения запроса преобразуются ОС в команды управления

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

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

Каталог - это, с одной стороны, группа файлов, объединенных пользователем

исходя из некоторых соображений (например, файлы, содержащие программы игр,

или файлы, составляющие один программный пакет), а с другой стороны - это

файл, содержащий системную информацию о группе файлов, его составляющих. В

каталоге содержится список файлов, входящих в него, и устанавливается

соответствие между файлами и их характеристиками (атрибутами).

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

характеристики, например:

. информация о разрешенном доступе,

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

. владелец файла,

. создатель файла,

. признак "только для чтения",

. признак "скрытый файл",

. признак "системный файл",

. признак "архивный файл",

. признак "двоичный/символьный",

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

. признак блокировки,

. длина записи,

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

. длина ключа,

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

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

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

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

это сделано в файловой системе MS-DOS, или ссылаться на таблицы, содержащие

эти характеристики, как это реализовано в ОС UNIX (рисунок 2.31). Каталоги

могут образовывать иерархическую структуру за счет того, что каталог более

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

2.32).

[pic]

Рис. 2.31. Структура каталогов: а - структура записи каталога MS-DOS (32

байта);

б - структура записи каталога ОС UNIX

Иерархия каталогов может быть деревом или сетью. Каталоги образуют дерево,

если файлу разрешено входить только в один каталог, и сеть - если файл

может входить сразу в несколько каталогов. В MS-DOS каталоги образуют

древовидную структуру, а в UNIX'е - сетевую. Как и любой другой файл,

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

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

проходит путь от корня до данного каталога.

[pic]

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

а - одноуровневая; б - иерархическая (дерево); в - иерархическая (сеть)

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

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

виде определенным образом организованных логических записей. Логическая

запись - это наименьший элемент данных, которым может оперировать

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

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

обеспечивает программисту доступ к отдельной логической записи. На рисунке

2.33 показаны несколько схем логической организации файла. Записи могут

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

расположены в файле последовательно (последовательная организация) или в

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

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

(индексно-последовательная организация). Для идентификации записи может

быть использовано специальное поле записи, называемое ключом. В файловых

системах ОС UNIX и MS-DOS файл имеет простейшую логическую структуру -

последовательность однобайтовых записей.

[pic]

Рис. 2.33. Способы логической организации файлов

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

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

устройстве внешней памяти, в частности на диске. Файл состоит из физических

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

устройство обменивается с оперативной памятью. Непрерывное размещение -

простейший вариант физической организации (рисунок 2.34,а), при котором

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

сплошной участок дисковой памяти. Для задания адреса файла в этом случае

достаточно указать только номер начального блока. Другое достоинство этого

метода - простота. Но имеются и два существенных недостатка. Во-первых, во

время создания файла заранее не известна его длина, а значит не известно,

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

порядке размещения неизбежно возникает фрагментация, и пространство на

диске используется не эффективно, так как отдельные участки маленького

размера (минимально 1 блок) могут остаться не используемыми.

Следующий способ физической организации - размещение в виде связанного

списка блоков дисковой памяти (рисунок 2.34,б ). При таком способе в начале

каждого блока содержится указатель на следующий блок. В этом случае адрес

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

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

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

может изменяться во время своего существования, наращивая число блоков.

Недостатком является сложность реализации доступа к произвольно заданному

месту файла: для того, чтобы прочитать пятый по порядку блок файла,

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

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

файла, содержащихся в одном блоке, не равно степени двойки (одно слово

израсходовано на номер следующего блока), а многие программы читают данные

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

[pic]

Рис. 2.34. Физическая организация файла

а - непрерывное размещение; б - связанный список блоков;

в - связанный список индексов; г - перечень номеров блоков

Популярным способом, используемым, например, в файловой системе FAT

операционной системы MS-DOS, является использование связанного списка

индексов. С каждым блоком связывается некоторый элемент - индекс. Индексы

располагаются в отдельной области диска (в MS-DOS это таблица FAT). Если

некоторый блок распределен некоторому файлу, то индекс этого блока содержит

номер следующего блока данного файла. При такой физической организации

сохраняются все достоинства предыдущего способа, но снимаются оба

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

достаточно прочитать только блок индексов, отсчитать нужное количество

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

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

двойки.

В заключение рассмотрим задание физического расположения файла путем

простого перечисления номеров блоков, занимаемых этим файлом. ОС UNIX

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

длину адреса, независимо от размера файла. Для хранения адреса файла

выделено 13 полей. Если размер файла меньше или равен 10 блокам, то номера

этих блоков непосредственно перечислены в первых десяти полях адреса. Если

размер файла больше 10 блоков, то следующее 11-е поле содержит адрес блока,

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

Если файл больше, чем 10+128 блоков, то используется 12-е поле, в котором

находится номер блока, содержащего 128 номеров блоков, которые содержат по

128 номеров блоков данного файла. И, наконец, если файл больше

10+128+128(128, то используется последнее 13-е поле для тройной косвенной

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

128 + 128(128 + 128(128(128.

Права доступа к файлу

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

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

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

операций доступа. Этот список может включать следующие операции:

. создание файла,

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

. открытие файла,

. закрытие файла,

. чтение файла,

. запись в файл,

. дополнение файла,

. поиск в файле,

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

. установление новых значений атрибутов,

. переименование,

. выполнение файла,

. чтение каталога,

и другие операции с файлами и каталогами.

В самом общем случае права доступа могут быть описаны матрицей прав

доступа, в которой столбцы соответствуют всем файлам системы, строки - всем

пользователям, а на пересечении строк и столбцов указываются разрешенные

операции (рисунок 2.35). В некоторых системах пользователи могут быть

разделены на отдельные категории. Для всех пользователей одной категории

определяются единые права доступа. Например, в системе UNIX все

пользователи подразделяются на три категории: владельца файла, членов его

группы и всех остальных.

[pic]

Рис. 2.35. Матрица прав доступа

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

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

сам владелец может определить допустимые операции;

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

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

файлу) в зависимости от того, к какой группе пользователь отнесен.

Кэширование диска

В некоторых файловых системах запросы к внешним устройствам, в которых

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

промежуточным программным слоем-подсистемой буферизации. Подсистема

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

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

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

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

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

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

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

файлу. Если же нужный блок в буферном пуле отсутствует, то он считывается с

устройства и одновременно с передачей запрашивающему процессу копируется в

один из буферов подсистемы буферизации. При отсутствии свободного буфера на

диск вытесняется наименее используемая информация. Таким образом,

подсистема буферизации работает по принципу кэш-памяти.

Общая модель файловой системы

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

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

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

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

запросов) нижележащего уровня.

[pic]

Рис. 2.36. Общая модель файловой системы

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

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

иметь только одно символьное имя (например, MS-DOS), этот уровень

отсутствует, так как символьное имя, присвоенное файлу пользователем,

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

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

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

каталогов для определения уникального имени файла. В файловой системе UNIX,

например, уникальным именем является номер индексного дескриптора файла (i-

node).

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

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

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

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

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

В некоторых файловых системах (например, HPFS) при открытии файла вместе с

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

блоков файла, содержащих данные.

Следующим этапом реализации запроса к файлу является проверка прав доступа

к нему. Для этого сравниваются полномочия пользователя или процесса,

выдавших запрос, со списком разрешенных видов доступа к данному файлу. Если

запрашиваемый вид доступа разрешен, то выполнение запроса продолжается,

если нет, то выдается сообщение о нарушении прав доступа.

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

записи в файле, то есть требуется определить, на каком расстоянии (в

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

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

непрерывной последовательности байт. Алгоритм работы данного уровня зависит

от логической организации файла. Например, если файл организован как

последовательность логических записей фиксированной длины l, то n-ая

логическая запись имеет смещение l((n-1) байт. Для определения координат

логической записи в файле с индексно-последовательной организацией

выполняется чтение таблицы индексов (ключей), в которой непосредственно

указывается адрес логической записи.

[pic]

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

Исходные данные:

V - размер блока

N - номер первого блока файла

S - смещение логической записи в файле

Требуется определить на физическом уровне:

n - номер блока, содержащего требуемую логическую запись

s - смещение логической записи в пределах блока

n = N + [S/V], где [S/V] - целая часть числа S/V

s = R [S/V] - дробная часть числа S/V

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

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

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

логического уровня - смещение логической записи в файле, адрес файла на

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

включая размер блока. Рисунок 2.37 иллюстрирует работу физического уровня

для простейшей физической организации файла в виде непрерывной

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

решается независимо от того, как был логически организован файл.

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

системе ввода-вывода для выполнения операции обмена с внешним устройством.

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

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

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

Отображаемые в память файлы

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

запутанным и неудобным. По этой причине некоторые ОС, начиная с MULTICS,

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

процесса. Это выражается в появлении двух новых системных вызовов: MAP

(отобразить) и UNMAP (отменить отображение). Первый вызов передает

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

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

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

Предположим, например, что файл f имеет длину 64 К и отображается на

область виртуального адресного пространства с начальным адресом 512 К.

После этого любая машинная команда, которая читает содержимое байта по

адресу 512 К, получает 0-ой байт этого файла и т.д. Очевидно, что запись по

адресу 512 К + 1100 изменяет 1100 байт файла. При завершении процесса на

диске остается модифицированная версия файла, как если бы он был изменен

комбинацией вызовов SEEK и WRITE.

В действительности при отображении файла внутренние системные таблицы

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

памяти на диске. Таким образом, чтение по адресу 512 К вызывает страничный

отказ, в результате чего страница 0 переносится в физическую память.

Аналогично, запись по адресу 512 К + 1100 вызывает страничный отказ, в

результате которого страница, содержащая этот адрес, перемещается в память,

после чего осуществляется запись в память по требуемому адресу. Если эта

страница вытесняется из памяти алгоритмом замены страниц, то она

записывается обратно в файл в соответствующее его место. При завершении

процесса все отображенные и модифицированные страницы переписываются из

памяти в файл.

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

сегментацию. В такой системе каждый файл может быть отображен в свой

собственный сегмент, так что k-ый байт в файле является k-ым байтом

сегмента. На рисунке 2.38,а изображен процесс, который имеет два сегмента-

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

сначала отображает файл-источник, например, abc. Затем он создает пустой

сегмент и отображает на него файл назначения, например, файл ddd.

С этого момента процесс может копировать сегмент-источник в сегмент-

приемник с помощью обычного программного цикла, использующего команды

пересылки в памяти типа mov. Никакие вызовы READ или WRITE не нужны. После

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

файла из адресного пространства, а затем завершиться. Выходной файл ddd

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

Хотя отображение файлов исключает потребность в выполнении ввода-вывода и

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

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

файла, в данном примере ddd. Проще указать наибольший номер записанной

страницы, но нет способа узнать, сколько байт в этой странице было

записано. Предположим, что программа использует только страницу номер 0, и

после выполнения все байты все еще установлены в значение 0 (их начальное

значение). Быть может, файл состоит из 10 нулей. А может быть, он состоит

из 100 нулей. Как это определить? Операционная система не может это

сообщить. Все, что она может сделать, так это создать файл, длина которого

равна размеру страницы.

[pic]

Рис. 2.38. (а) Сегменты процесса перед отображением файлов в адресное

пространство; (б) Процесс

после отображения существующего файла abc в один сегмент и создания нового

сегмента для файла ddd

Вторая проблема проявляется (потенциально), если один процесс отображает

файл, а другой процесс открывает его для обычного файлового доступа. Если

первый процесс изменяет страницу, то это изменение не будет отражено в

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

Поддержание согласованности данных файла для этих двух процессов требует от

системы больших забот.

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

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

ее решения состоит в реализации вызова MAP таким образом, чтобы он мог

отображать не весь файл, а его часть. Хотя такая работа, очевидно, менее

удобна, чем отображение целого файла.

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

Разработчики новых операционных систем стремятся обеспечить пользователя

возможностью работать сразу с несколькими файловыми системами. В новом

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

входят и файловые системы в традиционном понимании.

Новая файловая система имеет многоуровневую структуру (рисунок 2.39), на

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

систем (в Windows 95, например, такой переключатель называется

устанавливаемым диспетчером файловой системы - installable filesystem

manager, IFS). Он обеспечивает интерфейс между запросами приложения и

конкретной файловой системой, к которой обращается это приложение.

Переключатель файловых систем преобразует запросы в формат, воспринимаемый

следующим уровнем - уровнем файловых систем.

[pic]

Рис. 2.39. Архитектура современной файловой системы

Каждый компонент уровня файловых систем выполнен в виде драйвера

соответствующей файловой системы и поддерживает определенную организацию

файловой системы. Переключатель является единственным модулем, который

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

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

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

выполнять операции с файлами. Каждый драйвер файловой системы в процессе

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

таблицу точек входа, которые будут использоваться при последующих

обращениях к файловой системе.

Для выполнения своих функций драйверы файловых систем обращаются к

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

архитектуры. Подсистема ввода вывода - это составная часть файловой

системы, которая отвечает за загрузку, инициализацию и управление всеми

модулями низших уровней файловой системы. Обычно эти модули представляют

собой драйверы портов, которые непосредственно занимаются работой с

аппаратными средствами. Кроме этого подсистема ввода-вывода обеспечивает

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

запросы к конкретным устройствам. Подсистема ввода-вывода должна постоянно

присутствовать в памяти и организовывать совместную работу иерархии

драйверов устройств. В эту иерархию могут входить драйверы устройств

определенного типа (драйверы жестких дисков или накопителей на лентах),

драйверы, поддерживаемые поставщиками (такие драйверы перехватывают запросы

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

драйвера этого устройства, например, зашифровать данные), драйверы портов,

которые управляют конкретными адаптерами.

Большое число уровней архитектуры файловой системы обеспечивает авторам

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

любом этапе выполнения запроса - от вызова приложением функции, которая

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

низком уровне драйвер устройства начинает просматривать регистры

контроллера. Многоуровневый механизм работы файловой системы реализован

посредством цепочек вызова.

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

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

обращения. Подсистема ввода-вывода помещает адрес целевой функции в цепочку

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

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

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

вызова.

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

дальше - в измененном или в неизмененном виде - на следующий уровень, или,

если это возможно, процедура может удовлетворить запрос, не передавая его

дальше по цепочке.

Страницы: 1, 2, 3, 4


© 2010 Современные рефераты