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.
System operacyjny Microsoft Windows NT został zaprojektowany tak, aby działał równomiernie na platformach jednoprocesorowych i symetrycznych wieloprocesorowych (SMP), a sterowniki trybu jądra powinny być zaprojektowane tak samo.
Na dowolnej platformie wieloprocesorowej systemu Windows istnieją następujące warunki:
Wszystkie procesory CPU są identyczne, a wszystkie lub żadne nie muszą mieć identycznych koprocesorów.
Wszystkie procesory CPU współdzielą pamięć i mają jednolity dostęp do pamięci.
Na symetrycznej platformie każdy procesor może uzyskać dostęp do pamięci, obsługiwać przerwania i uzyskać dostęp do rejestrów kontroli we/wy. (Natomiast w asymetrycznej maszynie wieloprocesorowej jeden procesor obsługuje wszystkie przerwania dla zestawu podrzędnych CPU).
Aby bezpiecznie uruchomić na platformie SMP, system operacyjny musi zagwarantować, że kod wykonywany na jednym procesorze nie uzyskuje jednocześnie dostępu do danych, do których inny procesor uzyskuje dostęp i modyfikuje. Jeśli na przykład ISR sterownika najniższego poziomu obsługuje przerwanie urządzenia na jednym procesorze, musi mieć wyłączny dostęp do rejestrów urządzeń lub krytycznych danych zdefiniowanych przez sterownik, na wypadek gdyby przerwanie urządzenia wystąpiło jednocześnie na innym procesorze.
Ponadto operacje we/wy sterowników, które są serializowane na maszynie jednoprocesorowej, mogą nakładać się w maszynie SMP. Oznacza to, że procedura sterownika, która przetwarza przychodzące żądania we/wy, może być wykonywana na jednym procesorze, podczas gdy inna procedura, która komunikuje się z urządzeniem jest wykonywana współbieżnie na innym procesorze. Niezależnie od tego, czy sterowniki trybu jądra są wykonywane na komputerze jednoprocesorowym, czy symetrycznym wieloprocesorowym, muszą synchronizować dostęp do dowolnych zasobów zdefiniowanych przez sterownik lub udostępnionych przez system, które są współużytkowane przez procedury sterowników, i synchronizować dostęp do urządzenia fizycznego, jeśli istnieje.
Składnik jądra Systemu Windows NT eksportuje mechanizm synchronizacji, nazywany blokadą spin, który sterowniki mogą używać do ochrony udostępnionych danych (lub rejestrów urządzeń) przed równoczesnym dostępem przez co najmniej jedną procedurę, która jest uruchomiona współbieżnie na symetrycznej platformie wieloprocesorowej. Jądro wymusza dwie zasady dotyczące używania blokad spin:
Tylko jedna rutyna może trzymać określoną blokadę spin w danym momencie. Zanim każda rutyna, która musi odwołać się do danych, uzyska dostęp do udostępnionych danych, musi najpierw podjąć próbę uzyskania blokady spinowej danych. Aby uzyskać dostęp do tych samych danych, inna rutyna musi uzyskać blokadę spin, ale blokada spin nie może zostać uzyskana, dopóki bieżący posiadacz go nie zwolni.
Jądro przypisuje wartość IRQL każdej blokadzie obrotowej w systemie. Rutyna trybu jądra może uzyskać konkretny spinlock tylko wtedy, gdy jest uruchamiana na przypisanym IRQL spinlocka.
Zasady te uniemożliwiają przerwanie procedury sterownika, która zwykle działa na niższym poziomie IRQL i obecnie posiada blokadę spin, przez procedurę sterownika o wyższym priorytecie, która próbuje uzyskać tę samą blokadę spin. W związku z tym unika się zakleszczenia.
IRQL przypisany do blokady spin jest na ogół taki jak w rutynie o najwyższym poziomie IRQL, która może uzyskać tę blokadę.
Na przykład ISR najniższego poziomu często dzieli obszar stanu z procedurą DPC sterownika. Procedura DPC wywołuje dostarczoną przez sterownik procedurę sekcji krytycznej w celu uzyskania dostępu do obszaru wspólnego. Spinlock, który chroni obszar współdzielony, ma poziom IRQL równy DIRQL, przy którym urządzenie generuje przerwania. Tak długo, jak rutynowa sekcja krytyczna przechowuje blokadę spinlock i uzyskuje dostęp do obszaru udostępnionego w DIRQL, ISR nie można uruchomić na maszynie jednoprocesorowej ani SMP.
Nie można uruchomić ISR na maszynie jednoprocesorowej, ponieważ przerwanie urządzenia jest maskowane, zgodnie z opisem w temacie Always Preemptible i Always Interruptible.
Na maszynie SMP rutyna ISR nie może pobrać blokady spinowej, która chroni udostępnione dane, podczas gdy sekcja krytyczna trzyma blokadę spinową i uzyskuje dostęp do udostępnionych danych na poziomie DIRQL.
Zestaw wątków trybu jądra może synchronizować dostęp do współdzielonych danych lub zasobów, oczekując na jeden z obiektów dyspozytorskich jądra: zdarzenie, muteks, semafor, czasomierz lub inny wątek. Jednak większość sterowników nie konfiguruje własnych wątków, ponieważ mają lepszą wydajność, gdy unikają przełączeń kontekstu wątków. Za każdym razem, gdy krytyczne czasowo procedury obsługi w trybie jądra i sterowniki działają na poziomie IRQL = DISPATCH_LEVEL lub DIRQL, muszą używać jądrowych blokad spin do synchronizacji dostępu do wspólnych danych lub zasobów.
Aby uzyskać więcej informacji, zobacz Spin Locks, Zarządzanie priorytetami sprzętu i Obiekty dyspozytora jądra.