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.
Celem wywłaszczanego, przerywanego projektowania systemu operacyjnego jest maksymalizacja wydajności systemu. Każdy wątek może zostać wywłaszczony przez wątek o wyższym priorytecie, a każda procedura obsługi przerwań kierowcy (ISR) może zostać przerwana przez procedurę uruchamianą na wyższym poziomem żądania przerwań (IRQL).
Składnik jądra określa, kiedy jest uruchamiana sekwencja kodu, zgodnie z jednym z następujących kryteriów priorytetyzacji:
Zdefiniowany przez jądro schemat priorytetu czasu wykonywania dla wątków.
Każdy wątek w systemie ma skojarzony atrybut priorytetu. Ogólnie rzecz biorąc, większość wątków ma zmienne atrybuty priorytetu: są one zawsze przerywalne i są zaplanowane do cyklicznego uruchamiania ze wszystkimi innymi wątkami, które są obecnie na tym samym poziomie priorytetu. Niektóre wątki mają atrybuty priorytetu czasu rzeczywistego: te czasowo krytyczne wątki są uruchamiane do ukończenia, chyba że zostaną wywłaszczone przez wątek, który ma wyższy atrybut priorytetu czasu rzeczywistego. Architektura systemu Microsoft Windows nie zapewnia z natury systemu czasu rzeczywistego.
Niezależnie od atrybutu priorytetu, każdy wątek w systemie może zostać wywłaszczony, gdy występują przerwania sprzętowe i niektóre typy przerwań oprogramowania.
Poziom żądania przerwania zdefiniowanego przez jądro (IRQL), do którego przypisano określony wektor przerwania na danej platformie.
Jądro priorytetyzuje przerwania sprzętowe i programowe, aby kod działający w trybie jądra, w tym większość sterowników, był wykonywany na wyższych poziomach IRQL, co daje mu wyższy priorytet planowania niż innym wątkom w systemie. Określony poziom IRQL, na którym wykonywany jest kod sterownika trybu jądra, jest określany przez priorytet sprzętowy jego urządzenia bazowego.
Kod trybu jądra jest zawsze przerywalny: w dowolnym momencie może wystąpić przerwanie z wyższym poziomem IRQL, co powoduje, że inny fragment kodu trybu jądra, który ma wyższe IRQL przypisane przez system, zostanie natychmiast uruchomiony na tym procesorze. Jednak gdy fragment kodu jest uruchamiany przy danym poziomie IRQL, jądro maskuje wszystkie wektory przerwań o mniejszej lub równej wartości IRQL dla procesora.
Najniższy poziom IRQL jest nazywany PASSIVE_LEVEL. Na tym poziomie nie są maskowane żadne wektory przerwań. Wątki są zwykle prowadzone na poziomie IRQL=PASSIVE_LEVEL. Kolejne wyższe poziomy IRQL dotyczą przerwań oprogramowania. Te poziomy obejmują APC_LEVEL, DISPATCH_LEVEL lub, w przypadku debugowania jądra, WAKE_LEVEL. Przerwania urządzeń mają jeszcze wyższe wartości IRQL. Jądro rezerwuje najwyższe wartości IRQL dla przerwań krytycznych systemu, takich jak błędy zegara systemowego lub magistrali.
Niektóre procedury obsługi systemu są uruchamiane w środowisku IRQL=PASSIVE_LEVEL, ponieważ są one implementowane jako kod z możliwością stronicowania lub uzyskiwanie dostępu do danych stronicowanych albo niektóre składniki trybu jądra konfigurują własne wątki.
Podobnie niektóre standardowe procedury sterowników zwykle działają w IRQL=PASSIVE_LEVEL. Jednak kilka standardowych procedur sterowników jest uruchamianych w środowisku IRQL=DISPATCH_LEVEL lub w przypadku sterownika najniższego poziomu w środowisku IRQL urządzenia (nazywanym również DIRQL). Aby uzyskać więcej informacji na temat IRQL, zobacz Zarządzanie priorytetami sprzętu.
Każda rutyna w sterowniku może być przerywana. Obejmuje to wszelkie procedury uruchomione na wyższym poziomie IRQL niż PASSIVE_LEVEL. Każda rutyna uruchomiona w określonym środowisku IRQL zachowuje kontrolę nad procesorem tylko wtedy, gdy podczas wykonywania tej procedury nie ma przerwań dla wyższego środowiska IRQL.
W przeciwieństwie do sterowników w niektórych starszych systemach operacyjnych komputerów osobistych, ISR sterownika systemu Microsoft Windows nigdy nie jest dużą, złożoną procedurą, która wykonuje większość przetwarzania wejścia/wyjścia sterownika. Jest to spowodowane tym, że każda rutyna obsługi przerwań sterownika (ISR) może zostać przerwana przez inną procedurę (na przykład przez ISR innego sterownika), która działa na wyższym IRQL. W związku z tym ISR sterownika niekoniecznie sprawuje nieprzerwaną kontrolę nad procesorem, od początku do końca jego ścieżki wykonywania.
W sterownikach systemu Windows isR zwykle zapisuje informacje o stanie sprzętu, kolejkuje odroczone wywołanie procedury (DPC), a następnie szybko kończy działanie. Później system zdejmuje z kolejki DPC sterownika, aby sterownik mógł ukończyć operacje wejścia/wyjścia na niższym poziomie IRQL (DISPATCH_LEVEL). Aby uzyskać dobrą ogólną wydajność systemu, wszystkie procedury działające na wysokich poziomach IRQL muszą szybko zrzec się kontroli nad CPU.
W systemie Windows wszystkie wątki mają kontekst wątku. Ten kontekst składa się z informacji, które identyfikują proces, który jest właścicielem wątku, oraz inne cechy, takie jak prawa dostępu wątku.
Ogólnie rzecz biorąc, tylko sterownik najwyższego poziomu jest wywoływany w kontekście wątku, który żąda bieżącej operacji we/wy sterownika. Sterownik poziomu pośredniego lub najniższego poziomu nigdy nie może zakładać, że jest wykonywany w kontekście wątku, który zażądał bieżącej operacji we/wy.
W związku z tym, rutyny sterownika zwykle są wykonywane w dowolnym kontekście wątku — kontekście aktualnego wątku, gdy wywoływana jest standardowa rutyna sterownika. Ze względu na wydajność (aby uniknąć przełączników kontekstowych), bardzo mało sterowników konfiguruje własne wątki.