Condividi tramite


Thread dedicati al dispositivo

Il driver per un dispositivo lento o un dispositivo che raramente si usa (ad esempio un'unità CD/DVD) 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 per thread di lavoro.

Se un driver di dispositivo ha un proprio contesto di thread o viene eseguito in un contesto di thread di sistema, può usare gli oggetti di sincronizzazione per il coordinamento. La routine di callback del thread dedicato al dispositivo o del driver di livello più alto può 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 quando il dispositivo non è in uso, eseguendo KeWaitForSingleObject su un semaforo. Fino a quando il driver di dispositivo non viene chiamato per eseguire un'operazione di I/O, il thread in attesa non usa alcun tempo di CPU. Quando viene chiamato il driver, imposta il semaforo sullo stato Segnalato.

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 inversione di priorità di runtime nei computer SMP. Ovvero, l'impostazione della priorità di base di un thread creato dal driver troppo elevata può creare ritardi nell'esecuzione di thread con priorità inferiore che inviano richieste di I/O per tale driver.

Poiché gli oggetti thread sono stessi 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 un intero slice di tempo o più lungo. 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 più lenta di 10 millisecondi, a seconda della piattaforma.