ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 24.12.2021

Просмотров: 12202

Скачиваний: 10

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

Виртуальные команды ввода-вывода 463

Виртуальная память и кэширование

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

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

Промахи кэш-памяти обрабатываются аппаратным обеспечением, а ошибки из-за
отсутствия страниц обрабатываются операционной системой. Блоки кэш-памяти
обычно гораздо меньше страниц (например, 64 байта и 8 Кбайт). Кроме того, таб-

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

Виртуальные команды ввода-вывода

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

двух уровнях различны. Наличие нескольких одинаковых команд случайно.

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

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

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

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

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

предыдущий.


background image

464 Глава 6. Уровень операционной системы

4. Ошибка синхронизации при считывании.
5. Обращение к несуществующему диску.
6. Обращение к несуществующему цилиндру.
7. Обращение к несуществующему сектору.
8. Ошибка проверки записи после операции записи.
При наличии одной из этих ошибок устанавливается соответствующий бит

в регистре устройства.

Файлы

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

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

Для операционной системы файл является просто последовательностью бай-

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

После открытия файла его можно считывать. Системный вызов для считыва-

ния должен иметь как минимум следующие параметры:

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

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

Данный системный вызов помещает требующиеся данные в буфер. Обычно он

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

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

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

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

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

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


background image

Виртуальные команды ввода-вывода

465

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

представляет собой более сложную структуру. Здесь файл может быть последова-
тельностью

 логических записей,

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

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

Основная виртуальная команда ввода считывает следующую запись из нужно-

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

Номер

логической •

записи

14

15

16

17

18

19

20

21

22

23

24

25

Следующая

логическая

запись для чтения

Одна

логическая

запись

Основная

память

Логическая

запись 18

Буфер

{

15

16

17

18

19

20

21

22

23

24

25

26

Следующая

логическая

запись для чтения

Основная

память

Логическая

запись 19

Буфер

Рис. 6.17. Чтение файла, состоящего из логических записей: до чтения записи 19 (а); после

чтения записи 19(6)

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

мяти в файл. Последовательные команды

 write

 производят последовательные ло-

гические записи в файл.

Реализация виртуальных команд ввода-вывода

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


background image

4 6 6 Глава 6. Уровень операционной системы

Еще одно фундаментальное свойство реализации системы файлов — хранится

ли файл в последовательных блоках или нет. На рис. 6.18 изображен простой диск
с одной поверхностью, состоящий из 5 дорожек по 12 секторов каждая. На рис. 6.18, а
файл состоит из последовательных секторов. Последовательное расположение пяти
блоков обычно применяется на компакт-дисках. На рис. 6.18,

 б

 файл занимает

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

Сектор 11 Сектор О

Направление

вращения диска

Сектор 11 Сектор О

Дорожка 4

Дорожка 0

Направление

вращения диска

Рис. 6.18. Варианты расположения файла на диске' файл занимает последовательные

сектора (а); файл занимает непоследовательные сектора (б)

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

ятия файла операционной системой. Программист воспринимает файл как линей-

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

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

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

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

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

 индекс файла),

 которая выдает единичные

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

 ключ,

 и программы могут обращать-

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


background image

Виртуальные команды ввода-вывода 467

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

Альтернативный метод нахождения блоков файла — организовать файл в виде

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

число 19, а элемент 19 будет содержать специальный код (например, 0 или -1),

который указывает на конец файла. Так работают системы файлов в MS DOS,
Windows 95 и Windows 98. Windows NT поддерживает эту систему файлов, но кро-
ме этого имеет свою собственную систему файлов, которая больше похожа на UNIX.

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

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

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

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

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

(например, это имеет место, когда создается компакт-диск), программа может за-
ранее определить серии секторов, точно равных по длине каждому файлу. Если
файлы по 1200, 700, 2000 и 900 секторов нужно поместить на компакт-диск, они
просто могут начинаться с секторов 0,1200,1900 и 3900 соответственно (оглавле-
ние здесь не учитывается). Найти любую часть любого файла легко, поскольку
известен первый сектор файла.

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

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

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

 списком

свободной памяти.

 На рис. 6.19, а изображен список свободной памяти для диска

с рис. 6.18,

 б.

Альтернативный подход — сохранить битовое отображение, один бит на еди-

ничный блок, как показано на рис. 6.19,

 б.

 Бит со значением 1 показывает, что дан-

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