Оповестительный ввод-вывод
октября 12 2009 by admin in Обязательный материалТретий метод, который можно использовать для получения уведомлений о завершении ввода-вывода, называется оповестительный ввод-вывод (alertable I/O). Поначалу Microsoft анонсировала оповестительный ввод-вывод как идеальный механизм для разработки высокопроизводительных масштабируемых приложений. Однако разработчики скоро пришли к выводу, что он нежизнеспособен.
Я немало работал с оповестительным вводом-выводом и скажу вам-, лучше с ним не связываться. Однако, реализуя оповестительный ввод-вывод, Microsoft добавила в ОС исключительно ценную и полезную инфраструктуру. Читая этот раздел, больше уделяйте внимания этой инфраструктуре, и не увязните в подробностях реализации ввода-вывода.
При создании потока система создает также связанную с ним очередь асинхронно вызываемых процедур (или АРС-очередь, от АРС — asynchronous procedure call). Выдавая запрос ввода-вывода, вы можете указать драйверу устройства, что необходимо занести запись в АРС-очередь вызывающего потока. Для этого вызовите функцию ReadFileEx или WriteFileEx.
Когда вы выдаете запрос асинхронного ввода-вывода с помощью ReadFileEx и WriteFileEx, они передают адрес этой процедуры драйверу устройства. Завершив выполнение запроса ввода-вывода, драйвер устройства добавляет запись в АРС-очередь выдавшего запрос потока. Запись содержит адрес процедуры завершения и адрес структуры OVERLAPPED, использовавшейся при инициации запроса.
Когда оповестительный ввод-вывод завершается, драйвер устройства не пытается генерировать событие. Фактически устройство вообще не ссылается на элемент hEvent структуры OVERLAPPED, так что можете применять этот элемент по собственному усмотрению.
Когда поток ожидает оповещения (об этом мы скоро поговорим), система проверяет АРС-очередь и для каждого элемента этой очереди вызывает функцию завершения, передавая код ошибки ввода-вывода, число переданных байт и адрес структуры OVERLAPPED. Заметьте: код ошибки и число переданных байт могут быть также получены из элементов Internal и InternalHigh структуры OVERLAPPED. (Я уже говорил, что изначально Microsoft не хотела документировать эту возможность, поэтому эти значения передавались как параметры процедуры завершения.)