Программный ввод-вывод
Есть три фундаментально различных способа осуществления операций ввода-вывода. В этом разделе мы рассмотрим первый из этих способов — программный ввод-вывод. В следующих двух разделах будут рассмотрены другие способы (ввод-вывод, управляемый с помощью прерываний, и ввод-вывод, использующий DMA). Проще всего организовать ввод-вывод, возложив всю работу на центральный процессор. Этот способ называется программным вводом-выводом.
Чтобы проиллюстрировать программный ввод-вывод, лучше всего обратиться к примеру. Рассмотрим пользовательский процесс, которому нужно распечатать на принтере строку, состоящую из восьми символов: «ABCDEFGH». Сначала он собирает строку в буфере, который находится в пространстве пользователя.
Затем пользовательский процесс запрашивает принтер для записи, совершая системный вызов для того, чтобы его открыть. Если принтер в данный момент задействован другим процессом, этот вызов потерпит неудачу и вернет код ошибки или заблокирует пользовательский процесс до тех пор, пока принтер не станет доступен, в зависимости от используемой операционной системы и параметров вызова. Как только пользовательский процесс получит принтер, он совершит системный вызов, предписывающий операционной системе осуществить распечатку строки на принтере.
Обычно операционная система копирует буфер со строкой в массив, скажем, р, в пространстве ядра, где к нему ей будет проще получить доступ (поскольку ядру, чтобы получить доступ к пространству пользователя, может потребоваться изменить карту памяти). Затем она проверяет принтер на доступность. Если принтер не доступен, она ждет, пока он освободится. Как только принтер будет доступен, операционная система копирует первый символ в регистр данных принтера, используя в данном примере ввод-вывод, отображаемые на пространство памяти. Это действие активирует принтер. Но символ может сразу же и не появиться, поскольку некоторые принтеры перед тем, как что-нибудь печатать, собирают в буфере строку или страницу.
Как только первый символ будет скопирован на принтер, операционная система проводит проверку принтера на готовность в получению следующего символа. Как правило, у принтера имеется второй регистр, через который передается его состояние. Запись в регистр данных приводит принтер в состояние занятости. Когда контроллер принтера обработает текущий символ, он обозначает свою доступность, устанавливая определенный бит в своем регистре состояния или помещая в него некоторое значение.
Программный ввод-вывод прост в реализации, но имеет недостаток связывания центрального процессора ожиданием на все время, пока не будет завершена операция ввода-вывода. Если на «печать» символа уходит очень мало времени (поскольку принтер только копирует новый символ во внутренний буфер), то активное ожидание будет вполне подходящим решением. Активное ожидание имеет смысл также и во встроенных системах, где центральному процессору больше нечем заняться. Но для более сложных систем, где у центрального процессора есть еще и другая работа, активное ожидание не подойдет. Им нужен более эффективный способ ввода-вывода.

