Синхронный и асинхронный ввод - вывод (I/O)

Имеется два типа синхронизации ввода - вывода (I/O) файлов: синхронный ввод - вывод (I/O) файла и асинхронный ввод - вывод (I/O) файла. Асинхронный ввод - вывод (I/O) файла также называется как перекрывающий ввод - вывод.

При синхронном вводе - выводе (synchronous file I/O) файла поток запускает операцию ввода/вывода (I/O) и немедленно вводит ждущееся состояние до тех пор, пока, запрос ввода-вывода не завершит работу. Поток, выполняющий асинхронный ввод - вывод (asynchronous file I/O) файла, отправляет запрос на ввод-вывод данных ядру. Если запрос принят ядром, поток продолжает обрабатывать другое задание до тех пор, пока ядро не подаст сигналы потоку, что операция ввода/вывода (I/O) полностью завершилась. Тогда поток прерывает работу со своим текущим заданием и обрабатывает данные от операции ввода/вывода (I/O) по мере необходимости.

Эти два типа синхронизации проиллюстрированы на нижеследующем рисунке.

В ситуациях, когда ожидается запрос на ввод-вывод, который займет большое количество времени, такое как обновление или резервное копирование большой базы данных, асинхронный ввод - вывод (I/O) как правило - хороший способ оптимизировать эффективность обработки. Однако, для относительно быстрых операций ввода/вывода (I/O), непроизводительные издержки обработки запросов ядра на ввод-вывод и сигналов ядра могут сделать асинхронный ввод - вывод (I/O) менее выгодным, особенно если должны делаться много быстрых операций ввода/вывода (I/O). В этом случае, синхронный ввод - вывод (I/O) будет лучше.

Процесс открывает файл для асинхронного ввода - вывода (I/O) при его вызове в CreateFile, устанавливая флажок FILE_FLAG_OVERLAPPED в параметре dwFlagsAndAttributes. Если FILE_FLAG_OVERLAPPED не определяется, файл открыт для синхронного ввода - вывода (I/O). Когда файл был открыт для асинхронного ввода - вывода (I/O), указатель на структуру OVERLAPPED передается при вызове в ReadFile и WriteFile. Структура не передается при вызовах в ReadFile и WriteFile, выполняя синхронный ввод - вывод (I/O).

Дескрипторы объектов каталога извлекаются при помощи вызова функции CreateDirectory или CreateDirectoryEx. Дескрипторы каталога почти никогда не используются — резервирование приложения - это одно из немногих приложений, которое обычно обращается к ним.

После открытия объекта "файл" для асинхронного ввода - вывода (I/O) при помощи вызова функции CreateFile, экземпляр структуры OVERLAPPED нужно подвергнуть обработке и передать в каждый вызов функции ReadFile и WriteFile. Сохраните нижеследующее в памяти когда используется эта структура при асинхронных операциях чтения и записи:

Вы можете также создать событие и поместить этот дескриптор в структуру OVERLAPPED; функции ожидания могут далее использоваться для того, чтобы ждать операции ввода/вывода (I/O), чтобы завершить работу ожиданием на дескрипторе события.

Приложение может также ждать на дескрипторе файла, чтобы синхронизировать завершение операции ввода/вывода (I/O), но такое выполнение требует особенного предостережения. Каждый раз, когда запускается операция ввода/вывода (I/O), операционная система устанавливает дескриптор файла в занятое состояние. Каждый раз, когда операция ввода/вывода (I/O) завершается, операционная система устанавливает дескриптор файла в сигнальное состояние. По этой причине, если приложение запускает две операции ввода/вывода (I/O) и ждет на дескрипторе файла, то может возникнуть ситуация, что невозможно никаким способом решить, какая операция закончена, когда дескриптор устанавливается в сигнальное состояние. Если приложение должно выполнить несколько асинхронных операций ввода/вывода (I/O) в единичном файле, то оно должно ждать на дескрипторе события в структуре OVERLAPPED для каждой операции ввода/вывода (I/O), а не на дескрипторе файла.

Чтобы отменить все ждущие обработки асинхронные операции ввода/вывода (I/O), используйте функцию CancelIo. Эта функция отменяет только операции, запущенные вызывающим потоком для заданного дескриптора файла.

Функции ReadFileEx и WriteFileEx позволяют приложению определить процедуру исполнения кода (см. FileIOCompletionRoutine), когда запрос асинхронного ввода-вывода завершен.

 

Назад в оглавление
На главную страницу

Hosted by uCoz