Udostępnij przez


Zapobieganie błędom i zakleszczeniom podczas korzystania z blokad spinowych

Podczas gdy procedura sterownika przechowuje blokadę spinu, nie może spowodować wyjątku sprzętowego lub zgłosić wyjątek oprogramowania bez wyłączania systemu. Innymi słowy, ISR sterownika i każda procedura SynchCritSection, które sterownik podaje w wywołaniu KeSynchronizeExecution, nie może spowodować błędu ani pułapki, takich jak błąd strony lub wyjątek arytmetyczny, i nie może zgłosić wyjątku programowego. Rutyna, która wywołuje KeAcquireSpinLock lub KeAcquireInStackQueuedSpinLock, nie może również spowodować wyjątku sprzętowego ani wywołać wyjątku programowego, dopóki nie zwolni blokady spinlock na poziomie wykonawczym i przestanie działać na poziomie IRQL = DISPATCH_LEVEL.

Stronicowalne dane i rutyny wsparcia

Podczas przechowywania blokady spin, kierowcy nie mogą wywoływać procedur, które uzyskują dostęp do danych stronicowalnych. Należy pamiętać, że sterowniki mogą wywoływać pewne procedury wsparcia, które uzyskują dostęp do danych stronicowalnych, jeśli i tylko wtedy, gdy są wykonywane na poziomie IRQL ściśle niższym niż DISPATCH_LEVEL. To ograniczenie IRQL uniemożliwia wywoływanie tych procedur pomocniczych podczas trzymania blokady spinowej. Aby uzyskać wymagania dotyczące środowiska IRQL dla każdej konkretnej procedury pomocy technicznej, zobacz stronę referencyjną procedury.

Rekursja

Próba rekursywnego uzyskania blokady spin z pewnością doprowadzi do zakleszczenia: instancja rekursywnej procedury nie może zwolnić spin locka, podczas gdy druga instancja kręci się, próbując uzyskać tę samą blokadę spin.

W poniższych wytycznych opisano sposób używania blokad spin z cyklicznych procedur:

  • Powtarzająca się rutyna nie może wywoływać się podczas trzymania blokady spin lub nie może próbować uzyskać tej samej blokady spin na kolejnych wywołaniach.

  • Podczas gdy procedura rekursywna trzyma blokadę spinową, inna procedura sterownika nie powinna jej wywoływać, jeśli rekursja mogłaby spowodować zakleszczenie lub sprawić, że wywołujący utrzyma blokadę spinową przez ponad 25 mikrosekund.

Aby uzyskać więcej informacji na temat rekursywnych procedur sterowników, zobacz Using the Kernel Stack (Używanie stosu jądra).

Zagnieżdżone pozyskiwanie blokady spin

Próba uzyskania drugiej blokady spin przy zachowaniu innej blokady spin może również spowodować zakleszczenia lub niską wydajność sterownika.

Poniższe wytyczne opisują, jak kierowcy powinni utrzymywać blokady spinowe:

  • Kierowca nie może wywołać procedury pomocy technicznej, która używa blokady spin, chyba że nie może wystąpić impas.

  • Nawet jeśli nie może wystąpić zakleszczenie, sterownik nie powinien wywoływać procedury pomocniczej, która używa blokady spinlock, chyba że alternatywne techniki kodowania nie mogą zapewnić porównywalnej wydajności i funkcjonalności sterownika.

  • Jeśli kierowca wykonuje zagnieżdżone wywołania w celu zdobycia blokad spinowych, musi zawsze zdobywać je w tej samej kolejności za każdym razem. Ta kolejność pomaga uniknąć zakleszczeń.

Ogólnie rzecz biorąc, unikaj używania zagnieżdżonych blokad spinowych, aby chronić przekrywające się podzestawy lub odrębne zestawy współdzielonych danych i zasobów. Zastanów się, co może się zdarzyć, jeśli sterownik używa dwóch blokad spin-lock executive w celu ochrony dyskretnych zasobów, takich jak para obiektów czasomierza, które mogą być ustawiane indywidualnie i zbiorczo przez różne funkcje sterownika. Sterownik sporadycznie blokował się w maszynie SMP za każdym razem, gdy jedna z dwóch procedur, każda trzymająca jedną blokadę wirującą, próbowała zdobyć drugą blokadę.

Aby uzyskać więcej informacji na temat uzyskiwania zagnieżdżonych blokad spinowych, zobacz Blokady, Zakleszczenia i Synchronizacja.