Составители:
Рубрика:
операции ввода встречает символ EOF, она тем или иным образом оповеща-
ет об этом вызывающую программу. В частности, традиционный вызов
ReadFile() устанавливает количество прочитанных байт равным нулю. Если
символ EOF встречается в процессе выполнения перекрывающегося вызова
ReadFile(), вызов возвращает ошибку. В этом случае значение, возвращаемое
функцией GetLastError(), будет равно ERROR_HANDLE_EOF. Символ EOF
может встретиться непосредственно при обращении к функции ReadFile()
или позже, в процессе выполнения операции ввода/вывода.
4.4. Использование портов завершения ввода/вывода
Перекрывающийся ввод/вывод обладает массой ограничений. Фактически
при использовании перекрывающегося ввода/вывода для обмена данными с неко-
торым объектом (файлом или устройством) используется отдельный программный
поток. Если вы планируете, например, использовать перекрывающийся
ввод/вывод при разработке сетевого сервера, обслуживанием каждого из клиентов
будет заниматься отдельный программный поток. Такая схема будет отлично ра-
ботать в случае, если число клиентов небольшое. Однако вряд ли удастся исполь-
зовать подобный подход для обеспечения работы высокопроизводительного сер-
вера, обслуживающего одновременно достаточно большое количество клиентов.
Не всякий компьютер сможет обеспечить создание и поддержку работы несколь-
ких тысяч программных потоков одновременно. Может ли один поток обслужи-
вать одновременно несколько клиентов? Этого можно достичь, если использовать
порты завершения ввода/вывода (I/O completion ports).
Порт завершения ввода/вывода напоминает очередь. В эту очередь заносятся
уведомления о том, что та или иная процедура ввода/вывода завершена. Любой
поток может проверить очередь и отреагировать на любое из этих уведомлений.
Прежде чем приступить к использованию порта завершения ввода/ вывода, необ-
ходимо создать его при помощи вызова CreateIoCompletionPort():
HANDLE CreateIoCompletionPort
(HANDLE FileHandle,
HANDLE ExistingCompletionPort,
ULONG_PTR CompletionKey,
DWORD NumberOfConcurrentThreads );…
В качестве одного из аргументов эта функция принимает дескриптор фай-
ла, открытого для перекрывающегося ввода/вывода. Как только дескриптору
файла ставится в соответствие порт завершения ввода/вывода, при успешном
завершении любой операции ввода/вывода в очередь порта завершения будет
внесено уведомление о завершении этой операции. Вызов CreateIoCompletion-
Port() можно использовать не только для создания нового порта завершения,
но также и для назначения уже существующему порту другого дескриптора
файла.
68
операции ввода встречает символ EOF, она тем или иным образом оповеща-
ет об этом вызывающую программу. В частности, традиционный вызов
ReadFile() устанавливает количество прочитанных байт равным нулю. Если
символ EOF встречается в процессе выполнения перекрывающегося вызова
ReadFile(), вызов возвращает ошибку. В этом случае значение, возвращаемое
функцией GetLastError(), будет равно ERROR_HANDLE_EOF. Символ EOF
может встретиться непосредственно при обращении к функции ReadFile()
или позже, в процессе выполнения операции ввода/вывода.
4.4. Использование портов завершения ввода/вывода
Перекрывающийся ввод/вывод обладает массой ограничений. Фактически
при использовании перекрывающегося ввода/вывода для обмена данными с неко-
торым объектом (файлом или устройством) используется отдельный программный
поток. Если вы планируете, например, использовать перекрывающийся
ввод/вывод при разработке сетевого сервера, обслуживанием каждого из клиентов
будет заниматься отдельный программный поток. Такая схема будет отлично ра-
ботать в случае, если число клиентов небольшое. Однако вряд ли удастся исполь-
зовать подобный подход для обеспечения работы высокопроизводительного сер-
вера, обслуживающего одновременно достаточно большое количество клиентов.
Не всякий компьютер сможет обеспечить создание и поддержку работы несколь-
ких тысяч программных потоков одновременно. Может ли один поток обслужи-
вать одновременно несколько клиентов? Этого можно достичь, если использовать
порты завершения ввода/вывода (I/O completion ports).
Порт завершения ввода/вывода напоминает очередь. В эту очередь заносятся
уведомления о том, что та или иная процедура ввода/вывода завершена. Любой
поток может проверить очередь и отреагировать на любое из этих уведомлений.
Прежде чем приступить к использованию порта завершения ввода/ вывода, необ-
ходимо создать его при помощи вызова CreateIoCompletionPort():
HANDLE CreateIoCompletionPort
(HANDLE FileHandle,
HANDLE ExistingCompletionPort,
ULONG_PTR CompletionKey,
DWORD NumberOfConcurrentThreads );…
В качестве одного из аргументов эта функция принимает дескриптор фай-
ла, открытого для перекрывающегося ввода/вывода. Как только дескриптору
файла ставится в соответствие порт завершения ввода/вывода, при успешном
завершении любой операции ввода/вывода в очередь порта завершения будет
внесено уведомление о завершении этой операции. Вызов CreateIoCompletion-
Port() можно использовать не только для создания нового порта завершения,
но также и для назначения уже существующему порту другого дескриптора
файла.
68
Страницы
- « первая
- ‹ предыдущая
- …
- 66
- 67
- 68
- 69
- 70
- …
- следующая ›
- последняя »
