Добавлен: 29.10.2018
Просмотров: 48146
Скачиваний: 190
5.3. Уровни программного обеспечения ввода-вывода
411
устройства вывода информации (принтер, плоттер и т. д.)
1
. Другие ошибки возникают
при предоставлении неверного адреса буфера или других параметров или указании
неверного устройства (например, третьего диска, когда в системе имеется только два)
и т. д. На такие ошибки следует весьма простая реакция: вызывающей программе от-
правляется код возникшей ошибки.
К другому классу относятся фактические ошибки ввода-вывода, например попытка
записи в поврежденный дисковый блок или чтения из выключенной видеокамеры.
При таких обстоятельствах решение о дальнейших действиях возлагается на драй-
вер. Если драйвер не знает, что ему делать, он может передать решение проблемы на
вышележащий уровень — не зависящему от конкретных устройств программному
обеспечению.
Действия этого программного обеспечения зависят от среды окружения и характера
ошибки. Если речь идет о простой ошибке чтения и есть возможность общения с поль-
зователем, то может быть выведено диалоговое окно с вопросом к пользователю, что
делать дальше. Варианты могут включать повторение попытки определенное коли-
чество раз, игнорирование ошибки или уничтожение вызывающего процесса. Если
пользователь недоступен, то, возможно, единственным вариантом будет аварийное
завершение системного вызова с указанием кода ошибки.
Некоторые ошибки не могут быть обработаны таким образом. Например, если раз-
рушена важная структура данных, такая как корневой каталог или список свободных
блоков. В таком случае системе, вероятно, придется отобразить сообщение об ошибке
и прекратить работу. Практически ничего другого ей не остается.
Распределение и высвобождение выделенных устройств
Некоторые устройства, например принтеры, в любой момент времени могут использо-
ваться только одним процессом. Операционная система должна проверять запросы на
использование и принимать их или отвергать в зависимости от доступности запраши-
ваемого устройства. Простой способ обработки этих запросов заключается в требова-
нии к процессам непосредственно открывать специальные файлы для этих устройств
с помощью системных вызовов open. Если устройство недоступно, то системный вызов
open потерпит неудачу. Освобождение выделенного устройства происходит после его
закрытия с помощью системного вызова close.
Альтернативный подход заключается в использовании специальных механизмов для
запроса и освобождения выделенных устройств. Попытка получить в свое распоря-
жение недоступное устройство приводит не к отказу, а к блокировке процесса, пред-
принявшего эту попытку. Заблокированные процессы помещаются в очередь. Рано
или поздно запрашиваемое устройство станет доступным, и первому процессу из этой
очереди будет позволено получить устройство и продолжить свою работу.
1
Тем не менее могут встречаться устройства, допускающие такие операции, например много-
функциональные устройства работы с документами (совмещающие в себе принтер и сканер)
или клавиатуры со встроенным дисплеем. Но для единообразия они обычно представляются
на логическом уровне как несколько отдельных устройств соответствующих типов. — При-
меч. ред.
412
Глава 5. Ввод и вывод информации
Предоставление размера блока, не зависящего
от конкретных устройств
У разных дисков могут быть разные размеры секторов. Не зависимое от устройств
программное обеспечение должно скрыть этот факт и предоставить расположенным
выше уровням унифицированный размер блока, например, рассматривая несколько
секторов в качестве одного логического блока. Таким образом, вышестоящие уровни
будут работать только с абстрактными устройствами, использующими один и тот же
размер логического блока, не зависящий от физического размера сектора. Аналогич-
ным образом некоторые символьные устройства (например, мыши) осуществляют
побайтовую доставку данных, а другие устройства (например, Ethernet-интерфейсы)
доставляют данные блоками более крупного размера. Эти различия также могут быть
скрыты.
5.3.4. Программное обеспечение ввода-вывода,
работающее в пространстве пользователя
Хотя основная часть программного обеспечения ввода-вывода относится к операцион-
ной системе, его небольшая часть, представленная библиотеками, прикомпонованными
к пользовательским программам, и даже целыми программами, работает за пределами
ядра. Обычно системные вызовы, включая те, что относятся к операциям ввода-выво-
да, осуществляются с помощью библиотечных процедур. Когда программа на языке C
содержит вызов
count = write(fd, buffer, nbytes);
библиотечная процедура write, которая содержит двоичную программу, находящуюся
в памяти во время выполнения, при компоновке может стать частью самой програм-
мы. В других системах библиотеки могут загружаться в ходе выполнения программы.
В любом случае, набор аналогичных библиотечных процедур несомненно является
частью системы ввода-вывода.
Хотя кроме помещения своих параметров в соответствующее место системного вызова
эти процедуры практически ничего больше не делают, есть и другие процедуры ввода-
вывода, занимающиеся настоящей работой. В частности, библиотечные процедуры
осуществляют форматирование ввода и вывода. В языке C примером может послужить
процедура printf, которая воспринимает в качестве входных данных строку, описываю-
щую формат вывода и, возможно, несколько переменных, выстраивает ASCII-строку,
а затем, чтобы вывести эту строку, осуществляет системный вызов write. В качестве
примера использования printf рассмотрим оператор
printf("Квадрат числа %3d равен %6d\n", i, i*i);
Он форматирует 14-символьную строку «Квадрат числа», за которой следует значение
i в виде 3-символьной строки, затем 7-символьная строка «равен», за ней — i
2
в виде
шести символов и, наконец, символ перевода строки.
Примером простой процедуры для ввода данных является scanf, которая читает вход-
ные данные и сохраняет их в переменной, описание которой дается в форматирующей
строке, использующей тот же синтаксис, что и printf. В стандартной библиотеке вво-
да-вывода содержится ряд процедур, касающихся операций ввода-вывода, и все они
запускаются как часть программ пользователя.
5.3. Уровни программного обеспечения ввода-вывода
413
Но программное обеспечение ввода-вывода, работающее в пространстве пользователя,
состоит не только из библиотечных процедур. Еще одной важной категорией является
система подкачки данных. Подкачка данных, или спулинг (spooling), является спосо-
бом работы с выделяемыми устройствами ввода-вывода в многозадачных системах.
Рассмотрим принтер, типичное устройство, использующее спулинг. Хотя технически
совсем не сложно позволить каждому пользовательскому процессу открыть предна-
значенный для принтера специальный символьный файл, предположим, что процесс
открыл такой файл, а затем простаивал в течение нескольких часов. Все это время ни
один из прочих процессов не сможет ничего вывести на печать.
Вместо этого создаются специальный процесс, который называется демоном (daemon),
и специальный каталог, который называется каталогом спулинга. Для вывода файла на
печать процесс сначала создает весь выходной файл и помещает его в каталог спулинга.
Теперь распечаткой файла из каталога занимается демон — единственный процесс,
имеющий разрешение на использование специального файла принтера. Когда специ-
альный файл защищен от непосредственного доступа со стороны пользователей, про-
блема необоснованного длительного удержания его в открытом состоянии полностью
исключается.
Спулинг используется не только при работе с принтерами, но и в других ситуациях
применения операций ввода-вывода. Например, при передаче файла по сети часто
задействуется сетевой демон. Чтобы куда-нибудь отправить файл, пользователь по-
мещает его в сетевой каталог спулинга. Чуть позже сетевой демон извлекает этот файл
и передает его по сети. Конкретным примером системы, в которой файлы передаются
с помощью спулинга, может послужить USENET News (стала частью Google Groups).
Эта сеть состоит из нескольких миллионов машин по всему миру, обменивающихся
данными через Интернет. Существуют тысячи новостных групп, затрагивающих
обширную тематику. Для публикации нового сообщения пользователь вызывает про-
грамму новостей, которая принимает публикуемое сообщение, а затем помещает его
в каталог спулинга для последующей отправки в адрес других машин. И вся новостная
система работает вне операционной системы
1
.
На рис. 5.14 представлен общий вид системы ввода-вывода со всеми уровнями и ос-
новными функциями каждого уровня. Снизу вверх уровни представлены аппаратурой,
обработчиками прерываний, драйверами устройств, программным обеспечением, не
зависящим от конкретных устройств, и, наконец, пользовательскими процессами.
Стрелки на рис. 5.14 отображают передачу управления. Когда, к примеру, пользова-
тельская программа пытается прочитать блок из файла, происходит обращение к опе-
рационной системе, чтобы та осуществила вызов. Опять же, к примеру, программное
обеспечение, не зависящее от конкретного устройства, ищет блок в буферном кэше.
Если нужного блока там нет, оно вызывает драйвер устройства для выдачи запроса
к аппаратному обеспечению, чтобы получить этот блок с диска. Затем процесс бло-
кируется до тех пор, пока не будет завершена дисковая операция и данные не станут
безопасно доступны в буфере вызывавшей процедуры.
1
Еще одним примером системы передачи файлов с помощью спулинга может служить
FIDONet (сеть ФИДО, Фидонет), в которой для связи между машинами используется как
Интернет, так и прямое соединение с помощью различных каналов связи (например, по
обычной телефонной сети с помощью модемов). — Примеч. ред.
414
Глава 5. Ввод и вывод информации
Рис. 5.14. Уровни системы ввода-вывода и основные функции каждого уровня
Когда работа с диском завершается, аппаратное обеспечение генерирует прерывание.
Запускается обработчик прерывания, чтобы определить, что произошло, то есть какое
устройство в данный момент требует к себе внимания. Затем он извлекает состояние
этого устройства и возобновляет работу приостановленного процесса для завершения
запроса на ввод-вывод и предоставления возможности продолжения работы пользо-
вательского процесса.
5.4. Диски
Теперь приступим к изучению некоторых реальных устройств ввода-вывода. Начнем
с дисков, в принципе несложных, но очень важных устройств. После них будут рас-
смотрены часы, клавиатуры и дисплеи.
5.4.1. Аппаратная часть дисков
Существует множество различных типов дисков. Наиболее распространенными из них
являются магнитные жесткие диски. Их характеризует сравнительно высокая скорость
чтения-записи данных, что позволяет им быть вполне приемлемой второстепенной
памятью (для реализации страничной организации памяти, файловой системы и т. д.).
Массивы, составленные из таких дисков, иногда используются для организации высо-
конадежного хранилища данных. Для распространения программ, данных и фильмов
не менее большое значение имеют разнообразные оптические диски (DVD и Blu-ray-
диски). И наконец, растущей популярностью благодаря высокой скорости работы
и отсутствию механических частей пользуются твердотельные диски. В следующих
разделах в качестве примера оборудования будут рассмотрены магнитные диски, а за-
тем дано описание программного обеспечения для дисковых устройств в целом.
Магнитные диски
Магнитные диски состоят из цилиндров, каждый из которых содержит столько до-
рожек, сколько у него имеется вертикально расположенных головок. Дорожки раз-
5.4. Диски
415
делены на сектора, количество которых по окружности обычно варьируется от 8 до
32 на гибких дисках и до нескольких сотен — на жестких дисках. Количество головок
варьируется от 1 до 16.
У дисков старого типа очень мало электронных компонентов, и они могут передавать
лишь простой последовательный поток битов. Основная часть работы на этих дисках
возлагается на контроллер. На дисках других типов, в частности дисках со встроенным
интерфейсом накопителей (Integrated Drive Electronics (IDE)) и с последовательным
интерфейсом SATA (Serial ATA), сам привод диска содержит микроконтроллер, кото-
рый берет на себя основную часть работы и позволяет настоящему контроллеру выда-
вать набор команд высокого уровня. Контроллер зачастую осуществляет кэширование
дорожек, переназначение для исключения из работы сбойных блоков и многое другое.
Свойством устройства, играющим существенную роль для драйвера диска, является
возможность контроллера выполнять одновременное позиционирование головок на
нужную дорожку на двух и более приводах. Это свойство называется совмещением
операций позиционирования головок
. Пока контроллер и программа ожидают за-
вершения позиционирования на одном приводе, контроллер может приступить к по-
зиционированию головок на другом. Многие контроллеры могут также заниматься
чтением или записью данных на одном приводе, выполняя позиционирование головок
на одном или нескольких других дисках, но контроллер гибкого диска не может читать
или записывать одновременно на двух приводах. (Чтение или запись требуют от кон-
троллера передавать биты за микросекунды, поэтому в одной передаче задействована
вся его вычислительная мощность.) Для жестких дисков со встроенными контролле-
рами складывается иная ситуация, и системы, имеющие более одного такого привода
жесткого диска, могут работать с этими приводами одновременно, по крайней мере
когда дело касается передачи данных между диском и буфером памяти контроллера.
Но в одно и то же время возможна только одна передача данных между контроллером
и оперативной памятью. Возможность одновременного осуществления двух и более
операций может существенно сократить среднее время доступа к диску.
В табл. 5.3 сравниваются параметры стандартного запоминающего устройства ориги-
нальной IBM PC с параметрами диска, изготовленного три десятилетия спустя, чтобы
показать, как изменились диски за это время. Интересно отметить, что не все пара-
метры улучшились в равной мере. Показатель среднего времени позиционирования
головок на нужную дорожку улучшился почти в девять раз, скорость передачи данных
увеличилась в 16 000 раз, в то время как емкость увеличилась в 800 000 раз. Такое соот-
ношение связано с относительно медленным совершенствованием механической части
на фоне более быстрого роста плотности битов на поверхностях записи.
Таблица 5.3. Параметры оригинального 360-килобайтного гибкого диска IBM PC
и жесткого диска Western Digital WD 3000 HLFS (Velociraptor)
Параметр
Гибкий диск IBM
емкостью 360 Кбайт
Жесткий диск
WD 3000 HLFS
Количество цилиндров
40
36 481
Дорожек на цилиндр
2
255
Секторов на дорожку
9
63 (в среднем)
Секторов на диск
720
586 072 368