Partilhar via


Threads dedicados ao dispositivo

O driver para um dispositivo lento ou um dispositivo que você raramente usa (como uma unidade de CD / DVD) pode resolver muitos problemas de "espera" criando um thread de sistema dedicado ao dispositivo. Além disso, a maioria dos drivers do sistema de ficheiros usa threads de trabalho do sistema e rotinas de retorno de chamada de threads de trabalho.

Se um driver de dispositivo tiver seu próprio contexto de thread ou for executado em um contexto de thread de sistema, ele poderá usar objetos de sincronização para coordenação. O fio de execução dedicado ao dispositivo ou a rotina de retorno de chamada do fio de trabalho do driver de nível superior pode sincronizar operações em um objeto de despacho, como um objeto de evento ou objeto semáforo, em uma região de comunicação compartilhada da extensão do dispositivo do driver. Por exemplo, um thread dedicado ao dispositivo pode esperar por um objeto dispatcher compartilhado, enquanto o dispositivo do thread não está em uso, chamando KeWaitForSingleObject para um semáforo. Até que o driver de dispositivo seja chamado para executar uma operação de E/S, seu thread de espera não usa tempo de CPU. Quando o motorista é chamado, ele define o semáforo para o estado Sinalizado.

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 máquinas SMP. Ou seja, definir a prioridade base de um thread criado por um driver como muito alta 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 de thread são, eles próprios, um tipo de objeto de despacho, um thread pode aguardar a conclusão de outro thread. Para obter o ponteiro de objeto de thread associado a uma thread, um driver pode chamar ObReferenceObjectByHandle, passando o identificador de thread recebido de PsCreateSystemThread.

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