Zwei Spinlocks auf demselben Prozessor?
-
26-09-2019 - |
Frage
-
Can zwei CPUs halten zwei "unterschiedliche" Drehsperren gleichzeitig zur gleichen Zeit?
-
So ... bedeutet das: eine Sigle (Uniprozessor) CPU kann nicht zwei "anders" spinlocks zugleich halten
-
So ... bedeutet das:. Die Anzahl der Spinlocks auf einer einzigen CPU kann nicht sein> 1
PS:. "Anders" impliziert spinlock im Zusammenhang mit verschiedenen Speicherressourcen
Weiß jemand, wie spinlocks intern arbeiten? ... ich meine, frieren sie Bus während Testset Operationen? Ich habe gegoogelt aber keine absolute Antwort.
Lösung
Ein Spin-Lock ist mehr oder weniger nur eine gemeinsame int, auf die Schreib synchronisiert ist. Es gibt keine spezielle Flagge für den Prozessor. So können Sie mehr als ein Spin-Lock erwerben. (Sie sollten nicht ...)
Uni-Prozessor-System Um zu verhindern, Einsperren, Fenster werfen die IRQL DISPATCH_LEVEL
. Der Prozessor nur einen ‚Faden‘ hat, kann bei DISPATCH_LEVEL
ausgeführt wird, so dass mehrere Spin-Sperren zugleich sperrt, ist sicher auf diesen Systemen.
Die Umsetzung so sein sollte: (nicht 100% wahr und kann aufgrund Details abweichen)
LONG lock = 0;
KeAcquireSpinlock( ... )
{
// raise irql. etc.
while( InterlockedExchange( &lock, 1 ) != 0 )
/* do nothing*/;
}
KeReleaseSpinLock( ... )
{
InterlockedExchange( &lock, 0 );
// lower irql ... etc.
}
InterlockedExchange
garantiert, dass der Austausch geschieht atomar für alle Prozessoren auf dem gleichen Speicherbus. So muss es den Speicher-Bus sperrt oder zumindest Kraftalleineigentum der jeweiligen Cache-Zeile.