Диспетчер процессов и потоков Windows Kernel-Mode
Процесс — это программная программа, которая в настоящее время выполняется в Windows. Каждый процесс имеет идентификатор, число, идентифицирующее его. Поток — это объект, определяющий, какая часть программы выполняется. Каждый поток имеет идентификатор , число, которое идентифицирует его.
Процесс может содержать несколько потоков. Цель потока — выделить время процессора. На компьютере с одним процессором можно выделить несколько потоков, но одновременно может выполняться только один поток. Каждый поток выполняется только в течение короткого времени, а затем выполнение передается следующему потоку, создавая у пользователя иллюзию, что одновременно происходит несколько событий. На компьютере с несколькими процессорами может выполняться истинное многопоточное использование. Если приложение содержит несколько потоков, потоки могут выполняться одновременно на разных процессорах.
Процесс в режиме ядра Windows и диспетчер потоков обрабатывают выполнение всех потоков в процессе. Независимо от того, имеется ли у вас один или несколько процессоров, необходимо проявлять большую осторожность при программировании драйверов, чтобы убедиться, что все потоки спроектированы таким образом, чтобы независимо от того, в каком порядке обрабатываются потоки, ваш драйвер будет работать правильно.
Если потоки из разных процессов пытаются использовать один и тот же ресурс одновременно, могут возникнуть проблемы. Windows предоставляет несколько методов, чтобы избежать этой проблемы. Метод, обеспечивающий, чтобы потоки из разных процессов не касались одного и того же ресурса, называется синхронизацией. Дополнительные сведения о синхронизации см. в разделе Методы синхронизации.
Подпрограммы, предоставляющие прямой интерфейс для диспетчера процессов и потоков, обычно имеют префикс "Ps"; например , PsCreateSystemThread. Список DDIs ядра см. в разделе Ядро 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). Для процесса подсистемы системные вызовы и исключения пользовательского режима отправляются в связанный драйвер.
Ниже приведены изменения в подпрограммах Process и Thread Manager для поддержки процессов подсистемы.
- Тип WSL обозначается значением SubsystemInformationTypeWSL в перечислении SUBSYSTEM_INFORMATION_TYPE . Драйверы могут вызывать NtQueryInformationProcess и NtQueryInformationThread для определения базовой подсистемы. Эти вызовы возвращают SubsystemInformationTypeWSL для WSL.
- Другие драйверы режима ядра могут получать уведомления о создании или удалении процесса подсистемы, регистрируя свою подпрограмму обратного вызова с помощью вызова PsSetCreateProcessNotifyRoutineEx2 . Чтобы получать уведомления о создании и удалении потоков, драйверы могут вызывать PsSetCreateThreadNotifyRoutineEx и указывать PsCreateThreadNotifySubsystems в качестве типа уведомления.
- Структура PS_CREATE_NOTIFY_INFO была расширена, включив в него элемент IsSubsystemProcess , указывающий на подсистему, отличающуюся от Win32. Другие элементы, такие как FileObject, ImageFileName, CommandLine , указывают дополнительные сведения о процессе подсистемы. Сведения о поведении этих элементов см. в разделе SUBSYSTEM_INFORMATION_TYPE.