IRP de puesta en cola y puesta en cola
Dado que el administrador de E/S admite E/S asincrónica dentro de un sistema multitarea y multiproceso, las solicitudes de E/S a un dispositivo pueden entrar más rápido que su controlador puede procesarlas hasta su finalización, especialmente en máquinas multiprocesador. Por lo tanto, los IRP enlazados a cualquier dispositivo determinado deben estar en cola en el controlador cuando su dispositivo ya está ocupado procesando otro IRP.
Por lo tanto, un controlador de nivel inferior requiere una de las siguientes opciones:
Una rutina StartIo , que el administrador de E/S llama para iniciar operaciones de E/S para IRP, el controlador se ha puesto en cola en una cola IRP proporcionada por el sistema (consulte IoStartPacket).
Un mecanismo interno de puesta en cola y puesta en cola de IRP, que el controlador usa para administrar IRP que entran más rápido de lo que puede satisfacer. Los controladores pueden usar colas de dispositivos, colas interbloqueadas o colas seguras para cancelaciones. Para más información, consulte Colas de IRP administradas por controladores.
Solo un controlador de dispositivo de nivel más bajo que pueda satisfacer y completar todos los IRP posibles en sus rutinas de distribución no necesita ninguna rutina StartIo y ninguna cola administrada por controladores para IRP.
Los controladores de nivel superior casi nunca tienen rutinas StartIo . La mayoría de los controladores intermedios no tienen rutinas StartIo ni colas internas; Normalmente, un controlador intermedio puede pasar IRP con parámetros válidos en desde sus rutinas de envío y hacer cualquier postprocesamiento necesario para cualquier IRP en su rutina de IoCompletion .
A continuación se describen, en general, algunas de las consideraciones de diseño para determinar si se debe implementar una rutina StartIo con o sin colas internas administradas por controladores para IRP.
Rutinas StartIo en controladores
En el caso de los dispositivos periféricos del equipo capaces de controlar solo una operación de E/S de dispositivo a la vez, los controladores de dispositivo pueden implementar rutinas StartIo . Para estos controladores, el administrador de E/S proporciona rutinas IoStartPacket e IoStartNextPacket para poner en cola y quitar irP hacia y desde una cola IRP proporcionada por el sistema.
Para obtener más información sobre las rutinas StartIo , vea Escribir una rutina StartIo.
Colas internas para IRP en controladores
Si un dispositivo puede admitir más de una operación simultánea de E/S, su controlador de dispositivo de nivel más bajo debe configurar colas de solicitudes internas y administrar su propia cola de IRP. Por ejemplo, el controlador serie del sistema mantiene colas independientes para las operaciones de lectura, escritura, purga y espera en sus dispositivos, ya que admite dispositivos serie dúplex completos.
Un controlador de nivel superior que envía solicitudes a algún número de controladores de dispositivo subyacentes también puede mantener colas internas de IRP. Por ejemplo, los controladores del sistema de archivos casi siempre tienen colas internas para los IRP.
Para más información, consulte Colas de IRP administradas por controladores.
Sincronización interna de colas
Los controladores con subprocesos dedicados al dispositivo y los controladores de nivel superior que usan subprocesos de trabajo ejecutivos (incluidos la mayoría de los controladores del sistema de archivos) suelen configurar su propia cola para irP. La cola la comparte el subproceso del controlador o la devolución de llamada del subproceso de trabajo proporcionado por el controlador y por otras rutinas de controlador que procesan los IRP.
Un controlador que implementa su propia estructura de cola debe asegurarse de que el acceso a la cola está sincronizado y que los IRP cancelados se quitan de la cola. Para que esta tarea sea más sencilla para los escritores de controladores, las colas irP seguras para cancelación proporcionan un marco estándar que puede usar al implementar una cola IRP. Consulte Cancel-Safe IRP Queues (Cancelar colas irP seguras ) para obtener más información. Este es el método preferido para implementar una cola IRP.
Los controladores también pueden implementar toda la sincronización de colas irP y cancelar la lógica explícitamente. Por ejemplo, un controlador podría usar una cola interbloqueada. Las rutinas de envío del controlador insertan IRP en la cola interbloqueada y un subproceso creado por el controlador o la devolución de llamada del subproceso de trabajo del controlador los quita mediante una llamada a las rutinas de soporte técnico de exInterlockedXxxList .
Por ejemplo, el controlador del controlador de disquete del sistema usa una cola interbloqueada. Su subproceso dedicado al dispositivo controla el mismo procesamiento de IRP que realizan otras rutinas StartIo de los controladores de dispositivo y algunos de los mismos procesamientos de IRP que realizan otras rutinas DpcForIsr de otros controladores de dispositivo.
Colas internas con rutinas StartIo en controladores
Un controlador que administra sus propias colas internas también puede tener una rutina StartIo , pero no es necesario. La mayoría de los controladores de dispositivos de nivel más bajo tienen una rutina StartIo o administran su propia cola de IRP, pero no ambos.
Una excepción a esto es el controlador de puerto SCSI, que tiene una rutina StartIo y administra colas internas de IRP. El administrador de E/S pone en cola irP a la rutina StartIo del controlador de puerto en la cola de dispositivos asociada al objeto de dispositivo creado por el controlador que representa un HBA SCSI. El controlador de puerto SCSI también configura y administra colas de dispositivos para IRP en cada dispositivo de destino (correspondiente a una unidad lógica SCSI) en cualquier bus SCSI controlado por HBA en la máquina.
El controlador de puerto SCSI usa sus colas de dispositivos complementarias para contener los IRP enviados desde los controladores de clase SCSI en colas específicas de LU siempre que cualquier dispositivo de un bus SCSI esté especialmente ocupado. En efecto, las colas complementarias de dispositivos específicos de LU de este controlador permiten que el controlador de puerto SCSI serialice las operaciones para dispositivos SCSI heterogéneos a través de un HBA mientras mantiene cada dispositivo en los buses SCSI de ese HBA lo más ocupado posible.