Так что нужна аппаратная поддержка. (выделенный вывод, выделенный для ввода-вывода), так как асинхронное программирование может работать без аппаратной поддержки, как операционные системы отправляют «уведомление» о том, что результат готов, приходят и получают его «в текущий процесс». Насколько я понимаю, без аппаратная поддержка, мы можем достичь ее только многопоточностью или многопроцессорностью.
Поймите, что (в общем) есть много слоев, разделенных (часто намеренно абстрактными) интерфейсами. От самого низкого уровня до самого высокого уровня эти слои могут быть:
- аппаратный интерфейс с платформой (например, контроллер прерываний, встроенный в чипсет)
- аппаратные интерфейсы для различных типов устройств
- абстрактные интерфейсы драйвера устройства
- API ядра
- язык «времени выполнения» (например, может быть, общая библиотека или библиотеки, но может быть виртуальная машина, такая как виртуальная машина Java)
- программа, сгенерированная инструментами (например, компиляторы, линкеры)
- исходный код разработчика
Во всех этих слоях вещей есть (полезные) ложь и обман. Вы можете подумать, что вы установили переменную X в значение 123, но компилятор решил оптимизировать код и сделать что-то еще. Вы можете подумать, что получили уведомление от ОС, но уведомление фактически пришло из среды выполнения языка, и ОС никогда не отправляла его. Вы могли бы подумать, что уведомление перезапустило поток, но потоки - большая ложь от кого-то (возможно, компилятор, возможно время выполнения, возможно ядро).
Чтобы выяснить точную механику того, как работают асинхронные уведомления и что это на самом деле на всех разных уровнях; вам нужно знать гораздо больше информации о конкретном сценарии (какое уведомление, для какой версии, какой язык скомпилирован, с каким компилятором, с какими настройками работает на какой ОС, на какой архитектуре / оборудовании).