При проектировании и реализации программного интерфейса (API) ввода-вывода используются принципы уровней абстракции.
Модули операционной системы, реализующие системные вызовы для ввода-вывода, инкапсулируют поведение конкретных устройств ввода-вывода и обеспечивают более абстрактный интерфейс.
Более низкий уровень, уровень драйверов устройств, скрывает различия между контроллерами ввода-вывода конкретных устройств от ядра ОС.
Устройства ввода-вывода различаются по многим параметрам в силу их специфики, например:
Структура модулей ввода-вывода в ядре, разработанная и реализованная по этим принципам, изображена на рис. 21.4.
Классификация устройств ввода-вывода по различным характеристикам и их примеры приведены в таблица 3.
Типичный пример блочного устройства – устройство управления дисками. Оно выполняет команды вида: read, write, seek (считать, записать или найти блок с заданным номером). Устройство может выполнять чистый ввод-вывод или доступ к файловой системе. Имеется возможность доступа к файлу, отображаемому в память.
Типичные примеры символьных устройств – клавиатура, мышь, последовательные порты. Такие устройства выполняют команды вида: get, put (считать или записать символ). Библиотеки верхнего уровня в операционной системе для символьных устройств допускают построчное редактирование посимвольно введенной информации.
Сетевые устройства и их драйверы в ОС поддерживают традиционные или специфические сетевые протоколы и способы передачи информации через сеть. Например, ОС UNIX и Windows NT / 9x / 2000 поддерживают сокетный интерфейс. Сетевое устройство отделяет сетевой протокол от сетевой операции. Команды сетевых устройств включают функцию select – выбор сетевого пакета. Сетевые устройства различны по подходам к реализации (конвейеры, pipes, FIFO, потоки, очереди, почтовые ящики). В типичной конфигурации настольного или портативного компьютера присутствуют следующие сетевые устройства:
Устройства FireWire, по-видимому, из-за особой важности передачи мультимедийной информации, в современных компьютерах располагаются на материнской плате. В спецификации компьютера это обычно указывается аббревиатурой типа FireWire on board (на борту).
Операционные системы поддерживают для пользователей более высокоуровневую концепцию сетевого соединения (network connection),включающую информацию о сетевом устройстве, с помощью которого данное соединение осуществляется.
Сетевые протоколы подробно рассмотрены далее в специальных разделах курса.
Данные хронометрические устройства в компьютерной системе хранят информацию о текущем времени, прошедшем отрезке времени, установках таймера.
Как правило, операционная система использует программируемые интервалы времени для работы с таймером. Таким образом в системе организуются периодические прерывания с целью опроса устройств и диспетчеризации процессов.
В системе UNIX работу с часами и таймером поддерживает системный вызов и команда ioctl. Кроме того, в системе имеется процесс-демон cron, с помощью которого в системе организуются события, происходящие в назначенное время, - например, автоматическое резервное копирование всех наиболее важных файловых систем на ленту.
Для оптимизации ввода-вывода в системе поддерживается, помимо традиционного синхронного (блокируемого),также асинхронный ввод-вывод.
Блокируемый ввод-вывод основан на простой, интуитивно понятной парадигме: процесс задерживается, пока ввод-вывод не закончится. Он более прост для использования и понимания, но в силу своей недостаточной эффективности, недостаточен для некоторых применений. Для оптимизации ввода-вывода возврат из системного вызова для ввода-вывода может происходить по мере доступности информации. Применяется пользовательский интерфейс для копирования данных ( буферизация ). Ввод-вывод также часто реализуется с помощью многопоточности (multi-threading): ввод-вывод выделяется в отдельный поток. Из системных вызовов для ввода-вывода предусмотрен быстрый возврат с выдачей в качестве результата числа байтов, фактически прочитанного или записанного.
Асинхронный ввод-вывод основан на иной парадигме: процесс исполняется одновременно с выполнением ввода-вывода. Вследствие этого, он более сложен в использовании, так как большинство программистов до сих пор привыкли мыслить и реализовывать программы в последовательном стиле. После завершения асинхронного ввода-вывода подсистема ввода-вывода генерирует сигнал (исключение) в процессе, его использующем. Программирование асинхронного ввода-вывода основано на использовании пары операций типа начать асинхронный ввод-вывод и закончить асинхронный ввод-вывод (подождать его результатов). Такая схема чревата ошибками, так как программистам свойственно забывать завершающие действия, парные инициализирующим, если среда разработки им об этом не напоминает. Однако именно асинхронный ввод-вывод обеспечивает наибольшую эффективность.