Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
За исключением драйверов файловой системы, менеджер ввода-вывода связывает очередной объект устройства (для обработки очереди IRP) с каждым объектом устройства, который создает драйвер.
Большинство драйверов устройств вызывают подпрограммы поддержки диспетчера I/O для использования связанной очереди устройств, которая содержит IRP всякий раз, когда запросы I/O для целевого объекта устройства поступают быстрее, чем драйвер может обработать их полностью. С помощью этой техники IRP ставятся в очередь в подпрограмму StartIo, предоставляемую драйвером.
Для достижения высокой производительности большинство промежуточных драйверов просто передают IRP нижестоящим драйверам, так что промежуточные драйверы почти никогда не используют очереди устройств, связанные с их соответствующими объектами устройства.
Однако вы можете разработать драйвер для управления внутренними очередями IRP, явно настроив одну или несколько очередей устройств, переблокированные очереди или безопасные очереди отмены. Этот подход может быть особенно полезен, если драйвер управляет устройством, которое перекрывает операции ввода-вывода. Для такого устройства может быть трудно управлять параллельной обработкой двух или нескольких IRP для одного целевого объекта устройства, используя только одну очередь.
Самый простой способ построения внутренней очереди — использовать платформу очередей IRP с безопасностью отмены. Вы можете реализовать механизм очереди вашего выбора в драйвере. Затем можно использовать IoCsqInitialize для регистрации набора подпрограмм обратного вызова, обрабатывающих вставку и удаление IRP, а также блокировку и разблокировку очереди. Платформа очереди IRP с безопасностью отмены предоставляет подпрограммы IoCsqInsertIrp, IoCsqRemoveIrp, и IoCsqRemoveNextIrp, которые автоматически используют подпрограммы обратного вызова для безопасной вставки и удаления IRP из очереди драйвера. Система также использует процедуры обратного вызова для безопасного удаления всех отмененных irps.
Вы также можете настроить дополнительные очереди для IRPs в драйвере контроллера устройства для набора разнородных физических устройств. Например, драйвер порта SCSI использует объекты очереди устройств для внутренних очередей. Этот драйвер имеет подпрограмму StartIo и настраивает объекты очереди устройств как вспомогательные очереди, в дополнение к очереди устройств, связанной с объектом устройства, который он создает для представления HBA. Драйвер порта SCSI использует свои дополнительные очереди устройств для хранения irPs, привязанных к определенным логическим единицам на шине SCSI, управляемой HBA.
Драйвер системного контроллера дискет является примером драйвера, который не имеет подпрограммы StartIo и использует взаимоблокирующую очередь. Этот драйвер настраивает двусвязную взаимоблокируемую очередь, в которую и из которой драйвер и выделенный устройством поток вставляют и удаляют IRPs.
Ядро определяет тип объекта очереди устройства. Компонент поддержки систем предоставляет функции для вставки и удаления IRP в синхронизированных очередях. Драйверы для Windows XP и более поздних версий Windows могут использовать очереди IRP, безопасные для отмены , для обработки очереди IRP.
В следующих разделах объясняется, как использовать очереди устройств, чередуемые очереди и очереди, безопасные для отмены.
Настройка и использование очередей устройств
Управление очередями устройств
Настройка и использование взаимоблокирующихся очередей
Управление заблокированными очередями с помощью потока Driver-Created