Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
shpora_po_sp.docx
Скачиваний:
2
Добавлен:
01.07.2025
Размер:
309 Кб
Скачать
☆

58)Асинхронный ввод/вывод и порты завершения

Ввод и вывод всегда выполнялись медленнее других операций. Эта низкая скорость вызвана следующими факторами: - задержки вследствие поиска дорожки и сектора на устройствах произвольного доступа (таких, как жесткие диски и CD-ROM);

- задержки, вызванные относительно малой скоростью передачи данных между физическим устройством и системной памятью;

- задержки при передаче данных через сеть.

Операции ввода-вывода во многих случаях являются синхронными с потоками. Иными словами, весь поток должен был ждать, пока ввод-вывод не завершится.

Краткий обзор методов асинхронного ввода-вывода в Win32 В Win32 существует три метода выполнения асинхронного ввода-вывода: - Многопоточный ввод-вывод. Каждый поток в процессе или совокупности про­цессов выполняет обычный синхронный ввод-вывод, в то время как другие по­токи могут продолжать работу.

- Собственно асинхронный ввод-вывод (или ввод-вывод с перекрытием). После на­чала чтения, записи или другой операции ввода-вывода поток продолжает вы­полнение. Если потоку для продолжения нужны результаты ввода-вывода, ожидает сигнала дескриптора либо указанного события.

Процедуры завершения (или расширенный ввод-вывод). Когда операция ввода-вывода завершается, система вызывает в потоке указанную процедуру завершении. 

Потоковый сервер, осуществляет асинхронный ввод-вывод через именованные каналы, хотя в пределах каждого отдельного потока ввод-вывод является синхронным. 

Этих проблем не возникает при использовании потоков. С другой стороны, концепции асинхронного ввода-вывода можно найти как в старых, так и в очень новых технологиях, так что изучение этих методик может заслуживать внимания. действие асинхронного вызова процедуры очень похоже на расширенный ввод-вывод, и многим нравится ис­пользовать этот механизм.

Порты завершения ввода-вывода

Порты завершения ввода-вывода, поддерживаемые только в Windows 2000/NT, объединяют возможности ввода-вывода с перекрытием и возможности независимых потоков и наиболее полезны в серверных программах. Этот механизм работает очень хорошо, когда число клиентов невелико. порт завершения ввода-вывода представляет собой набор дескрип­торов с перекрытием, а потоки ожидают сигнала порта. Когда чтение или запись на одном из дескрипторов заканчиваются, один поток переходит в активное состояние и получает данные и результаты операции ввода-вывода. После этого он может обрабо­тать данные и снова ожидать сигнала порта.

Параметры

Порт завершения ввода-вывода - это совокупность дескрипторов файлов, откры­тых в режиме OVERLAPPED. Параметр FileHandle — это асинхронный дескриптор, который добавляется в порт. Если в этом параметре указать значение invalid_handle_value, функция создает новый порт завершения ввода-вывода и возвращает его как возвращаемое значение. Следующий параметр, ExistingCompletionPort, в этом случае должен иметь значение NULL.

ExistingCompletionPort - порт, созданный при первом вызове, и порт, в кото­рый добавляется дескриптор из первого параметра. Если добавление прошло успешно, функция также возвращает дескриптор порта, при неудаче возвращается NULL.

CompletionKey задает ключ, который будет входить в пакет завершения для FileHandle. Этот ключ обычно является индексом массива структур данных, содер­жащих тип операции, дескриптор и указатель на буфер данных. NumberOfConcurrentThreads указывает максимальное число потоков, которые могут работать одновременно. Все потоки вне этого предела, ожидающие сигнала порта, остают­ся заблокированными, даже если в них имеется дескриптор с доступными данными. Если этот параметр равен нулю, пределом будет число процессоров в системе. С портом завершения ввода-вывода можно связать неограниченное количество асинхронных дескрипторов. При первом вызове CreateIoCompletionPort создается порт и определяется максимальное число потоков. Для каждого дескриптора, который должен быть связан с портом, эту функцию надо вызывать снова. К сожалению, не существует способа удаления дескриптора из порта завершения, что ограничивает гибкость программы. Дескрипторы, связанные с портом, не должны использоваться в функциях ReadFileEx или WriteFileEx. В документации Microsoft не рекомендуется совместно использовать файлы или другие объекты с помощью других открытых дескрипторов.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]