Основы асинхронного ввода-вывода
октября 12 2009 by admin in Обязательный материалПо сравнению с другими операции ввода-вывода — одни из самых медленных и непредсказуемых. Центральный процессор выполняет арифметические вычисления и даже перерисовывает экран гораздо быстрее, чем считывает или записывает данные в файл или обменивается ими по сети. Асинхронный ввод-вывод позволяет эффективнее задействовать ресурсы и, таким образом, создавать более эффективные приложения.
Рассмотрим поток, выдающий запрос асинхронного ввода-вывода на устройство. Этот запрос передается драйверу устройства, который отвечает за выполнение собственно ввода-вывода. Пока драйвер ожидает ответа от устройства, поток приложения не приостанавливается в ожидании совершения запроса ввода, а продолжает работу и выполняет другие задачи.
В какой-то момент драйвер устройства завершает выполнение поставленного в очередь запроса и должен сообщить приложению, что данные отосланы, приняты или произошла ошибка. О том, как драйвер устройства уведомляет о завершении ввода-вывода, вы узнаете из следующего раздела. А сейчас посмотрим, как обслуживается очередь запросов асинхронного ввода-вывода. Обслуживание очередей запросов асинхронного ввода-вывода — важнейший вопрос при разработке высокопроизводительных масштабируемых приложений. Ему посвящен оставшийся материал этой главы.
Чтобы получить асинхронный доступ к устройству, нужно вызвать функцию CreateFile с установленным в параметре dwFlagsAndAttrs флагом FILE_ FLAG_OVERLAPPED, который уведомляет систему о вашем намерении получить асинхронный доступ к устройству.
Чтобы поставить запрос ввода-вывода в очередь драйвера устройства, используются функции ReadFile и WriteFile (см. раздел «Реализация синхронного ввода-вывода»). Для удобства я еще раз приведу их прототипы:
BOOL ReadFile( HANDLE hfile, PVOID pvBuffer, DWORD nNumBytesToRead, PDWORD pdwNumBytes, OVERLAPPED* pOverlapped);
BOOL WriteFile( HANDLE hfile, CONST VOID «pvBuffer, DWORD nNumBytesToWrite, PDWORD pdwNumBytes, OVERLAPPED* pOverlapped);
При вызове обе эти функции проверяют, открыто ли устройство, опреде ляемое параметром hfile с флагом FILE_FLAG_OVERLAPPED. Если флаг установ лен, функции выполняют асинхронный ввод-вывод. Между прочим, вызывав любую из этих функций для асинхронного ввода-вывода, можно (обычно та1 и делают) устанавливать параметр pdwNumBytes в NULL. В конце концов вь ведь ожидаете, что эти функции вернут управление до того, как выполнится запрос ввода-вывода, — какой смысл рассматривать число переданных бай тов после возврата из этой функции!