Асинхронное программирование и прерывания обработчиков исключений - PullRequest
1 голос
/ 22 марта 2019

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

1 Ответ

1 голос
/ 22 марта 2019

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

Поймите, что (в общем) есть много слоев, разделенных (часто намеренно абстрактными) интерфейсами. От самого низкого уровня до самого высокого уровня эти слои могут быть:

  • аппаратный интерфейс с платформой (например, контроллер прерываний, встроенный в чипсет)
  • аппаратные интерфейсы для различных типов устройств
  • абстрактные интерфейсы драйвера устройства
  • API ядра
  • язык «времени выполнения» (например, может быть, общая библиотека или библиотеки, но может быть виртуальная машина, такая как виртуальная машина Java)
  • программа, сгенерированная инструментами (например, компиляторы, линкеры)
  • исходный код разработчика

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

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

...