Способы работы с устройствами IO
Способы работы с устройствами I/O
1) Программный (простой)
2) Управляемый прерываниями.
3) С использованием DMA.
Рассмотрим подробнее:
1) Программный ввод-вывод
В этом случае всю работу выполняет центральный процессор.
Рассмотрим процесс печати строки ABCDEFGH этим способом.
Рекомендуемые материалы
Этапы печати строки ABCDEFGH
Алгоритм печати:
1. Строка для печати собирается в пространстве пользователя.
2. Обращаясь к системному вызову, процесс получает принтер.
3. Обращаясь к системному вызову, процесс просит распечатать строку на принтере.
4. Операционная система копирует строку в массив, расположенный в режиме ядра.
5. ОС копирует первый символ в регистр данных принтера, который отображен на памяти.
6. Символ печатается на бумаге.
7. Указатель устанавливается на следующий символ.
8. Процессор ждет, когда бит готовности принтера выставится в готовность.
9. Все повторяется.
При использовании буфера принтера, сначала вся строка копируется в буфер, после этого начинается печать.
Программа:
Copy_from_uesr (buf, p, count);
For (i=0; i<count; i++)
{ while (*printer_status_reg)!=READY; ждем, пока принтер станет доступным
*printer_data_reg=p[i];}
2) Управляемый прерываниями ввод-вывод
Если в предыдущем примере буфер не используется, а принтер печатает 100 символов в секунду, то на каждый символ будет уходить 10мс, в это время процессор будет простаивать, ожидая готовности принтера.
Рассмотрим тот же пример, но с небольшим усовершенствованием.
Алгоритм печати:
1. До пункта 8 тоже самое.
2. Процессор не ждет готовности принтера, а вызывает планировщик и переключается на другую задачу. Печатающий процесс блокируется.
3. Когда принтер будет готов, он посылает прерывание процессору.
4. Процессор переключается на печатающий процесс.
Программа:
Copy_from_uesr (buf, p, count);
enable_interrupts(); разрешение прерывания
while (*printer_status_reg)!=READY;
*printer_data_reg=p[0]; записываем 1ый символ
scheduler(); планировщик; переходим к выполнению другой задачи
if (count>0)
{ *printer_data_reg=p[i];
i++; count--;}
Обратите внимание на лекцию "2 - Проницаемость и пористость".
else
{unblok_user();} когда все напечаталось, блокируем
3) Ввод-вывод с использованием DMA
Недостаток предыдущего метода в том, что прерывание происходит при печати каждого символа.
Алгоритм не отличается, но всю работу на себя берет контроллер DMA, а не ЦП.
Программа аналогичная, ее выполняет контроллер DMA.