2017-02-14 22 views
1

Рассмотрим следующий случай в многоядерном процессоре и для простоты позволяет использовать ядро ​​Linux.Два заблокированных процесса ввода-вывода в ОС и событие нажатия клавиши

wait_char() 
{ 
    while (1) 
    { 
     ch = readchar(); 
     putchar(ch); 
    } 
} 
  1. открыть два терминала А и В, и выполнить код wait_char() в каждом
  2. Как процесс А и процесс В блокируются и положить в очереди ввода/вывода ожидает для клавиатуры прерывания приходить , Допущу, А впереди B в этой очереди
  3. Теперь я выбрал терминал В частности и ввести ключ от моей клавиатуры
  4. CPU работает клавиатура процедуру обработки прерываний в режиме ядра
  5. Естественно я буду видеть, введенный ключ эхо в консоли.

Теперь как выяснилось, что это ядро ​​для B (кто был в очереди ввода-вывода)?

+0

Я угадаю, поскольку я не уверен на 100%. Баш будет 'fork' и' execv' для введенной вами программы. Детский и родительский процесс разделяют все записи в таблице «PD», включая 'stdin' и' stdout'. Если вы введете свой ключ в первый открытый bash, в котором вы запустили программу A, и введите там свой вход, bash прервет и таким образом OS позаботится об этом входе. Только программа A и этот bash получили этот вход. Не программа B/Второе открытое bash. –

ответ

0

Процессы не находятся в очереди, ожидающей ввода-вывода. Когда вы вводите что-то на Терминале B, драйвер устройства знает, что он пришел из терминала B. Вероятно, устройство вызовет прерывание. Затем ОС отправит данные тому, кто имеет запрос на чтение, находящийся на рассмотрении в терминале B.

Если у вас было два процесса, считываемых с терминала B, то случайным является то, что он получает символ.