Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Os bloqueios de rotação em fila são uma variante dos bloqueios de rotação que funcionam bem para bloqueios altamente disputados. Os bloqueios de rotação tradicionais sem fila são uma escolha melhor para bloqueios levemente disputados ou de duração mais curta.
Os benefícios de usar um bloqueio de rotação em fila incluem:
Contenção reduzida do processador: Os spin locks tradicionais podem levar a uma contenção significativa do processador quando vários threads tentam adquirir o bloqueio simultaneamente, enquanto fazem loop (ou "spin") continuamente verificando o estado do bloqueio. Isso pode degradar o desempenho do sistema, especialmente em sistemas multiprocessadores. Os bloqueios de rotação em fila atenuam isso ao organizar as threads numa fila. Quando um thread adquire um bloqueio, apenas o próximo da fila está girando ativamente, esperando para adquirir o bloqueio. Isso reduz os ciclos de CPU desperdiçados na rotação, especialmente quando o bloqueio é mantido por períodos mais longos.
Equidade e Evitar a Fome: Um dos problemas com as fechaduras básicas é a falta de justiça; Um fio pode ficar faminto e nunca adquirir o bloqueio se outros fios estiverem continuamente adquirindo e liberando-o. Os bloqueios de rotação em fila resolvem isso garantindo que os threads adquiram o bloqueio na ordem em que tentaram. Esse manuseio sequencial evita a fome e garante que todos os threads sejam atendidos ao longo do tempo.
Escalabilidade: À medida que o número de processadores ou núcleos aumenta em um sistema, a eficiência dos mecanismos de sincronização torna-se crítica para o desempenho. Os bloqueios de rotação em fila são mais escaláveis do que os bloqueios de rotação tradicionais porque reduzem a sobrecarga dos processadores, minimizando a rotação ativa em todos os núcleos. Isto é particularmente importante em sistemas multi-core de elevado desempenho, em que a eficiência do condutor pode afetar diretamente o desempenho geral do sistema.
Uso eficiente dos recursos do sistema: Ao reduzir a rotação desnecessária do processador, os bloqueios de rotação em fila permitem que o sistema use seus recursos de forma mais eficiente. Isso não só melhora o desempenho do driver do dispositivo, mas também tem um impacto positivo na capacidade de resposta geral do sistema e no consumo de energia, o que é especialmente benéfico em ambientes sensíveis à energia.
Simplicidade e confiabilidade: Apesar de suas vantagens em reduzir a contenção e melhorar a equidade, os bloqueios de rotação em fila abstraem a complexidade do desenvolvedor. Eles fornecem um mecanismo simples e confiável para proteger recursos compartilhados sem que o desenvolvedor tenha que implementar uma lógica de bloqueio complexa. Esta simplicidade reduz a probabilidade de bugs relacionados com o manuseamento inadequado do bloqueio, aumentando assim a fiabilidade do condutor.
Abaixo está um trecho de código simplificado demonstrando as operações descritas com um bloqueio de rotação em fila em um driver do modo kernel do Windows. Este exemplo mostra como declarar e inicializar um bloqueio de rotação usando KeInitializeSpinLock e, em seguida, adquirir e liberar o bloqueio usando KeAcquireInStackQueuedSpinLock e KeReleaseInStackQueuedSpinLock, respectivamente.
KSPIN_LOCK SpinLock;
KLOCK_QUEUE_HANDLE LockHandle;
// Initialize the spin lock
KeInitializeSpinLock(&SpinLock);
// Assume this function is called in some kind of context where
// the below operations make sense, e.g., in a device I/O path
// Acquire the queued spin lock
KeAcquireInStackQueuedSpinLock(&SpinLock, &LockHandle);
// At this point, the current thread holds the spin lock.
// Perform thread-safe operations here.
// ...
// Release the queued spin lock
KeReleaseInStackQueuedSpinLock(&LockHandle);
O driver aloca uma estrutura KLOCK_QUEUE_HANDLE, que passa por ponteiro para KeAcquireInStackQueuedSpinLock. O driver passa a mesma estrutura por ponteiro para KeReleaseInStackQueuedSpinLock quando ele libera o bloqueio de rotação.
Os drivers normalmente devem alocar a estrutura na pilha cada vez que adquirem o bloqueio. Um driver não deve alocar a estrutura como parte do seu contexto de dispositivo e, em seguida, partilhar a mesma estrutura a partir de vários threads.
Os drivers não devem misturar chamadas para as rotinas de bloqueio de rotação em fila e as rotinas comuns de KeXxxSpinLock no mesmo bloqueio de rotação.
Se o driver já estiver em IRQL = DISPATCH_LEVEL, ele pode chamar KeAcquireInStackQueuedSpinLockAtDpcLevel e KeReleaseInStackQueuedSpinLockFromDpcLevel em alternativa.