Поделиться через


Оповещение ввода-вывода

Оповещаемый ввод-вывод — это метод, с помощью которого потоки приложений обрабатывают асинхронные запросы ввода-вывода, только если они находятся в состоянии оповещения.

Чтобы понять, когда поток находится в состоянии оповещений, рассмотрим следующий сценарий:

  1. Поток инициирует асинхронный запрос на чтение, вызывая ReadFileEx с указателем на функцию обратного вызова.
  2. Поток инициирует асинхронный запрос на запись путем вызова WriteFileEx с указателем на функцию обратного вызова.
  3. Поток вызывает функцию, которая получает строку данных с удаленного сервера базы данных.

В этом сценарии вызовы ReadFileEx и WriteFileEx, скорее всего, возвращаются перед вызовом функции на шаге 3. Когда они выполняются, ядро помещает указатели на функции обратного вызова в очереди асинхронного вызова процедур потока (APC). Ядро поддерживает эту очередь специально для хранения возвращаемых данных запроса ввода-вывода, пока не будет обрабатываться соответствующим потоком.

После завершения получения строки поток возвращается из функции, его наивысший приоритет — обрабатывать возвращенные запросы ввода-вывода в очереди путем вызова функций обратного вызова. Для этого необходимо ввести оповещенное состояние. Поток может сделать это только путем вызова одной из следующих функций с соответствующими флагами:

Когда поток входит в оповещенное состояние, происходят следующие события:

  1. Ядро проверяет очередь APC потока. Если очередь содержит указатели функции обратного вызова, ядро удаляет указатель из очереди и отправляет его в поток.
  2. Поток выполняет функцию обратного вызова.
  3. Шаги 1 и 2 повторяются для каждого указателя, оставшегося в очереди.
  4. Если очередь пуста, поток возвращается из функции, которая помещается в оповещенное состояние.

В этом сценарии после ввода оповещенного состояния поток будет вызывать функции обратного вызова, отправленные в ReadFileEx и WriteFileEx, а затем вернуться из функции, которая помещала ее в оповещенное состояние.

Если поток вводит оповещенное состояние, пока его очередь APC пуста, выполнение потока будет приостановлено ядром до тех пор, пока не произойдет одно из следующих действий:

  • Объект ядра, который ожидается, становится сигналом.
  • Указатель функции обратного вызова помещается в очередь APC.

Поток, использующий асинхронные запросы ввода-вывода, которые используют оповещенные операции ввода-вывода, эффективнее, чем при простом ожидании флага события в структуре OVERLAPPED, а механизм ввода-вывода оповещений менее сложный, чем порты завершения ввода-вывода . Однако оповещенный ввод-вывод возвращает результат запроса ввода-вывода только потоку, инициируемому им. Порты завершения ввода-вывода не имеют этого ограничения.

асинхронные вызовы процедур