Threads Device-Dedicated

O driver de um dispositivo lento ou um dispositivo que raramente é usado (como o controlador de disquete) pode resolver muitos problemas de "espera" criando um thread de sistema dedicado ao dispositivo. Além disso, a maioria dos drivers do sistema de arquivos usa threads de trabalho do sistema e fornece rotinas de retorno de chamada de thread de trabalho.

Se um driver de dispositivo tiver seu próprio contexto de thread ou estiver em execução em um contexto de thread do sistema, o thread dedicado ao dispositivo ou a rotina de retorno de chamada de thread de trabalho do driver de nível mais alto poderá sincronizar operações em um objeto dispatcher, como um objeto de evento ou objeto semáforo, em uma região de comunicação compartilhada da extensão de dispositivo do driver. Por exemplo, um thread dedicado ao dispositivo pode aguardar um objeto dispatcher compartilhado, enquanto o dispositivo do thread não está em uso, chamando KeWaitForSingleObject para um semáforo. Até que o driver do dispositivo seja chamado para realizar uma operação de E/S (momento em que ele define o semáforo para o estado Sinalizado), seu thread de espera não usa tempo de CPU.

Um driver pode chamar PsCreateSystemThread para criar um thread dedicado ao driver ou dispositivo e, em seguida, chamar KeSetBasePriorityThread para definir a prioridade base do thread. O driver deve especificar um valor de prioridade que evite inversões de prioridade em tempo de execução em computadores SMP. Ou seja, definir a prioridade base de um thread criado pelo driver muito alto pode criar atrasos na execução de threads de prioridade mais baixa que enviam solicitações de E/S para esse driver.

Como os objetos thread são um tipo de objeto dispatcher, um thread pode aguardar a conclusão de outro thread. Para obter o ponteiro do objeto thread associado a um thread, um driver pode chamar ObReferenceObjectByHandle, passando o identificador de thread recebido de PsCreateSystemThread.

Um thread pode chamar KeDelayExecutionThread para aguardar um intervalo que possa ser uma fatia em tempo integral ou mais longa. A granularidade de um intervalo KeDelayExecutionThread é de cerca de 10 milissegundos. Como KeDelayExecutionThread é uma rotina controlada por temporizador, a granularidade de seu intervalo é um pouco mais rápida ou lenta do que 10 milissegundos, dependendo da plataforma.