thread Device-Dedicated

Il driver di un dispositivo lento o di un dispositivo che viene usato raramente (come il controller floppy) può risolvere molti problemi di "attesa" creando un thread di sistema dedicato al dispositivo. Inoltre, la maggior parte dei driver del file system usa thread di lavoro di sistema e fornisce routine di callback del thread di lavoro.

Se un driver di dispositivo ha un proprio contesto di thread o è in esecuzione in un contesto di thread di sistema, il thread dedicato al dispositivo o la routine di callback del thread di lavoro del driver di livello più alto possono sincronizzare le operazioni su un oggetto dispatcher, ad esempio un oggetto evento o un oggetto semaforo, in un'area di comunicazione condivisa dell'estensione del dispositivo del driver. Ad esempio, un thread dedicato al dispositivo può attendere un oggetto dispatcher condiviso, mentre il dispositivo del thread non è in uso, chiamando KeWaitForSingleObject per un semaforo. Fino a quando il driver del dispositivo viene chiamato per eseguire un'operazione di I/O (a quel punto imposta il semaforo sullo stato segnalato), il thread in attesa non usa tempo cpu.

Un driver può chiamare PsCreateSystemThread per creare un thread dedicato al driver o al dispositivo e quindi chiamare KeSetBasePriorityThread per impostare la priorità di base del thread. Il driver deve specificare un valore di priorità che evita le inversioni di priorità di run-time nei computer SMP. Vale a dire, impostare la priorità di base di un thread creato dal driver troppo alto può creare ritardi nell'esecuzione di thread con priorità inferiore che inviano richieste di I/O per tale driver.

Poiché gli oggetti thread sono un tipo di oggetto dispatcher, un thread può attendere il completamento di un altro thread. Per ottenere il puntatore dell'oggetto thread associato a un thread, un driver può chiamare ObReferenceObjectByHandle, passando l'handle di thread ricevuto da PsCreateSystemThread.

Un thread può chiamare KeDelayExecutionThread per attendere un intervallo che potrebbe essere una sezione full-time o più lunga. La granularità di un intervallo KeDelayExecutionThread è di circa 10 millisecondi. Poiché KeDelayExecutionThread è una routine basata su timer, la granularità dell'intervallo è leggermente più veloce o lenta di 10 millisecondi, a seconda della piattaforma.