Как ОС или системная программа ожидает ввода пользователя? - PullRequest
1 голос
/ 18 февраля 2010

Я из мира веб-программирования, и обычно сервер устанавливает суперглобальную переменную с помощью указанного метода (get, post и т. Д.), Который делает доступными данные, вводимые пользователем в поле. Другой способ - использовать AJAX для регистрации метода обратного вызова для события, которое объект AJAX XMLhttpRequest будет инициировать после уведомления браузером (я предполагаю ...). Поэтому я думаю, что мой вопрос будет, если есть какой-то интерфейс диспетчеризации, с которым код системного программиста должен взаимодействовать, чтобы выполнять в ответ на пользовательский ввод, или программист непосредственно контролирует процесс «ожидания»? А если есть диспетчеризация, есть ли в ОС структура цикла, которая ожидает определенного события?

Меня попросили задать этот вопрос здесь, потому что я нахожусь в базовом классе логики программирования, и профессор не ответит на такой "сложный" вопрос, как этот. Моя книга дает пример расплывчатого псевдокода, например:

    //start
    sentinel_val = 'stop';
    get user_input;
while (user_input not equal to sentinel_val)
     {
         // do something.
         get user_input;
     }
     //stop

Этот пример наводит меня на мысль, 1) что, если от пользователя не получено никакого ввода, цикл продолжит повторять последовательность «сделать что-то» со старым или без ввода до тех пор, пока новый вход волшебным образом не появится, а затем он будет повторяться снова с этим или нулевым значением. Кажется, что книга пыталась использовать пример инициализации и чтения из файла, чтобы показать, как программа получит данные из событийно-ориентированного ввода, не так ли?

Я в замешательстве: (

Ответы [ 4 ]

4 голосов
/ 18 февраля 2010

На самом низком уровне вход в компьютер является асинхронным - это происходит через «прерывания», которые, по сути, являются чем-то внешним по отношению к ЦП (контроллеру клавиатуры), отправляющему сигнал ЦП, который говорит «остановите то, чтоделаю и принимаю эти данные ".(Это сложно, но это общая идея).Поэтому процессор останавливается, захватывает нажатие клавиши и помещает его в буфер для чтения, а затем продолжает делать то, что делал до прерывания.

Очень похожие вещи происходят с входящим сетевым трафиком и результатамичтение с диска и т. д.

На более высоком уровне оно становится более зависимым от используемой операционной системы или платформы.

При вводе с клавиатуры может быть заблокирован процесс (приложение, в основном), ожидающий пользовательского ввода.Этот «блок» не означает, что компьютер просто сидит в ожидании, он позволяет запускать другие процессы.Но когда приходит результат клавиатуры, он разбудит того, кто его ожидал.

С точки зрения этого процесса ожидания они вызвали некоторую функцию "get_next_character ()", и эта функция вернулась схарактер.И т. Д.

Честно говоря, как все эти вещи связаны друг с другом, очень интересно и полезно понять.:)

2 голосов
/ 18 февраля 2010

ОС управляется аппаратным событием (называемым прерыванием). ОС не ждет прерывания, вместо этого она выполняет специальную инструкцию, чтобы ЦП засыпал в цикле. Если происходит аппаратное событие, будет вызвано соответствующее прерывание.

1 голос
/ 18 февраля 2010
It seems the book has tried to use the example of priming and reading from a file
to convey how a program would get data from event driven input, no?

Да, именно это и делает книга. Фактически ... операционная система Unix построена на идее абстрагирования всех входных и выходных данных любого устройства, чтобы они выглядели так.

В действительности большинство операционных систем и оборудования используют прерывания, которые переходят к тому, что мы можем назвать подпрограммой, для выполнения низкоуровневого чтения данных, а затем возвращаем управление обратно операционной системе.

Кроме того, в большинстве систем многие устройства работают независимо от остальной части операционной системы и предоставляют API высокого уровня для операционной системы. Например, порт клавиатуры (или, может быть, лучший пример - сетевая карта) в компьютерном процессе прерывает себя, а затем драйвер клавиатуры представляет операционной системе другой API-интерфейс. Вы можете посмотреть на стандарты для устройств, чтобы увидеть, что это такое. Если вы хотите знать API, который представляет порт клавиатуры, например, вы можете посмотреть исходный код драйвера клавиатуры в дистрибутиве linix.

1 голос
/ 18 февраля 2010

Основное объяснение, основанное на моем понимании ...

Ваша псевдо-функция get user_input часто выглядит как readLine. Это означает, что функция будет блокироваться, пока прочитанные данные не будут содержать символ новой строки.

Ниже этого ОС будет использовать прерывания (это означает, что она не имеет дело с клавиатурой без необходимости, а только при необходимости), чтобы позволить ей реагировать, когда пользователь нажимает некоторые клавиши. Прерывание клавиатуры заставит выполнение перейти к специальной подпрограмме, которая заполнит входной буфер данными с клавиатуры. Затем ОС позволит соответствующему процессу - обычно активному - использовать функции readLine для доступа к этим данным.

Там намного сложнее, но это простое представление. Если кто-то предложит лучшее объяснение, я охотно преклонюсь перед превосходными знаниями.

...