Лучший способ узнать это - взглянуть на операционную систему, которая имеет синхронные и асинхронные системные службы ввода-вывода. Windoze под одеялом и (лучший пример) VMS такие операционные системы.
В операционной системе VMS SYS $ QIO и SYS $ QIOW выполняют операции ввода-вывода. Две системные службы имеют идентичные параметры. Один из этих параметров (необязательный) - это адрес подпрограммы, вызываемой при завершении операции ввода / вывода (известной как AST), а другой (опция) - это параметр, передаваемый этой подпрограмме.
Если ваше приложение вызывает SYS $ QIO, эта функция возвращается сразу после того, как операции ввода-вывода поставлены в очередь, и приложение может продолжить выполнять другую обработку. Прикладная программа должна полагаться на процедуру обратного вызова, чтобы знать, когда будет выполнен ввод-вывод.
Если ваше приложение вызывает SYS $ QIOW, эта функция ожидает (приостанавливает процесс) до завершения операции ввода-вывода.
Когда такой неблокирующий ввод / вывод доступен как в SYS $ QIO, ваше приложение может устанавливать циклы асинхронных операций. Допустим, ваше приложение хочет обрабатывать произвольное количество сетевых подключений, куда данные могут входить в любое время. Для каждого соединения вы вызываете SYS $ QIO для чтения из соединения. Ваш процесс не ждет, поэтому он может сделать это для любого количества соединений. Когда поступают данные, вызывается функция AST, и вы снова вызываете SYS $ QIO (предоставляя ту же функцию, что и AST) для следующего чтения.
Используя этот метод, одна программа может обрабатывать сотни (как это позволяют системные параметры) сетевых подключений.