W2K предоставляет два режима выполнения ввода-вывода — асинхронный и синхронный. Асинхронный ввод-вывод используется там, где можно оптимизировать производительность приложения. При асинхронном вводе-выводе приложение инициирует операцию ввода-вывода, а затем может продолжить свою работу (во время выполнения этого запроса). При синхронном вводе-выводе приложение блокируется до завершения выполнения операции ввода-вывода.
С точки зрения вызывающего потока асинхронный ввод-вывод более эффективен, поскольку позволяет продолжать выполнение, в то время как операция ввода-вывода ставится диспетчером ввода-вывода в очередь и впоследствии выполняется. Однако приложение, использующее асинхронный ввод-вывод, требует механизма определения завершенности этой операции. W2K предоставляет четыре различных способа извещения о завершении ввода-вывода.
• Сигнал объекту устройства ядра. При завершении операции ввода-вывода устанавливается индикатор, связанный с объектом устройства. Поток, вызвавший операцию ввода-вывода, может продолжить свое выполнение до тех пор, пока не достигнет точки, в которой он должен дождаться завершения выполнения операции ввода-вывода. В этой точке поток может находиться в состоянии ожидания до завершения операции ввода-вывода, после чего продолжить свою работу. Эта технология проста и легка в использовании, но не подходит для обработки множественных запросов ввода-вывода. Например, если потоку необходимо выполнить множество одновременных операций над одним файлом (таких,' как чтение одной и запись другой части в файл), то при описанной методике поток будет не в состоянии отличить завершение операции чтения от завершения операции записи. Он будет просто знать о том, что завершена некоторая операция ввода-вывода для этого файла.
• Сигнал объекту события ядра. Эта методика допускает одновременные запросы ввода-вывода к единственному устройству или файлу. Для каждого запроса поток создает событие; позже поток может ожидать завершения одного из этих запросов (или завершения серии запросов).
• Оповещение о вводе-выводе. При этом методе используется очередь, связанная с потоком и известная как очередь вызовов асинхронных процедур (asynchronous procedure call — АРС). Поток создает запросы ввода-вывода, а диспетчер ввода-вывода размещает результаты этих запросов в очереди АРС вызывающего потока.
• Порты завершения ввода-вывода. Эта технология используется в W2K Server для оптимизации использования потоков. По сути, для использования доступен пул потоков, так что нет необходимости в создании нового потока для обработки нового запроса.