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