Pages Menu
Categories Menu

Опубликовано | Нет комментариев

Процесс System и системные потоки

Процесс System (с идентификатором 4) дает начало потоку особого рода, запускаемому только в режиме ядра: системному потоку режима ядра. У системных потоков есть все атрибуты и контекстные составляющие, присущие обычным потокам пользовательского режима (например, контекст оборудования, приоритет и т. д.), но их отличие состоит в том, что они запускаются только в исполняемом коде в режиме ядра, который загружен в системное пространство, будь то код Ntoskrnl.exe или код любого другого загруженного драйвера устройства.

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

Системные потоки создаются функцией PsCreateSystemThread (см. WDK), которая может быть вызвана только из режима ядра. Windows, а также различные драйверы устройств создают системные потоки при инициализации системы для выполнения операций, которым требуется контекст потока: например, для выдачи запросов на ввод-вывод и ожидания ответной реакции, или для ожидания реакции других объектов, или для опроса какого-нибудь устройства.

Например, диспетчер памяти использует системные потоки для реализации таких функций, как запись измененных страниц в страничные файлы или в отображенные файлы, свопинг процессов в память и из памяти и т. д. Ядро создает системный поток под названием диспетчер настройки баланса (balance set manager), который активизируется каждую секунду для возможной инициации событий, связанных с планированием и управлением памятью. Системные потоки используются также диспетчером кэша для реализации опережающего чтения и отложенной записи при операциях ввода вывода.

Драйвер файлового сервера (Srv2.sys) использует системные потоки для ответа на сетевые запросы ввода-вывода применительно к файловым данным, находящимся на общих для сети разделах диска. Для опроса устройства системные потоки есть даже у драйвера дисковода гибких дисков. (Опрос в данном случае более эффективен, поскольку привод гибких дисков, управляемый с помощью прерываний, расходует больше системных ресурсов.)

По умолчанию системные потоки принадлежат процессу System, но драйвер устройства может создать системный поток в любом процессе. Например, драйвер устройства подсистемы Windows (Win32k.sys) создает системный поток внутри драйвера дисплея Canonical Display Driver (Cdd.dll), части процесса подсистемы Windows (Csrss.exe), чтобы он мог иметь упрощенный доступ к данным этого процесса, находящимся в адресном пространстве пользовательского режима.

При поиске неисправностей или анализе системы полезно сопоставить выполнение отдельных системных потоков с драйвером или даже с подпрограммой, содержащей код. Например, на сильно загруженном файловом сервере процесс System будет, скорее всего, потреблять существенную долю времени центрального процессора. Но для определения, какой именно драйвер устройства или компонент операционной системы запущен, будет недостаточно знания о том, что при запуске процесса System запускается «некий системный поток».

Поэтому, если потоки запущены в процессе System, сначала нужно определить, какой из них запущен (например, с помощью монитора производительности — Performance Monitor). При обнаружении запущенного потока (или потоков) посмотрите, в каком драйвере начал выполняться системный поток (что, по крайней мере, подскажет вам, какой именно драйвер, скорее всего, создал поток), или изучите стек вызовов (или, как минимум, текущий адрес) данного потока, что покажет, где поток выполняется в данное время.

Оба этих приема показаны в следующих экспериментах.

Эксперимент: отображение системного потока на драйвер устройства.

В данном эксперименте будет показано, как установить соответствие активности центрального процессора с процессом System и с его системным потоком, который вызвал эту активность (и с драйвером, в который попадает этот поток). Это важно, потому что, когда запущен процесс System, нужно разобраться с его потоками, чтобы понять, что происходит. Для данного эксперимента мы сгенерируем активность системного потока путем генерации активности файлового сервера на вашей машине. (Драйвер файлового сервера, Srv2.sys, создает системные потоки для обработки входящих запросов файлового ввода-вывода.

  1. Откройте окно командной строки.
  2. Выведите список каталогов всего вашего диска C, используя для доступа к нему сетевой путь. Например, если имя вашего компьютера COMPUTER1, наберите команду dir \\computer1\c$ /s (ключ /s приведет к выводу всех подкаталогов).
  3. Запустите средство Process Explorer и дважды щелкните на строке процесса System.
  4. Щелкните на вкладке Threads (Потоки).
  5. Отсортируйте таблицу по столбцу CSwitch Delta (изменения в переключениях контекста). Вы должны увидеть один или несколько потоков, запущенных в Srv2.sys, таких как, например, следующие.

потоки

Если вы видите запущенный системный поток и не уверены, к какому драйверу он относится, щелкните на кнопке Module (Модуль), которая позволит извлечь свойства файла. Щелчок на кнопке Module (Модуль) при выделенном как на предыдущем рисунке потоком в Srv2.sys, приведет к отображению следующей информации.

Srv2

Оставить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Лимит времени истёк. Пожалуйста, перезагрузите CAPTCHA.

↓