Dois spinlocks no mesmo processador?
-
26-09-2019 - |
Pergunta
Dois CPUs podem manter dois bloqueios de rotação "diferentes" simultaneamente ao mesmo tempo?
Então ... isso significa: uma CPU Sigle (Uniprocessor) não pode conter dois spinlocks "diferentes" ao mesmo tempo?
Então ... isso significa: o número de spinlocks em uma única CPU não pode ser> 1.
PS: "diferente" implicando spinlock associado a diferentes recursos de memória.
Alguém sabe como os spinlocks funcionam internamente? ... Quero dizer, eles congelam o ônibus durante as operações do conjunto de testes? Eu pesquisei no Google, mas nenhuma resposta absoluta.
Solução
Um bloqueio de rotação é mais ou menos apenas um INT compartilhado, no qual as gravações são sincronizadas. Não há bandeira especial para o processador. Então você pode adquirir mais do que um bloqueio de spin. (Você não deveria ...)
Para impedir que o sistema uni-processador seja travado, o Windows levanta o IRQL para DISPATCH_LEVEL
. O processador só pode ter um 'tópico' em execução em DISPATCH_LEVEL
, portanto, travar vários bloqueios de spin ao mesmo tempo é seguro nesses sistemas.
A implementação deve ser assim: (não 100% verdadeira e pode divergir devido a detalhes)
LONG lock = 0;
KeAcquireSpinlock( ... )
{
// raise irql. etc.
while( InterlockedExchange( &lock, 1 ) != 0 )
/* do nothing*/;
}
KeReleaseSpinLock( ... )
{
InterlockedExchange( &lock, 0 );
// lower irql ... etc.
}
InterlockedExchange
Garanta que a troca ocorra atomicamente para todos os processadores no mesmo barramento de memória. Portanto, ele deve bloquear o barramento de memória ou pelo menos forçar a propriedade única da linha de cache específica.