Due spinlocks sullo stesso processore?
-
26-09-2019 - |
Domanda
-
Can due CPU tengono due "diversi" di spin serrature contemporaneamente allo stesso tempo?
-
Quindi ... significa questo:? Una CPU (monoprocessore) sigle non può contenere due spinlocks "diversi", allo stesso tempo
-
Quindi ... significa questo:. Il numero di spinlocks su una singola CPU non può essere> 1
PS:. "Diverso" che implica spinlock associata a diverse risorse di memoria
Qualcuno sa come spinlocks funziona internamente? ... Insomma, fanno congelare bus durante le operazioni di set di prova? Googled ma nessuna risposta assoluta.
Soluzione
Uno spin-lock è più o meno solo un int condiviso, al quale sono sincronizzati scrive. Non v'è nessuna bandiera speciale per il processore. Così si può acquistare più di una spin-serratura. (Non si dovrebbe ...)
Per evitare monoprocessore sistema di bloccarsi, finestre solleva l'IRQL a DISPATCH_LEVEL
. Il processore può avere una sola 'filo' esecuzione a DISPATCH_LEVEL
, così bloccando multipli spin-serrature, allo stesso tempo, è sicuro su questi sistemi.
L'applicazione dovrebbe essere come questo: (non è vero al 100%, e può divergere a causa di dettagli)
LONG lock = 0;
KeAcquireSpinlock( ... )
{
// raise irql. etc.
while( InterlockedExchange( &lock, 1 ) != 0 )
/* do nothing*/;
}
KeReleaseSpinLock( ... )
{
InterlockedExchange( &lock, 0 );
// lower irql ... etc.
}
garanzie InterlockedExchange
che lo scambio avvenga atomicamente per tutti i processori sullo stesso bus di memoria. Così deve bloccare il bus di memoria, o almeno forza la proprietà esclusiva della linea di cache specifica.