1. Блок-ориентированное устройство – хранит информацию в блоках фиксированного размера, каждый из которых имеет собственный адрес. Пример: жесткий диск.
2. Байт-ориентированное устройство – не адресуемо и генерирует или потребляет последовательности байтов. Пример: монитор, сканер, сетевой адаптер.
Внешнее устройство, как правило, состоит из механического и электронного компонента (контроллер или адаптер). Каждый контроллер имеет несколько регистров, использующихся для взаимодействия с ЦП и являющихся частью физического адресного пространства. Адреса регистров ввода/вывода могут образовывать свое адресное пространство.
Программное обеспечение ввод/вывода представляет собой несколько уровней, экранирующих особенности аппаратуры. Большинство операций ввода/вывода выполняется асинхронно, но представляется для пользовательских программ в синхронном виде.
Функциями подсистемного ввода/вывода являются:
1. изоляция устройств и взаимодействия с ними
2. единообразное именование
3. обработка ошибок
Большая часть ПО ввода/вывода не зависит от устройств и выполняет функции:
1. Обеспечение общего интерфейса к драйверам устройств.
2. Именование устройств.
3. Защита устройств.
4. Обеспечение независимого размера блоков.
5. Буферизация.
6. Распределение памяти для блок-ориентированных устройств.
7. Распределение и освобождение выделенных устройств.
8. Уведомление об ошибках.
Пользовательский слой ПО ввода/вывода включает:
· системные библиотеки;
· спулинг (spooling) – это способ работы с выделенными устройствами в мультипрограммной среде. Спул – это буфер, содержащий входные или выходные данные устройства, разделяемый системными средствами между процессами.
С каждым устройством связана очередь запросов процессов, находящихся в состоянии ожидания, и запросов, выполняющихся асинхронно. Каждая очередь управляется отдельно в соответствии с системой планирования.
Задача планирования использования устройства может быть реализована:
1. В базовой подсистеме ввода/вывода.
2. Внутри драйвера соответствующего устройства.
Приложения, библиотечные функции – пользовательский слой;
Системные вызовы, система буферных данных – независимый слой;