Mecanismos de despacho da fila de trabalho

O RDBSS usa filas de trabalho do kernel do Windows para despachar operações em vários threads para execução posterior. Os drivers de mini-redirecionador de rede podem usar as filas de trabalho mantidas pelo RDBSS para despachar operações para execução posterior.

O RDBSS fornece várias rotinas que implementam o mecanismo de despacho usado no RDBSS. Essas rotinas também podem ser usadas por drivers de mini-redirecionador de rede.

O RDBSS controla os itens de trabalho por dispositivo-objeto. Isso permite que o RDBSS lide com as condições de corrida associadas ao carregamento e descarregamento de mini-redirecionadores de rede. Isso também fornece um mecanismo no RDBSS para impedir que um único mini-redirecionador de rede use injustamente todos os recursos.

Há certos cenários em que o envio de itens de trabalho é inevitável. Para evitar a alocação frequente de memória e liberar operações nesses cenários, o WORK_QUEUE_ITEM é alocado como parte de outros dados. Em outros cenários em que o despacho é raro, vale a pena evitar a alocação de memória até que seja necessário. A implementação da fila de trabalho RDBSS fornece esses dois cenários na forma de despacho e postagem de solicitações de fila de trabalho. No caso de despacho usando a rotina RxDispatchToWorkerThread , nenhuma memória para o WORK_QUEUE_ITEM precisa ser alocada pelo chamador. Para lançar usando a rotina RxPostToWorkerThread , a memória do WORK_QUEUE_ITEM precisa ser alocada pelo chamador.

Há dois casos comuns de operações de despacho para threads de trabalho:

  • Para uma operação muito infrequente, use a rotina RxDispatchToWorkerThread para conservar o uso de memória alocando e liberando memória dinamicamente para o item da fila de trabalho quando necessário.

  • Quando uma operação for despachada repetidamente, use a rotina RxPostToWorkerThread para economizar tempo alocando antecipadamente o WORK_QUEUE_ITEM como parte da estrutura de dados a ser despachada.

A compensação entre as duas operações de despacho é tempo versus espaço (uso de memória).

O mecanismo de despacho no RDBSS fornece vários níveis de filas de trabalho por processador. Os seguintes níveis de filas de trabalho atualmente suportados:

  • Crítico

  • Delayed

  • Hypercritical

A distinção entre Crítico e Atrasado é de prioridade. O nível HiperCrítico é diferente dos outros dois em que as rotinas não devem bloquear (aguardar qualquer recurso). Este requisito não pode ser aplicado, pelo que a eficácia do mecanismo de expedição depende da cooperação implícita dos clientes.

A implementação da fila de trabalho no RDBSS é construída em torno de uma implementação KQUEUE. O suporte adicional envolve a regulação de vários threads que estão aguardando ativamente os itens de trabalho. Cada estrutura de dados da fila de trabalho é alocada a partir da memória do pool não paginado e tem seu próprio mecanismo de sincronização (um spinlock).

Além das informações de escrituração (estado e tipo da fila, por exemplo), o RDBSS também mantém estatísticas que são coletadas ao longo do tempo de vida da fila de trabalho. Isso pode fornecer informações valiosas no ajuste de uma fila de trabalho. O número de itens que foram processados, o número de itens que precisam ser processados e o comprimento da fila cumulativa é estruturado. O comprimento da fila cumulativa é uma métrica importante e representa a soma do número de itens aguardando para serem processados cada vez que um item de trabalho adicional foi enfileirado. O comprimento cumulativo da fila dividido pela soma do número total de itens processados e o número de itens a serem processados fornece uma indicação do comprimento médio da fila. Um valor muito maior que um significa que o número mínimo de threads de trabalho associados à fila de trabalho pode ser aumentado. Um valor muito menor que um significa que o número máximo de threads de trabalho associados à fila pode ser diminuído.

A fila de trabalho normalmente começa em um estado ativo e continua até que uma situação irrecuperável seja encontrada (falta de recursos do sistema, por exemplo) ou quando ela faz a transição para o estado inativo. Quando um rundown é iniciado, ele faz a transição para o estado rundown-in-progress.

O resumo das filas de trabalho não é concluído quando os threads foram girados. A terminação dos threads precisa ser garantida antes que as estruturas de dados possam ser derrubadas. A implementação da fila de trabalho no RDBSS segue um protocolo no qual cada um dos threads que estão sendo girados para baixo salva uma referência ao objeto de thread no contexto de resumo. O thread de emissão de rundown (que não pertence à fila de trabalho) aguarda a conclusão de todos os threads girados antes de derrubar as estruturas de dados.

A implementação atual das filas RxDispatchToWorkerThread e RxPostToWorkerThread funcionam no mesmo processador do qual a chamada se originou.

As seguintes rotinas RDBSS para despacho de fila de trabalho incluem.

Rotina Descrição

RxDispatchToWorkerThread

Essa rotina invoca uma rotina no contexto de um thread de trabalho. A memória para o WORK_QUEUE_ITEM é alocada por essa rotina.

RxPostToWorkerThread

Essa rotina invoca a rotina no contexto de um thread de trabalho. A memória para o WORK_QUEUE_ITEM deve ser alocada pelo chamador.

RxSpinDownMRxDispatcher

Essa rotina destrói o contexto do dispatcher para um mini-redirecionador de rede.

Observe que essa rotina só está disponível no Windows Server 2003 e no Windows XP.