Ожидание в готовности к вводу/выводу данных (I/O)


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

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

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

В этом сценарии вызовы функций ReadFile и WriteFile наиболее вероятно возвратят значение перед тем, как произойдет вызов функции в шаге 3. Когда они это делают, ядро ОС помещает указатели на функции обратного вызова в очереди потока Асинхронного вызова процедур (APC). Ядро специально обслуживает эту очередь, чтобы удерживать возвращаемые данные запроса ввода-вывода (I/O) до тех пор, пока они не будут обработаны соответствующим потоком.

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

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

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

В этом сценарии, поток один раз вводит состояние ожидания в готовности, он отправляет вызовы функций обратного вызова из ReadFile и WriteFile, а затем возвращает значение из функции, которая поместила его в состояние ожидания в готовности.

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

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

Назад в оглавление
На главную страницу
Переведено 12.08.2010 13:54 ©Copyright V. Sokovikov
Hosted by uCoz