Диспетчер процессов и потоков Windows Kernel-Mode
Процесс — это программа, которая в настоящее время работает в Windows. Каждый процесс имеет идентификатор, число, которое идентифицирует его. поток — это объект, определяющий, какая часть программы выполняется. Каждый поток имеет идентификатор, номер, который идентифицирует его.
Процесс может иметь несколько потоков. Цель потока — выделить время на процессоре. На компьютере с одним процессором можно выделить несколько потоков, но одновременно может выполняться только один поток. Каждый поток выполняется только в течение короткого времени, а затем выполнение передается следующему потоку, что дает пользователю иллюзию, что несколько моментов происходит одновременно. На компьютере с несколькими процессорами может происходить настоящий многопоточный режим. Если у приложения несколько потоков, потоки могут выполняться одновременно на разных процессорах.
Диспетчер процессов и потоков режима ядра Windows управляет выполнением всех потоков в процессе. Независимо от того, имеется ли один процессор или несколько, необходимо соблюдать большую осторожность в программировании драйверов, чтобы убедиться, что все потоки процесса разработаны таким образом, чтобы независимо от порядка обработки потоков, драйвер будет работать правильно.
Если потоки из разных процессов пытаются использовать один и тот же ресурс одновременно, могут возникнуть проблемы. Windows предоставляет несколько методов, чтобы избежать этой проблемы. Техника гарантии того, что потоки из разных процессов не касаются одного ресурса, называется синхронизация. Дополнительные сведения о синхронизации см. в методах синхронизации.
Подпрограммы, обеспечивающие прямой интерфейс для управляющего процессами и потоками, обычно начинаются с букв "Ps"; например, PsCreateSystemThread. Для списка DDI ядра см. раздел ядра Windows.
Лучшие практики по реализации функций обратного вызова, связанных с процессами и потоками
Этот набор рекомендаций применяется к этим подпрограммам обратного вызова:
PCREATE_PROCESS_NOTIFY_ROUTINE
PCREATE_PROCESS_NOTIFY_ROUTINE_EX
- Держите рутины короткими и простыми.
- Не вызывайте вызовы в службу пользовательского режима, чтобы проверить процесс, поток или изображение.
- Не делайте вызовы реестра.
- Не делайте вызовы функции блокировки и (или) межпроцессного взаимодействия (IPC).
- Не синхронизируйте с другими потоками, так как это может привести к взаимоблокировкам при повторном входе.
- Используйте рабочие потоки системы для постановки задач в очередь, особенно если они связаны с:
- Медленные API или API, которые вызывают другие процессы.
- Любое поведение блокировки, которое может прервать потоки в основных службах.
- Если вы используете рабочие потоки системы, не дождитесь завершения работы. Это сводит на нет смысл очередности выполнения работы асинхронно.
- Учтите лучшие практики для использования стека в режиме ядра. Примеры см. в разделе Как предотвратить исчерпание стека режима ядра драйвером? и Основные понятия и советы по драйверам.
Процессы подсистемы
Начиная с Windows 10 подсистема Windows для Linux (WSL) позволяет пользователю запускать собственные двоичные файлы Linux ELF64 в Windows, а также другие приложения Windows. Сведения об архитектуре WSL и компонентах пользовательского режима и режима ядра, необходимых для запуска двоичных файлов, см. в блоге подсистемы Windows для Linux.
Одним из компонентов является процесс подсистемы , который используется для неизмененного бинарного файла Linux в пользовательском режиме, такого как /bin/bash. Процессы подсистемы не содержат структур данных, связанных с процессами Win32, такими как блок среды обработки (PEB) и блок среды потоков (TEB). Для процесса подсистемы системные вызовы и исключения пользовательского режима отправляются в сопряженный драйвер.
Ниже приведены изменения в процедуры и подпрограммы Диспетчера процессов и потоков для поддержки процессов подсистемы:
- Тип WSL указывается значением SubsystemInformationTypeWSL в перечислении SUBSYSTEM_INFORMATION_TYPE. Драйверы могут вызывать NtQueryInformationProcess и NtQueryInformationThread для определения базовой подсистемы. Эти вызовы возвращают SubsystemInformationTypeWSL для WSL.
- Другие драйверы режима ядра могут получать оповещения о создании и удалении процессов подсистемы, регистрируя свою обратную функцию через вызов PsSetCreateProcessNotifyRoutineEx2. Чтобы получать уведомления о создании и удалении потоков, драйверы могут вызывать PsSetCreateThreadNotifyRoutineExи указать PsCreateThreadNotifySubsystems в качестве типа уведомления.
- Структура PS_CREATE_NOTIFY_INFO была расширена, чтобы включить элемент IsSubsystemProcess, указывающий подсистему, отличной от Win32. Другие члены, такие как FileObject, ImageFileName, CommandLine указывают дополнительные сведения о процессе подсистемы. См. сведения о поведении этих членов в SUBSYSTEM_INFORMATION_TYPE.