Udostępnij przez


Menedżer procesów i zarządzania wątkami w trybie jądra systemu Windows

Dostarczany przez system Windows menedżer procesów i wątków trybu jądra kontroluje sposób, w jaki procesy i wątki są wykonywane w systemie operacyjnym Windows. Zrozumienie tego menedżera jest niezbędne dla deweloperów sterowników trybu jądra, którzy muszą tworzyć wątki, monitorować tworzenie procesów lub synchronizować dostęp do zasobów udostępnionych.

Przykładowy sterownik ObCallback pokazuje, jak używać procedur powiadomień procesów i wątków w sterowniku działającym w trybie jądra.

Omówienie procesów i wątków

Proces to program, który jest obecnie uruchomiony w systemie Windows i identyfikowany przez unikatowy identyfikator procesu (PID). W ramach każdego procesu co najmniej jeden wątek reprezentuje rzeczywiste jednostki wykonywania, które uruchamiają kod programu. Każdy wątek ma również unikatowy identyfikator wątku (TID) w ramach procesu.

Wątki umożliwiają wielozadaniowość poprzez udostępnianie czasu procesora. Na maszynie z jednym procesorem można przydzielić wiele wątków, ale tylko jeden z nich wykonuje się jednocześnie. Procesor szybko przełącza się między wątkami, tworząc iluzję jednoczesnego wykonywania. W systemach z wieloma procesorami wykonywane jest prawdziwe równoległe wykonywanie, gdy wątki są uruchamiane jednocześnie na różnych procesorach.

Menedżer procesów trybu jądra systemu Windows i wątków zarządza wykonywaniem wszystkich wątków w procesie. Niezależnie od tego, czy masz jeden procesor, czy więcej, należy wziąć pod uwagę programowanie sterowników, aby upewnić się, że wszystkie wątki procesu są zaprojektowane tak, aby bez względu na kolejność, jakie wątki są obsługiwane, sterownik działa prawidłowo.

Jeśli wątki z różnych procesów próbują jednocześnie używać tego samego zasobu, mogą wystąpić problemy. System Windows udostępnia kilka technik umożliwiających uniknięcie tego problemu. Technika upewnienia się, że wątki z różnych procesów nie dotykają tego samego zasobu, jest nazywana synchronizacją. Aby uzyskać więcej informacji na temat synchronizacji, zobacz Techniki synchronizacji.

Procedury, które zapewniają bezpośredni interfejs do procesu i menedżera wątków są zwykle poprzedzone literami "Ps"; na przykład PsCreateSystemThread. Aby uzyskać listę identyfikatorów DDI jądra, zobacz Jądro systemu Windows.

Ten zbiór wytycznych dotyczy następujących procedur zwrotnych:

Skorzystaj z następujących najlepszych rozwiązań:

  • Zachowaj krótkie i proste procedury.
  • Nie należy wykonywać wywołań w usłudze trybu użytkownika w celu zweryfikowania procesu, wątku ani obrazu.
  • Nie wykonuj wywołań rejestru.
  • Nie należy wykonywać wywołań funkcji blokowania i/lub komunikacji międzyprocesowej (IPC).
  • Nie synchronizuj się z innymi wątkami, ponieważ może to prowadzić do ponownego zakleszczenia.
  • Użyj wątków roboczych systemu, aby kolejkować pracę, szczególnie tę obejmującą:
    • Powolne interfejsy API lub interfejsy API wywołujące inny proces.
    • Wszelkie blokujące zachowania, które mogą zakłócać działanie wątków w usługach podstawowych.
  • Jeśli używasz systemowych wątków roboczych, nie czekaj na zakończenie zadania. W ten sposób traci sens kolejkowanie pracy do wykonania asynchronicznie.
  • Należy wziąć pod uwagę najlepsze rozwiązania dotyczące użycia stosu trybu jądra. Aby zapoznać się z przykładami, zobacz Jak zapobiec wyczerpaniu się stosu trybu jądra przez mój sterownik? oraz Kluczowe pojęcia i porady dotyczące sterowników.

Procesy podsystemu

Począwszy od systemu Windows 10, podsystem Windows dla systemu Linux (WSL) umożliwia użytkownikowi uruchamianie natywnych plików binarnych Systemu Linux ELF64 w systemie Windows, wraz z innymi aplikacjami systemu Windows. Aby uzyskać informacje na temat architektury WSL oraz składników trybu użytkownika i trybu jądra wymaganych do uruchamiania plików binarnych, zobacz wpisy w blogu Podsystem Windows dla systemu Linux .

Jednym z składników jest proces podsystemu , który hostuje niezmodyfikowany plik binarny systemu Linux w trybie użytkownika, taki jak /bin/bash. Procesy podsystemu nie zawierają struktur danych skojarzonych z procesami Win32, takimi jak blok środowiska przetwarzania (PEB) i blok środowiska wątkowego (TEB). W przypadku procesu podsystemu wywołania systemowe i wyjątki trybu użytkownika są wysyłane do sparowanego sterownika.

Poniżej przedstawiono zmiany procedur procesu i menedżera wątków w celu obsługi procesów podsystemu:

  • Typ WSL jest wskazywany przez wartość SubsystemInformationTypeWSL w wyliczeniu SUBSYSTEM_INFORMATION_TYPE. Sterowniki mogą wywoływać ntQueryInformationProcess i NtQueryInformationThread w celu określenia podstawowego podsystemu. Wywołania te zwracają SubsystemInformationTypeWSL dla programu WSL.

  • Inne sterowniki trybu jądra mogą otrzymywać powiadomienia o tworzeniu/usuwaniu procesu podsystemu, rejestrując procedurę wywołania zwrotnego za pośrednictwem wywołania PsSetCreateProcessNotifyRoutineEx2 . Aby otrzymywać powiadomienia o tworzeniu/usuwaniu wątków, sterowniki mogą wywoływać element PsSetCreateThreadThreadNotifyRoutineEx i określać psCreateThreadNotifySubsystems jako typ powiadomienia.

  • Struktura PS_CREATE_NOTIFY_INFO została rozszerzona w celu uwzględnienia elementu członkowskiego IsSubsystemProcess , który wskazuje podsystem inny niż Win32. Inne elementy członkowskie, takie jak FileObject, ImageFileName, CommandLine , wskazują dodatkowe informacje o procesie podsystemu. Aby uzyskać informacje o zachowaniu tych członków, zobacz SUBSYSTEM_INFORMATION_TYPE.