Usos de ejemplo de colas de E/S
Para cada dispositivo conectado a un sistema y compatible con un controlador determinado, el controlador puede usar las siguientes combinaciones de colas de E/S y controladores de solicitudes:
Una única cola de E/S predeterminada y un único controlador de solicitudes, EvtIoDefault. El marco entregará todas las solicitudes del dispositivo a la cola predeterminada y llamará al controlador EvtIoDefault del controlador para entregar cada solicitud al controlador.
Una sola cola de E/S predeterminada y varios controladores de solicitud, como EvtIoRead, EvtIoWrite y EvtIoDeviceControl. El marco entregará todas las solicitudes del dispositivo a la cola predeterminada. Llamará al controlador EvtIoRead del controlador para entregar solicitudes de lectura, el controlador EvtIoWrite para entregar solicitudes de escritura y el controlador EvtIoDeviceControl para entregar solicitudes de control de E/S del dispositivo.
Varias colas de E/S, como una para solicitudes de lectura y otra para solicitudes de escritura. Para cada cola, el controlador solo proporciona un controlador de solicitudes porque la cola recibe solo un tipo de solicitud.
Varias colas de E/S, cada una con varios controladores de solicitudes.
Algunos escenarios de ejemplo son:
Una sola cola de E/S secuencial
Si va a escribir un controlador de función para una unidad de disco que solo puede atender solicitudes de lectura y escritura de una en una, el controlador de función solo necesita una cola de E/S por dispositivo.
El controlador puede usar la cola de E/S predeterminada que crea el marco cuando el controlador llama a WdfIoQueueCreate y establece DefaultQueue en TRUE en la estructura de WDF_IO_QUEUE_CONFIG de la cola. En la estructura WDF_IO_QUEUE_CONFIG, el controlador también debe especificar:
WdfIoQueueDispatchSequential como método de distribución, por lo que la cola de E/S predeterminada entregará solicitudes de E/S al controlador de forma sincrónica.
Una única función de devolución de llamada de evento, EvtIoDefault, que recibirá todas las solicitudes de E/S.
Cada vez que hay una solicitud de E/S disponible en la cola de E/S predeterminada del controlador, el marco entregará la solicitud al controlador llamando al controlador EvtIoDefault del controlador. Si hay otra solicitud disponible en la cola, el marco no lo entregará hasta que el controlador llame a WdfRequestComplete para la solicitud entregada anteriormente.
Varias colas de E/S secuenciales y una cola manual
Considere un dispositivo de puerto serie que tenga las siguientes características:
Puede realizar simultáneamente una operación de lectura y una operación de escritura.
No puede realizar varias operaciones de lectura o escritura de forma asincrónica.
Puede recibir solicitudes de control de E/S del dispositivo para obtener información de estado. El controlador del dispositivo puede tardar mucho tiempo en completar algunas de estas solicitudes (por ejemplo, una solicitud para esperar un cambio de estado).
Un controlador de función para este dispositivo podría usar varias colas de E/S secuenciales por dispositivo. El controlador llamaría a WdfIoQueueCreate tres veces: una vez para crear una cola predeterminada y dos veces para crear dos colas de E/S adicionales. En la estructura WDF_IO_QUEUE_CONFIG para cada una de estas colas, el controlador debe especificar:
WdfIoQueueDispatchSequential como método de distribución para cada cola, de modo que el marco entregue solicitudes de E/S al controlador de forma sincrónica.
Un controlador de solicitudes diferente para cada cola (EvtIoDefault, EvtIoRead y EvtIoWrite), que recibirá las solicitudes de E/S de la cola.
Después de llamar a WdfIoQueueCreate, el controlador podría llamar a WdfDeviceConfigureRequestDispatching dos veces, para reenviar todas las solicitudes de lectura a una de las colas adicionales y todas las solicitudes de escritura a la otra.
Con esta configuración, la función de devolución de llamada evtIoDefault predeterminada del dispositivo recibirá solo las solicitudes de control de E/S del dispositivo para obtener información de estado.
Si el controlador tiene que contener una solicitud de estado durante mucho tiempo, puede crear una cuarta cola y especificar WdfIoQueueDispatchManual como método de distribución. Cuando el controlador recibe una solicitud de información que debe esperar, puede colocar la solicitud en esta cola adicional hasta que la información de estado esté disponible. A continuación, el controlador puede recuperar la solicitud de la cola y completarla. Mientras tanto, la cola predeterminada puede entregar otra solicitud al controlador.
Una cola de E/S paralela única
Los controladores de disco IDE pueden superponerse a algunas operaciones de E/S, pero no a otras. Por ejemplo, mientras un controlador procesa una operación de lectura o escritura en un disco, puede enviar un comando seek a otro disco. Por otro lado, no se admiten varios comandos de lectura y escritura simultáneos.
Un controlador de función para este controlador debe examinar cada solicitud de E/S. Si el controlador recibe un comando seek, debe determinar si se puede procesar el comando seek. El comando seek no se puede procesar si:
La unidad de disco especificada ya está ocupada.
Se está formateando una unidad de disco y, por lo tanto, ninguna otra unidad puede estar activa.
Para cada dispositivo conectado al controlador, el controlador podría llamar a WdfIoQueueCreate para crear una cola de E/S predeterminada. En la estructura WDF_IO_QUEUE_CONFIG para cada una de estas colas, el controlador debe especificar:
WdfIoQueueDispatchParallel como método de distribución para cada cola, de modo que el marco entregue solicitudes de E/S al controlador de forma asincrónica.
Una función de devolución de llamada de eventos EvtIoDefault para cada cola, que recibirá las solicitudes de E/S de la cola.
Con esta configuración, se asigna una cola de E/S paralela única a cada dispositivo. El controlador debe examinar cada solicitud de E/S que el marco entrega de cada cola de E/S. Si el controlador puede procesar la solicitud inmediatamente, lo hace. De lo contrario, el controlador llama a WdfIoQueueStop, lo que hace que el marco deje de entregar solicitudes hasta que el controlador llame a WdfIoQueueStart.
Varias colas de E/S paralelas
Un adaptador de host SCSI es un ejemplo de un dispositivo que admite operaciones de E/S asincrónicas superpuestas. Se pueden conectar hasta 32 dispositivos al adaptador. Considere un sistema con la siguiente configuración:
Algunos de los dispositivos conectados al adaptador SCSI admiten la "reelección" y otros no. Si un dispositivo SCSI admite la reelección, durante una operación de E/S, el dispositivo puede liberar temporalmente el adaptador para que el adaptador pueda atender a otro dispositivo. Después, el primer dispositivo vuelve a seleccionarse para finalizar su operación.
El adaptador SCSI usa buzones de hardware para pasar solicitudes y respuestas entre el controlador y los dispositivos. Si un dispositivo está listo para una solicitud, pero no hay buzones disponibles, el dispositivo debe esperar.
Para obtener el mejor rendimiento, el controlador de función para este adaptador de host SCSI debe recibir solicitudes de E/S del marco en cuanto estén disponibles. El controlador debe examinar cada solicitud y determinar si se puede iniciar inmediatamente o se debe posponer hasta que el dispositivo y los recursos (como la memoria del buzón) estén disponibles.
Es probable que el controlador use varias colas de E/S paralelas. Para cada dispositivo conectado al adaptador, el controlador llamaría a WdfIoQueueCreate para crear una cola de E/S predeterminada. En la estructura WDF_IO_QUEUE_CONFIG para cada una de estas colas, el controlador debe especificar:
WdfIoQueueDispatchParallel como método de distribución para cada cola, de modo que el marco entregue solicitudes de E/S al controlador de forma asincrónica.
Una función de devolución de llamada de eventos EvtIoDefault para cada cola, que recibirá las solicitudes de E/S de la cola.
Cada función de devolución de llamada EvtIoDefault de cada cola de E/S debe examinar las solicitudes de E/S de la cola, a medida que se entregan, y determinar si cada una de ellas se puede atender inmediatamente. Si los recursos del dispositivo y del sistema están disponibles, el controlador inicia la operación de E/S. Si el dispositivo o los recursos no están disponibles, el controlador debe llamar a WdfIoQueueStop para detener la entrega de solicitudes adicionales hasta que se pueda procesar el actual.
Opcionalmente, el controlador puede llamar a WdfIoQueueCreate para crear colas adicionales para cada dispositivo. A continuación, el controlador puede llamar a WdfRequestForwardToIoQueue para volver a poner en cola algunos tipos de solicitudes a las colas adicionales. Cuando el marco entrega solicitudes de una cola adicional, el controlador puede llamar a WdfIoQueueStop, si es necesario, en esa cola en lugar de la cola predeterminada, lo que minimiza el número o el tipo de solicitudes para las que se pospone la entrega.