Pergunta

  1. Dois CPUs podem manter dois bloqueios de rotação "diferentes" simultaneamente ao mesmo tempo?

  2. Então ... isso significa: uma CPU Sigle (Uniprocessor) não pode conter dois spinlocks "diferentes" ao mesmo tempo?

  3. 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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top