Основы программирования в Win32API. Марапулец Ю.В. - 68 стр.

UptoLike

Составители: 

операции ввода встречает символ 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