Compartir a través de


Subprocesos dedicados al dispositivo

El controlador para un dispositivo lento o un dispositivo que rara vez usas (como una unidad de CD/DVD) puede resolver muchos problemas de "espera" creando un subproceso del sistema dedicado al dispositivo. Además, la mayoría de los controladores del sistema de archivos usan hilos de trabajo del sistema y proporcionan rutinas de callback para hilos de trabajo.

Si un controlador de dispositivo tiene su propio contexto de subproceso o se ejecuta en un contexto de subproceso del sistema, puede usar objetos de sincronización para la coordinación. El subproceso dedicado del dispositivo o la rutina de devolución de llamada del subproceso de trabajo del controlador de nivel superior pueden sincronizar las operaciones en un objeto distribuidor, como un objeto de evento o un objeto de semáforo, en una región de comunicación compartida de la extensión de dispositivo del controlador. Por ejemplo, un subproceso dedicado al dispositivo puede esperar a un objeto distribuidor compartido, mientras que el dispositivo del subproceso no está en uso, llamando a KeWaitForSingleObject para un semáforo. Hasta que se llama al controlador del dispositivo para llevar a cabo una operación de E/S, su subproceso en espera no usa tiempo de CPU. Cuando se llama al controlador, establece el semáforo en el estado Señalizado.

Un controlador puede llamar a PsCreateSystemThread para crear un subproceso dedicado a controladores o dispositivos y, a continuación, llamar a KeSetBasePriorityThread para establecer la prioridad base del subproceso. El controlador debe especificar un valor de prioridad que evite inversiones de prioridad en tiempo de ejecución en máquinas SMP. Es decir, establecer la prioridad base de un subproceso creado por el controlador demasiado alto puede crear retrasos en la ejecución de subprocesos de prioridad inferior que envían solicitudes de E/S para ese controlador.

Dado que los objetos de subproceso son por sí mismos un tipo de objeto distribuidor, un subproceso puede esperar a que se complete otro subproceso. Para obtener el puntero del objeto asociado a un subproceso, un controlador puede llamar a ObReferenceObjectByHandle, al pasar el identificador de subproceso recibido de PsCreateSystemThread.

Un subproceso puede llamar a KeDelayExecutionThread para esperar un intervalo que podría ser un segmento de tiempo completo o más largo. La granularidad de un intervalo KeDelayExecutionThread es de aproximadamente 10 milisegundos. Dado que KeDelayExecutionThread es una rutina controlada por temporizador, la granularidad de su intervalo es ligeramente más rápida o más lenta que 10 milisegundos, dependiendo de la plataforma.