Share via


Exemples d’utilisations de files d’attente d’E/S

Pour chaque appareil connecté à un système et pris en charge par un pilote particulier, le pilote peut utiliser les combinaisons suivantes de files d’attente d’E/S et de gestionnaires de requêtes :

  • Une file d’attente d’E/S par défaut unique et un seul gestionnaire de requêtes, EvtIoDefault. L’infrastructure remet toutes les demandes de l’appareil à la file d’attente par défaut, et appelle le gestionnaire EvtIoDefault du pilote pour remettre chaque requête au pilote.

  • Une file d’attente d’E/S par défaut unique et plusieurs gestionnaires de requêtes tels que EvtIoRead, EvtIoWrite et EvtIoDeviceControl. L’infrastructure remet toutes les demandes de l’appareil à la file d’attente par défaut. Il appelle le gestionnaire EvtIoRead du pilote pour remettre les demandes de lecture, le gestionnaire EvtIoWrite pour remettre les demandes d’écriture et le gestionnaire EvtIoDeviceControl pour remettre les demandes de contrôle d’E/S de l’appareil.

  • Plusieurs files d’attente d’E/S, comme une pour les demandes de lecture et une autre pour les demandes d’écriture. Pour chaque file d’attente, le pilote fournit un seul gestionnaire de requêtes, car la file d’attente ne reçoit qu’un seul type de requête.

  • Plusieurs files d’attente d’E/S, chacune avec plusieurs gestionnaires de requêtes.

Voici des exemples de scénarios :

File d’attente d’E/S séquentielle unique

Si vous écrivez un pilote de fonction pour un lecteur de disque qui peut uniquement traiter les demandes de lecture et d’écriture une par une, le pilote de fonction n’a besoin que d’une seule file d’attente d’E/S par appareil.

Le pilote peut utiliser la file d’attente d’E/S par défaut créée par le framework lorsque le pilote appelle WdfIoQueueCreate et définit DefaultQueue sur TRUE dans la structure WDF_IO_QUEUE_CONFIG de la file d’attente. Dans la structure WDF_IO_QUEUE_CONFIG, le pilote doit également spécifier :

  • WdfIoQueueDispatchSequential en tant que méthode de distribution, de sorte que la file d’attente d’E/S par défaut remet les demandes d’E/S au pilote de manière synchrone.

  • Une seule fonction de rappel d’événement, EvtIoDefault, qui recevra toutes les demandes d’E/S.

Chaque fois qu’une demande d’E/S est disponible dans la file d’attente d’E/S par défaut du pilote, l’infrastructure remet la demande au pilote en appelant le gestionnaire de requêtes EvtIoDefault du pilote. Si une autre requête devient disponible dans la file d’attente, l’infrastructure ne la remet pas tant que le pilote n’appelle pas WdfRequestComplete pour la requête précédemment remise.

Plusieurs files d’attente d’E/S séquentielles et une file d’attente manuelle

Prenons l’exemple d’un périphérique de port série qui présente les caractéristiques suivantes :

  • Il peut effectuer simultanément une opération de lecture et une opération d’écriture.

  • Il ne peut pas effectuer plusieurs opérations de lecture ou d’écriture de manière asynchrone.

  • Il peut recevoir des demandes de contrôle d’E/S d’appareil pour status informations. Le pilote de l’appareil peut prendre beaucoup de temps pour effectuer certaines de ces demandes (par exemple, une demande d’attente d’une modification de status).

Un pilote de fonction pour cet appareil peut utiliser plusieurs files d’attente d’E/S séquentielles par appareil. Le pilote appelle WdfIoQueueCreate trois fois : une fois pour créer une file d’attente par défaut et deux fois pour créer deux files d’attente d’E/S supplémentaires. Dans la structure WDF_IO_QUEUE_CONFIG pour chacune de ces files d’attente, le pilote doit spécifier :

  • WdfIoQueueDispatchSequential en tant que méthode de distribution pour chaque file d’attente, afin que l’infrastructure envoie des demandes d’E/S au pilote de manière synchrone.

  • Un gestionnaire de requêtes différent pour chaque file d’attente (EvtIoDefault, EvtIoRead et EvtIoWrite), qui recevra les demandes d’E/S de la file d’attente.

Après avoir appelé WdfIoQueueCreate, le pilote peut appeler WdfDeviceConfigureRequestDispatching deux fois pour transférer toutes les demandes de lecture à l’une des files d’attente supplémentaires et toutes les demandes d’écriture à l’autre.

Avec cette configuration, la fonction de rappel EvtIoDefault de file d’E/S par défaut de la file d’attente d’E/S de l’appareil reçoit uniquement les demandes de contrôle d’E/S de l’appareil pour status informations.

Si le pilote doit contenir une requête status pendant une longue période, il peut créer une quatrième file d’attente et spécifier WdfIoQueueDispatchManual comme méthode de distribution. Lorsque le pilote reçoit une demande d’informations qu’il doit attendre, il peut placer la demande dans cette file d’attente supplémentaire jusqu’à ce que les informations status soient disponibles. Ensuite, le pilote peut récupérer la requête à partir de la file d’attente et la terminer. En attendant, la file d’attente par défaut peut remettre une autre requête au pilote.

File d’attente d’E/S parallèle unique

Les contrôleurs de disque IDE peuvent chevaucher certaines opérations d’E/S, mais pas d’autres. Par exemple, pendant qu’un contrôleur traite une opération de lecture ou d’écriture sur un disque, il peut envoyer une commande de recherche à un autre disque. En revanche, plusieurs commandes simultanées de lecture et d’écriture ne sont pas prises en charge.

Un pilote de fonction pour ce contrôleur doit examiner chaque demande d’E/S. Si le pilote reçoit une commande de recherche, il doit déterminer si la commande seek peut être traitée. La commande seek ne peut pas être traitée si :

  • Le lecteur de disque spécifié est déjà occupé.

  • Un lecteur de disque est en cours de formatage et, par conséquent, aucun autre lecteur ne peut être actif.

Pour chaque appareil connecté au contrôleur, le pilote peut appeler WdfIoQueueCreate pour créer une file d’attente d’E/S par défaut. Dans la structure WDF_IO_QUEUE_CONFIG pour chacune de ces files d’attente, le pilote doit spécifier :

  • WdfIoQueueDispatchParallel en tant que méthode de distribution pour chaque file d’attente, afin que l’infrastructure envoie des demandes d’E/S au pilote de manière asynchrone.

  • Une fonction de rappel d’événement EvtIoDefault pour chaque file d’attente, qui recevra les demandes d’E/S de la file d’attente.

Avec cette configuration, une file d’attente d’E/S parallèle unique est affectée à chaque appareil. Le pilote doit examiner chaque demande d’E/S que le framework remet à partir de chaque file d’attente d’E/S. Si le pilote peut traiter la demande immédiatement, il le fait. Sinon, le pilote appelle WdfIoQueueStop, ce qui entraîne l’arrêt de la remise des requêtes par l’infrastructure jusqu’à ce que le pilote appelle WdfIoQueueStart.

Files d’attente d’E/S parallèles multiples

Un adaptateur hôte SCSI est un exemple d’appareil qui prend en charge des opérations d’E/S asynchrones qui se chevauchent. Jusqu’à 32 appareils peuvent être connectés à l’adaptateur. Prenons l’exemple d’un système avec la configuration suivante :

  • Certains appareils connectés à l’adaptateur SCSI prennent en charge la « résélection » et d’autres non. Si un appareil SCSI prend en charge la réélection, pendant une opération d’E/S, l’appareil peut libérer temporairement l’adaptateur afin qu’il puisse traiter un autre appareil. Le premier appareil se réélectionne plus tard pour terminer son opération.

  • L’adaptateur SCSI utilise des boîtes aux lettres matérielles pour transmettre les demandes et les réponses entre le pilote et les appareils. Si un appareil est prêt pour une demande, mais qu’aucune boîte aux lettres n’est disponible, l’appareil doit attendre.

Pour de meilleures performances, le pilote de fonction de cet adaptateur hôte SCSI doit recevoir des demandes d’E/S de la part de l’infrastructure dès qu’elles sont disponibles. Le pilote doit examiner chaque demande et déterminer si elle peut être démarrée immédiatement ou doit être reportée jusqu’à ce que l’appareil et les ressources (telles que la mémoire de boîte aux lettres) soient disponibles.

Le pilote doit probablement utiliser plusieurs files d’attente d’E/S parallèles. Pour chaque appareil connecté à l’adaptateur, le pilote appelle WdfIoQueueCreate pour créer une file d’attente d’E/S par défaut. Dans la structure WDF_IO_QUEUE_CONFIG pour chacune de ces files d’attente, le pilote doit spécifier :

  • WdfIoQueueDispatchParallel en tant que méthode de distribution pour chaque file d’attente, afin que l’infrastructure envoie des demandes d’E/S au pilote de manière asynchrone.

  • Une fonction de rappel d’événement EvtIoDefault pour chaque file d’attente, qui recevra les demandes d’E/S de la file d’attente.

La fonction de rappel EvtIoDefault de chaque file d’attente d’E/S doit examiner les demandes d’E/S de la file d’attente, à mesure qu’elles sont remises, et déterminer si chacune d’elles peut être traitée immédiatement. Si l’appareil et les ressources système sont disponibles, le pilote démarre l’opération d’E/S. Si l’appareil ou les ressources ne sont pas disponibles, le pilote doit appeler WdfIoQueueStop pour arrêter la remise des demandes supplémentaires jusqu’à ce que celle en cours puisse être traitée.

Si vous le souhaitez, le pilote peut appeler WdfIoQueueCreate pour créer des files d’attente supplémentaires pour chaque appareil. Ensuite, le pilote peut appeler WdfRequestForwardToIoQueue pour mettre en file d’attente certains types de demandes dans les files d’attente supplémentaires. Lorsque l’infrastructure remet les requêtes d’une file d’attente supplémentaire, le pilote peut appeler WdfIoQueueStop, si nécessaire, sur cette file d’attente au lieu de la file d’attente par défaut, ce qui réduit le nombre ou le type de demandes pour lesquelles la remise est reportée.