Программный ввод-вывод Существует три фундаментально различных способа осуществления операций ввода-вывода: · программный ввод- вывод · управляемым прерываниями вводом-выводом · вводом- выводом с использованием DMA. Простейший вид ввода-вывода состоит в том, что всю работу выполняет центральный процессор. Этот метод называется программным вводом-выводом. Действия, выполняемые операционной системой, в виде программы на языке С продемонстрированы в листинге 5.1. Сначала данные копируются в ядро. Затем операционная система входит в цикл, в котором на каждой итерации цикла печатает на принтере один символ. Существенный аспект программного ввода- вывода, ясно проиллюстрированный данным примером, состоит в том, что после печати каждого символа процессор в цикле опрашивает готовность устройства. Такое поведение процессора называется опросом или ожиданием готовности, а также активным ожиданием. Программный ввод-вывод очень легко реализуется, но его существенный недостаток состоит в том, что центральный процессор занимается на все время операции ввода-вывода. Даже если один символ «печатается» очень быстро, поскольку все, что нужно сделать принтеру — это поместить этот символ в свой внутренний буфер, принтер обычно не рассчитан на приём символов с той скоростью, с которой их может выдать быстрый процессор. Поэтому большую часть времени центральный процессор проведёт в ожидании готовности принтера, что является неэффективным использованием процессорного времени. Такой подход вполне допустим в примитивных встроенных системах, в которых у центрального процессора нет других задач; однако в более сложных, многозадачных системах такой подход неприемлем. Управляемый прерываниями ввод-вывод Рассмотрим теперь случай принтера, не буферизирующего символы, а печатающего их сразу по прибытии. Если принтер может печатать, скажем, 100 символов в секунду, то на печать каждого символа уходит 10 мс. Это значит, что после записи каждого символа в регистр данных принтера центральный процессор должен ждать в цикле целых 10 мс, пока ему не позволят записать в регистр следующий символ. Этого времени более чем достаточно для переключения контекста и запуска другого процесса на 10 мс, которые в противном случае просто будут потеряны. Предоставить центральному процессору возможность делать что-нибудь в то время, когда принтер переходит в состояние готовности, можно при помощи прерываний. Когда выполняется системный вызов печати строки буфер копируется в пространство ядра и первый символ строки копируется на принтер, как только принтер выставит бит готовности. После этого центральный процессор вызывает планировщик, который запускает какой-либо другой процесс. Процесс, попросивший распечатать строку, оказывается заблокирован на весь период печати строки Когда принтер напечатал символ и готов принять следующий, он инициирует прерывание. Это прерывание вызывает остановку текущего процесса и сохранение его состояния. Затем запускается процедура обработки прерывания от принтера. Грубый вариант этой программы показан на рис. 5.6, б. Если напечатаны все символы, обработчик прерывания
предпринимает необходимые меры для разблокировки процесса пользователя. В
противном случае он печатает следующий символ, подтверждает прерывание и
возвращается к процессу, выполнение которого было приостановлено прерыванием от
принтера. предпринимает необходимые меры для разблокировки процесса пользователя. В противном случае он печатает следующий символ, подтверждает прерывание и возвращается к процессу, выполнение которого было приостановлено прерыванием от принтера. Очевидный недостаток управляемого прерываниями ввода-вывода состоит в том, что прерывания происходят при печати каждого символа. Обработка прерываний занимает определённое время, поэтому такая схема не является эффективной. Решение этой проблемы заключается в использовании DMA. Идея состоит в том, чтобы позволить контроллеру DMA поставлять принтеру символы по одному, не беспокоя при
этом центральный процессор. По существу, этот метод почти не отличается от
программного ввода-вывода, с той лишь разницей, что всю работу вместо
центрального процессора выполняет контроллер этом центральный процессор. По существу, этот метод почти не отличается от программного ввода-вывода, с той лишь разницей, что всю работу вместо центрального процессора выполняет контроллер DMA. Наибольший выигрыш от использования DMA состоит
в уменьшении количества прерываний с одного на печатаемый символ до одного на
печатаемый буфер. Если символов много, а прерывания обрабатываются медленно, то
этот выигрыш весьма существенен. С другой стороны, контроллер в уменьшении количества прерываний с одного на печатаемый символ до одного на печатаемый буфер. Если символов много, а прерывания обрабатываются медленно, то этот выигрыш весьма существенен. С другой стороны, контроллер DMA обычно значительно уступает центральному процессору в
скорости. Если контроллер скорости. Если контроллер DMA не
может поддерживать полную скорость ввода или вывода с внешнего устройства, либо
у центрального процессора нет других задач во время ожидания прерывания от может поддерживать полную скорость ввода или вывода с внешнего устройства, либо у центрального процессора нет других задач во время ожидания прерывания от DMA, тогда оба предыдущих метода ввода-вывода (программный
и управляемый прерываниями) будут предпочтительнее. и управляемый прерываниями) будут предпочтительнее.
|