Оповещение ввода-вывода
Оповещаемый ввод-вывод — это метод, с помощью которого потоки приложений обрабатывают асинхронные запросы ввода-вывода, только если они находятся в состоянии оповещения.
Чтобы понять, когда поток находится в состоянии оповещений, рассмотрим следующий сценарий:
- Поток инициирует асинхронный запрос на чтение, вызывая ReadFileEx с указателем на функцию обратного вызова.
- Поток инициирует асинхронный запрос на запись путем вызова WriteFileEx с указателем на функцию обратного вызова.
- Поток вызывает функцию, которая получает строку данных с удаленного сервера базы данных.
В этом сценарии вызовы ReadFileEx и WriteFileEx, скорее всего, возвращаются перед вызовом функции на шаге 3. Когда они выполняются, ядро помещает указатели на функции обратного вызова в очереди асинхронного вызова процедур потока (APC). Ядро поддерживает эту очередь специально для хранения возвращаемых данных запроса ввода-вывода, пока не будет обрабатываться соответствующим потоком.
После завершения получения строки поток возвращается из функции, его наивысший приоритет — обрабатывать возвращенные запросы ввода-вывода в очереди путем вызова функций обратного вызова. Для этого необходимо ввести оповещенное состояние. Поток может сделать это только путем вызова одной из следующих функций с соответствующими флагами:
- SleepEx
- WaitForSingleObjectEx
- WaitForMultipleObjectsEx
- SignalObjectAndWait
- MsgWaitForMultipleObjectsEx
Когда поток входит в оповещенное состояние, происходят следующие события:
- Ядро проверяет очередь APC потока. Если очередь содержит указатели функции обратного вызова, ядро удаляет указатель из очереди и отправляет его в поток.
- Поток выполняет функцию обратного вызова.
- Шаги 1 и 2 повторяются для каждого указателя, оставшегося в очереди.
- Если очередь пуста, поток возвращается из функции, которая помещается в оповещенное состояние.
В этом сценарии после ввода оповещенного состояния поток будет вызывать функции обратного вызова, отправленные в ReadFileEx и WriteFileEx, а затем вернуться из функции, которая помещала ее в оповещенное состояние.
Если поток вводит оповещенное состояние, пока его очередь APC пуста, выполнение потока будет приостановлено ядром до тех пор, пока не произойдет одно из следующих действий:
- Объект ядра, который ожидается, становится сигналом.
- Указатель функции обратного вызова помещается в очередь APC.
Поток, использующий асинхронные запросы ввода-вывода, которые используют оповещенные операции ввода-вывода, эффективнее, чем при простом ожидании флага события в структуре OVERLAPPED, а механизм ввода-вывода оповещений менее сложный, чем порты завершения ввода-вывода . Однако оповещенный ввод-вывод возвращает результат запроса ввода-вывода только потоку, инициируемому им. Порты завершения ввода-вывода не имеют этого ограничения.
Связанные разделы