subprocesos de Device-Dedicated
El controlador de un dispositivo lento o un dispositivo que rara vez se usa (como el controlador de disquete) puede resolver muchos problemas de "espera" creando un subproceso de sistema dedicado al dispositivo. Además, la mayoría de los controladores del sistema de archivos usan subprocesos de trabajo del sistema y proporcionan rutinas de devolución de llamada de subproceso de trabajo.
Si un controlador de dispositivo tiene su propio contexto de subproceso o se ejecuta en un contexto de subproceso del sistema, el subproceso dedicado del dispositivo o la rutina de devolución de llamada de subproceso de trabajo del controlador de nivel superior pueden sincronizar las operaciones en un objeto de distribuidor, como un objeto de evento o un objeto semáforo, en una región de comunicación compartida de la extensión del dispositivo del controlador. Por ejemplo, un subproceso dedicado al dispositivo puede esperar 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 de dispositivo para llevar a cabo una operación de E/S (en cuyo punto establece el semáforo en estado Señalizado), su subproceso en espera no usa tiempo de CPU.
Un controlador puede llamar a PsCreateSystemThread para crear un subproceso dedicado al controlador o dispositivo y, a continuación, llamar a KeSetBasePriorityThread para establecer la prioridad base del subproceso. El controlador debe especificar un valor de prioridad que evite las 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 de subproceso asociado a un subproceso, un controlador puede llamar a ObReferenceObjectByHandle, pasando 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.