В последнее время я работаю с основными понятиями параллелизма в программировании. Одна мысль, которая пришла мне в голову, была одновременным вводом с клавиатуры. В программировании метод или функция вызывается через прослушиватель событий, который одновременно выполняет только одно нажатие клавиши. Программист должен запрограммировать код определенным образом для одновременного / многократного нажатия клавиш. Мне интересно, как аппаратно обрабатывает «по-настоящему одновременный» ввод. Существует ли какой-то механизм, который автоматически расставляет приоритеты для воспринимаемых входов в определенном порядке?
2 ответа
Каждое нажатие или отпускание клавиши будет передаваться с клавиатуры на компьютер через USB-кабель, поэтому клавиатура не может отправлять истинные одновременные операции с клавишами. Клавиатура просто отправляет сообщения, когда клавиша нажата или отпущена. Компьютер сообщит приложению, что нажаты две клавиши, если одно сообщение "нажата клавиша" поступило до сообщения "клавиша отпущена" для последней нажатой клавиши.
Принимая ваш конкретный вопрос о вводе с клавиатуры. Компьютер получает нажатия клавиш по последовательному каналу связи, поэтому нажатие клавиши не принимаются одновременно , как они должны быть - эр - последовательный.
Сама клавиатура представляет собой небольшой процессор, который считывает нажатия клавиш и отправляет их на компьютер по последовательному каналу связи. Давайте рассмотрим случай, когда кому-то удается нажать две клавиши «одновременно» (что бы это ни значило с точки зрения временной точности). Процессор клавиатуры сканирует матрицу цифровых входов, которые дают ему нажатия клавиш. Он всегда будет видеть одно нажатие перед другим, просто из-за сканирования по клавишам. Даже в этом сканировании требуется микросекунды, одно нажатие будет обнаружено раньше другого.
Действительно возможно, что благодаря этому сканированию прессы могут быть очень близко друг к другу, но второе видно первым.
В более общей области управления процессами в реальном времени, вероятно, используется механизм прерывания, посредством которого входы прерывают процессор, чтобы информировать его о событии. Опять же, даже если события не могут быть разделены во времени, одно прерывание попадет в процессор раньше другого.
Прилично написанное управляемое событиями программное обеспечение должно учитывать тот факт, что два события могут быть обнаружены очень близко друг к другу и фактически могут быть просмотрены в обратной последовательности.
Другие ошибки секвенирования можно найти в случаях, когда процессоры ввода-вывода сообщают компьютеру контроллера с протоколом, который эффективно агрегирует входные данные.
Таким образом, действительно ли может быть достигнут одновременный ввод - нет.