Поделиться через


Менеджер процессов и потоков в режиме ядра Windows

Процесс — это программа, которая в настоящее время работает в Windows. Каждый процесс имеет идентификатор, число, которое идентифицирует его. поток — это объект, определяющий, какая часть программы выполняется. Каждый поток имеет идентификатор, номер, который идентифицирует его.

Процесс может иметь несколько потоков. Цель потока — выделить время на процессоре. На компьютере с одним процессором можно выделить несколько потоков, но одновременно может выполняться только один поток. Каждый поток выполняется только в течение короткого времени, а затем выполнение передается следующему потоку, что дает пользователю иллюзию, что несколько моментов происходит одновременно. На компьютере с несколькими процессорами может происходить настоящий многопоточный режим. Если у приложения несколько потоков, потоки могут выполняться одновременно на разных процессорах.

Диспетчер процессов и потоков режима ядра Windows управляет выполнением всех потоков в процессе. Независимо от того, имеется ли один процессор или несколько, необходимо соблюдать большую осторожность в программировании драйверов, чтобы убедиться, что все потоки процесса разработаны таким образом, чтобы независимо от порядка обработки потоков, драйвер работает правильно.

Если потоки из разных процессов пытаются использовать один и тот же ресурс одновременно, могут возникнуть проблемы. Windows предоставляет несколько методов, чтобы избежать этой проблемы. Способ убедиться, что потоки из разных процессов не касаются одного ресурса, называется синхронизацией. Дополнительные сведения о синхронизации см. в методах синхронизации.

Подпрограммы, обеспечивающие прямой интерфейс для управляющего процессами и потоками, обычно начинаются с букв "Ps"; например, PsCreateSystemThread. Для списка DDI ядра см. раздел ядра Windows.

Этот набор рекомендаций применяется к этим подпрограммам обратного вызова:

PCREATE_PROCESS_NOTIFY_ROUTINE

PCREATE_PROCESS_NOTIFY_ROUTINE_EX

PCREATE_THREAD_NOTIFY_ROUTINE

PLOAD_IMAGE_NOTIFY_ROUTINE

POB_PRE_OPERATION_CALLBACK

POB_POST_OPERATION_CALLBACK

Используйте следующие рекомендации.

  • Держите рутины короткими и простыми.
  • Не вызывайте вызовы в службу пользовательского режима, чтобы проверить процесс, поток или изображение.
  • Не вызывайте вызовы реестра.
  • Не делайте вызовы функции блокировки и (или) межпроцессного взаимодействия (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.