Сообщение об ошибках

 

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

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

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

 

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

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

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

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

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

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

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

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