Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Kolejkowane blokady spin są wariantem blokad spin, które działają dobrze dla silnie obciążonych blokad. Tradycyjne, niekolejkowane spinlocki są lepszym wyborem dla lekko obciążonych lub krótszego czasu trwania blokad.
Zalety korzystania z blokady spinu w kolejce obejmują:
Zmniejszona rywalizacja o procesor: tradycyjne blokady spin mogą prowadzić do znacznego konfliktu o zasoby procesora, gdy wiele wątków próbuje uzyskać blokadę jednocześnie, ponieważ stale się zapętlają (lub "kręcą się"), sprawdzając stan blokady. Może to obniżyć wydajność systemu, zwłaszcza w systemach wieloprocesorowych. Zabezpieczenia spin w kolejce ograniczają ten problem poprzez organizowanie wątków w kolejce. Gdy wątek uzyskuje blokadę, tylko następny w wierszu aktywnie wiruje, czekając na uzyskanie blokady. Zmniejsza to marnotrawstwo cykli procesora podczas wirowania, zwłaszcza gdy blokada jest utrzymywana przez dłuższy czas.
Sprawiedliwość i unikanie głodu: Jednym z problemów z podstawowymi spin lockami jest brak sprawiedliwości; wątek może być zagłodzony i nigdy nie uzyskać zamka, jeśli inne wątki ciągle zdobywają i zwalniają zamek. Kolejkowane blokady spin rozwiązują ten problem, zapewniając, że wątki uzyskują blokadę w kolejności, w której próbowały ją zdobyć. Ta sekwencyjna obsługa zapobiega głodowaniu i zapewnia, że wszystkie wątki są obsługiwane z czasem.
Skalowalność: wraz ze wzrostem liczby procesorów lub rdzeni w systemie wydajność mechanizmów synchronizacji staje się krytyczna dla wydajności. Kolejkowane blokady spin są bardziej skalowalne niż tradycyjne blokady spin, ponieważ zmniejszają obciążenie procesorów, minimalizując aktywne wirowanie na wszystkich rdzeniach. Jest to szczególnie ważne w systemach o wysokiej wydajności, wielordzeniowych, w których wydajność sterowników może mieć bezpośredni wpływ na ogólną wydajność systemu.
Efektywne wykorzystanie zasobów systemowych: dzięki zmniejszeniu niepotrzebnego obracania procesora w kolejce blokady spin umożliwiają systemowi wydajniejsze korzystanie z zasobów. Poprawia to nie tylko wydajność sterownika urządzenia, ale także ma pozytywny wpływ na ogólną czas reakcji systemu i zużycie energii, co jest szczególnie korzystne w środowiskach wrażliwych na energię.
Prostota i niezawodność: Pomimo swoich zalet w zmniejszaniu rywalizacji i poprawie sprawiedliwości, kolejkowane blokady spinowe ukrywają złożoność przed programistą. Zapewniają one prosty i niezawodny mechanizm ochrony zasobów udostępnionych bez konieczności implementowania złożonej logiki blokowania. Ta prostota zmniejsza prawdopodobieństwo występowania błędów związanych z niewłaściwą obsługą blokad, co zwiększa niezawodność sterownika.
Poniżej znajduje się uproszczony fragment kodu demonstrujący opisane operacje z blokadą spinową w kolejce w sterowniku trybu jądra dla systemu Windows. W tym przykładzie pokazano, jak zadeklarować i zainicjować blokadę spin przy użyciu metody KeInitializeSpinLock, a następnie uzyskać i zwolnić blokadę przy użyciu metody KeAcquireInStackQueuedSpinLock i KeReleaseInStackQueuedSpinLock.
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);
Sterownik przydziela strukturę KLOCK_QUEUE_HANDLE, która jest przekazywana przez wskaźnik do KeAcquireInStackQueuedSpinLock. Sterownik przekazuje tę samą strukturę przez wskaźnik do KeReleaseInStackQueuedSpinLock gdy zwalnia blokadę spin.
Sterowniki powinny zwykle przydzielać strukturę na stosie za każdym razem, gdy uzyskują blokadę. Sterownik nie powinien przydzielać struktury w ramach kontekstu urządzenia, a następnie współużytkować tę samą strukturę z wielu wątków.
Sterowniki nie mogą mieszać wywołań do procedur kolejkowanych blokad spin i zwykłych procedur KeXxxSpinLock na tej samej blokadzie spin.
Jeśli sterownik jest już w IRQL = DISPATCH_LEVEL, może wywołać KeAcquireInStackQueuedSpinLockAtDpcLevel i KeReleaseInStackQueuedSpinLockFromDpcLevel zamiast tego.