Компьютер и внешние события
Мы ждали его слишком долго.
Что может быть глупее, чем ждать?
Б. Гребенщиков
Практически все функции современных вычислительных систем так или иначе сводятся к обработке внешних событий. Единственная категория приложений, для которых внешние события совершенно неактуальны – это так называемые пакетные приложения, чаще всего – вычислительные задачи.
Доля таких задач в общем объеме компьютерных приложений в наше время невелика и постоянно падает. В остальных же случаях, даже если не вспоминать о специализированных управляющих компьютерах, серверы обрабатывают внешние по отношению к ним запросы клиентов, а персональный компьютер – реагирует на действия пользователя.
Различие между управляющими системами (приложениями реального времени) и системами общего назначения (термин – система разделенного времени вышел из употребления и не всегда точно отражает суть дела) состоит лишь в том, что первые должны обеспечивать гарантированное время реакции на событие, в то время как вторые "всего лишь" – предоставить хорошее среднее время такой реакции и/или обработку большого количества событий в секунду.
Примечание
Время обработки одного события и количество событий, обрабатываемых в единицу времени, далеко не всегда являются жестко взаимосвязанными – ведь при многопоточной обработке система может обрабатывать несколько событий параллельно.
Единственный способ, которым фон-неймановский компьютер может отреагировать на что бы то ни было – это исполнить программу, последовательность команд.
В случае внешнего события, естественным решением кажется предоставить команду условного перехода, условием которого является признак события.
В системах команд микроконтроллеров часто реализуют именно такие переходы (см. например табл. 2.2). В качестве признака события в этом случае используется значение одного из битов специального регистра, биты которого соответствуют входам микросхемы контроллера. Бит равен единице, если на соответствующий вход подано высокое напряжение, и нулю – если низкое.
Наличие таких команд полезно, но решает проблему не полностью: да, сели событие произошло, мы можем вызвать программу и осуществить реакцию но что мы будем делать, если его еще не происходило?