Все верно. Просто ОС управляет каналом, а не самими устройствами. Чтобы понять, как это происходит, давайте понаблюдаем за поваром и актером. Взаимодействие актера в роли трактирщика и повара (то есть процессора который выполняет программу ОС, и канала) выглядит так: трактирщик говорит повару: "рецепт номер такой-то, столько-то порций", и уходит. У него много дел. А повар ставит этот заказ в свою очередь. Повар, кстати, тоже мастер на все руки и несколько блюд он может готовить одновременно. Хватило бы места на плите. Как только какой-нибудь заказ будет готов, повар позовет трактирщика. В этот момент актер бросает играть роль очередного посетителя, перевоплощается в трактирщика (это произошло прерывание) и идет разбираться, что там у повара случилось. Если с заказом все в порядке, трактирщик отнесет его ожидающему посетителю. После чего этот посетитель оказывается в числе тех, чьи роли актер может продолжать играть дальше. Вот и мой запрос выполнен. Оператор нажал в последний раз клавишу на дисплее, канал передал данные в оперативную память. Сообщил об этом процессору. Процессор прекратил выполнять какой-то процесс (произошло прерывание), начал работать процесс ОС, который сейчас передаст процессор мне. Нам пора прощаться, а вы пока можете посмотреть сравнительные действия, продолжающие аналогию между нашим театром и ЭВМ третьего поколения.
Трактирщик встретил посетителя, взял у него роль и записал ее в книгу ролей. Ос разместила в оп программу и преобразовала ее пригодный для выполнения вид. Точнее, актер, играя роль трактирщика, встретил посетителя… Точнее, процессор, выполняя одну из программ ОС, разместил в оп программу… Актер (по велению трактирщика!) Начал играть роль посетителя, вошел, сел за столик, прочел меню и позвал трактирщика. Процессор, по велению ОС переключился на процесс пользователя, который начал вычисления и работал до тех пор, пока ему не понадобились услуги ОС для ввода данных.
Актер перевоплотился в трактирщика, и играя его роль, подошел к посетителю и принял заказ. Произошло прерывание: процессор прервал выполнение программы пользователя и начал выполнять программу ОС. Процесс управления вводом-выводом ОС стал активным. Он принял у процесса пользователя заказ на ввод данных. Трактирщик отнес заказ повару. Процесс управления вводом-выводом скомандовал каналу ввода-вывода выполнить операцию ввода. Точнее, актер, играя роль трактирщика, приказал повару выполнить заказ. Точнее, процессор, выполняя программу управления вводом-выводом ОС, скомандовал каналу выполнить операцию ввода. Трактирщик решил, что дальше нужно играть роль сидящего у окна посетителя с солидным видом. Его блюдо уже готово. Процесс ОС, который называется "диспечер" выбрал для работы самый приоритетный среди готовых к работе процессов. Актер перевоплотился в указанного посетителя и стал есть его блюда. Процессор получил для выполнения от ОС выбранный процесс и начал выполнять его программу. Так прошло минут пять.
Так прошло миллисекунд пять. Повар прокричал с кухни что готово какое-то блюдо. Канал запросил прерывание. Актер бросил есть блюдо за посетителя и побежал на кухню в качестве трактирщика разбираться. Процессор прервался. Управление получила ОС. Ее процесс разобрался в возникшей ситуации. Выяснилось, что готово блюдо посетителя в пенсне и серой шляпе. Трактирщик отнес ему блюдо и перевел посетителя в разряд тех, чью роль можно играть. Выяснилось, что выполнен запрос процесса N16. Процесс управления вводом-выводом передал процессу N16 данные и отметил его, как готовый к выполнению. Затем трактирщик определил, кто из имеющих еду посетителей самый солидный, и актер начал играть его роль… Затем "диспечер" определил, кто из готовых к выполнению процессов самый приоритетный, и передал ему управление процессором…
Евгений Лишак. Записки парасистемного программиста. Журнал «Звание — сила», 1984, № 8, с. 6–7