Операционные системы. Учебное пособие. Марапулец Ю.В. - 139 стр.

UptoLike

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

ции ввода/вывода в очередь порта завершения будет внесено уведомление о завершении
этой операции. Вызов CreateIoCompletionPort() можно использовать не только для соз-
дания нового порта завершения, но также и для назначения уже существующему порту
другого дескриптора файла.
При обращении к функции CreateIoCompletionPort() вы можете указать ключ - 32-
битное значение, которое система добавляет в каждое из уведомлений об успешном
осуществлении операций ввода/вывода, связанных с указанным файлом. Последний ар-
гумент функции CreateIoCompletionPort() служит для передачи этой функции макси-
мального допустимого количества потоков, которые будут реагировать на появление
уведомлений о завершении ввода/вывода. Обычно значение этого аргумента равно ну-
лю.
Любой поток может получить информацию о завершении ввода/вывода при помо-
щи функции GetQueuedCompletionStatus(). Эта функция возвращает количество байт,
переданных в процессе ввода/вывода, ключ завершения (32-битное число, установлен-
ное при обращении к CreateIoCompletion) и структуру OVERLAPPED, использованную
при инициализации процедуры ввода/вывода.
BOOL GetQueuedCompletionStatus( HANDLE CompletionPort, //дескриптор порта
LPDWORD lpNumberOfBytes, // количество переданных байт
PULONG_PTR lpCompletionKey, //указатель на ключ завершения,
// (если он объявлен ранее)
LPOVERLAPPED *lpOverlapped, //указатель на Overlapped
DWORD dwMilliseconds ); // время ожидания пакета
При создании порта завершения ввода/вывода вы можете не ставить ему в соответ-
ствие каких-либо дескрипторов файлов. В этом случае порт завершения может исполь-
зоваться в качестве механизма связи между несколькими потоками одного процесса.
При помощи функции PostQueuedCompletionStatus() любой поток может поместить в
очередь порта завершения уведомление о завершении ввода/вывода. При этом необхо-
димо указать количество переданных байт, ключ завершения и указатель на структуру
OVERLAPPED, которая будет возвращена ожидающему потоку вызовом функции Get-
QueuedCompletionStatus().
PostQueuedCompletionStatus( HANDLE CompletionPort,
DWORD dwNumberOfBytesTransferred,
ULONG_PTR dwCompletionKey,
LPOVERLAPPED lpOverlapped );
Безусловно, во многих ситуациях вы можете обойтись и без портов завершения
ввода/вывода, однако очень часто этот механизм оказывается весьма удобным.
Выше было указано, что еще одной "экзотической технологией", поддерживаемой
ОС Windows для асинхронного ввода-вывода являются файлы, отображаемые в па-
мять. Менеджер виртуальной памяти Windows позволяет программе работать с файлом
таким образом, будто этот файл полностью загружен в оперативную память компьютера.
На самом деле это не так. Менеджер виртуальной памяти загружает в оперативную па-
мять компьютера только фрагменты файла (страницы). Чтобы отобразить файл на опе-
ративную память, необходимо его открыть при помощи функции CreateFile() и передать
дескриптор файла CreateFileMapping(). Подробно этот механизм рассмотрен ранее.
В итоге рассмотрения всех возможностей файлового ввода/вывода возникает во-
прос - обязаны ли программисты всегда использовать CreateFile() и остальные связанные
с этим функции для того, чтобы работать с файлами в Windows? Конечно, нет. Если вы
141
ции ввода/вывода в очередь порта завершения будет внесено уведомление о завершении
этой операции. Вызов CreateIoCompletionPort() можно использовать не только для соз-
дания нового порта завершения, но также и для назначения уже существующему порту
другого дескриптора файла.
     При обращении к функции CreateIoCompletionPort() вы можете указать ключ - 32-
битное значение, которое система добавляет в каждое из уведомлений об успешном
осуществлении операций ввода/вывода, связанных с указанным файлом. Последний ар-
гумент функции CreateIoCompletionPort() служит для передачи этой функции макси-
мального допустимого количества потоков, которые будут реагировать на появление
уведомлений о завершении ввода/вывода. Обычно значение этого аргумента равно ну-
лю.
     Любой поток может получить информацию о завершении ввода/вывода при помо-
щи функции GetQueuedCompletionStatus(). Эта функция возвращает количество байт,
переданных в процессе ввода/вывода, ключ завершения (32-битное число, установлен-
ное при обращении к CreateIoCompletion) и структуру OVERLAPPED, использованную
при инициализации процедуры ввода/вывода.

BOOL GetQueuedCompletionStatus( HANDLE CompletionPort, //дескриптор порта
                LPDWORD lpNumberOfBytes,        // количество переданных байт
                PULONG_PTR lpCompletionKey, //указатель на ключ завершения,
                                               // (если он объявлен ранее)
                LPOVERLAPPED *lpOverlapped, //указатель на Overlapped
                DWORD dwMilliseconds );        // время ожидания пакета

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

PostQueuedCompletionStatus( HANDLE CompletionPort,
                   DWORD dwNumberOfBytesTransferred,
                   ULONG_PTR dwCompletionKey,
                   LPOVERLAPPED lpOverlapped );

     Безусловно, во многих ситуациях вы можете обойтись и без портов завершения
ввода/вывода, однако очень часто этот механизм оказывается весьма удобным.
     Выше было указано, что еще одной "экзотической технологией", поддерживаемой
ОС Windows для асинхронного ввода-вывода являются файлы, отображаемые в па-
мять. Менеджер виртуальной памяти Windows позволяет программе работать с файлом
таким образом, будто этот файл полностью загружен в оперативную память компьютера.
На самом деле это не так. Менеджер виртуальной памяти загружает в оперативную па-
мять компьютера только фрагменты файла (страницы). Чтобы отобразить файл на опе-
ративную память, необходимо его открыть при помощи функции CreateFile() и передать
дескриптор файла CreateFileMapping(). Подробно этот механизм рассмотрен ранее.
     В итоге рассмотрения всех возможностей файлового ввода/вывода возникает во-
прос - обязаны ли программисты всегда использовать CreateFile() и остальные связанные
с этим функции для того, чтобы работать с файлами в Windows? Конечно, нет. Если вы


                                        141