Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Процесс — это программа, которая в настоящее время работает в Windows. Каждый процесс имеет идентификатор, число, которое идентифицирует его. поток — это объект, определяющий, какая часть программы выполняется. Каждый поток имеет идентификатор, номер, который идентифицирует его.
Процесс может иметь несколько потоков. Цель потока — выделить время на процессоре. На компьютере с одним процессором можно выделить несколько потоков, но одновременно может выполняться только один поток. Каждый поток выполняется только в течение короткого времени, а затем выполнение передается следующему потоку, что дает пользователю иллюзию, что несколько моментов происходит одновременно. На компьютере с несколькими процессорами может происходить настоящий многопоточный режим. Если у приложения несколько потоков, потоки могут выполняться одновременно на разных процессорах.
Диспетчер процессов и потоков режима ядра Windows управляет выполнением всех потоков в процессе. Независимо от того, имеется ли один процессор или несколько, необходимо соблюдать большую осторожность в программировании драйверов, чтобы убедиться, что все потоки процесса разработаны таким образом, чтобы независимо от порядка обработки потоков, драйвер работает правильно.
Если потоки из разных процессов пытаются использовать один и тот же ресурс одновременно, могут возникнуть проблемы. Windows предоставляет несколько методов, чтобы избежать этой проблемы. Способ убедиться, что потоки из разных процессов не касаются одного ресурса, называется синхронизацией. Дополнительные сведения о синхронизации см. в методах синхронизации.
Подпрограммы, обеспечивающие прямой интерфейс для управляющего процессами и потоками, обычно начинаются с букв "Ps"; например, PsCreateSystemThread. Для списка DDI ядра см. раздел ядра Windows.
Лучшие практики по реализации функций обратного вызова, связанных с процессами и потоками
Этот набор рекомендаций применяется к этим подпрограммам обратного вызова:
PCREATE_PROCESS_NOTIFY_ROUTINE
PCREATE_PROCESS_NOTIFY_ROUTINE_EX
Используйте следующие рекомендации.
- Держите рутины короткими и простыми.
- Не вызывайте вызовы в службу пользовательского режима, чтобы проверить процесс, поток или изображение.
- Не вызывайте вызовы реестра.
- Не делайте вызовы функции блокировки и (или) межпроцессного взаимодействия (IPC).
- Не синхронизируйтесь с другими потоками, так как это может привести к взаимоблокировкам повторного входа.
- Используйте рабочие потоки системы для постановки задач в очередь, особенно если они связаны с:
- Медленные АПИ или 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.