База полезных знаний

Процессы, потоки и задания

Хотя при поверхностном взгляде программы и процессы похожи друг на друга, на самом деле они в корне различаются. Программа — это статическая последовательность инструкций, в то время как процесс — это контейнер для набора ресурсов, используемых при выполнении экземпляра программы. На самом высоком уровне абстракции Windows-процесс включает в себя следующее:

Каждый процесс также указывает на свой родительский процесс или процесс-создатель. Если родительского процесса больше нет, эта информация не обновляется. Поэтому процесс может указывать на уже несуществующий родительский процесс. Это не создает никаких проблем, поскольку от актуальности этой информации ничего не зависит. При использовании программы исследования процессов ProcessExplorer берется в расчет время запуска родительского процесса, чтобы избежать присоединения дочернего процесса на основе повторно используемого идентификатора процесса. Такое поведение иллюстрируется экспериментом, описанным ниже.

Эксперимент: просмотр дерева процессов.

Одним из уникальных атрибутов, относящихся к процессу и неотображаемых большинством инструментальных средств, является идентификатор родительского процесса или процесса-создателя (parent or creator process ID).

Это значение можно извлечь с помощью Системного монитора (Performance Monitor) или программным способом, путем запроса Creating Process ID.

Дерево процессов может показать такое средство, как Tlist.exe (из состава предназначенных для Windows средств отладки Debugging Tools), используемое с ключом /t. Рассмотрим пример вывода, полученного в результате выполнения команды tlist /t:

C:\>tlist /t

System Process (0)

System (4)

smss.exe (224)

csrss.exe (384)

csrss.exe (444)

conhost.exe (3076) OleMainThreadWndName

winlogon.exe (496)

wininit.exe (504)

services.exe (580)

svchost.exe (696)

svchost.exe (796)

svchost.exe (912)

svchost.exe (948)

svchost.exe (988)

svchost.exe (244)

WUDFHost.exe (1008)

dwm.exe (2912) DWM Notification Window

btwdins.exe (268)

svchost.exe (1104)

svchost.exe (1192)

svchost.exe (1368)

svchost.exe (1400)

spoolsv.exe (1560)

svchost.exe (1860)

svchost.exe (1936)

svchost.exe (1124)

svchost.exe (1440)

svchost.exe (2276)

taskhost.exe (2816) Task Host Window

svchost.exe (892)

lsass.exe (588)

lsm.exe (596)

explorer.exe (2968) Program Manager

cmd.exe (1832) Administrator: C:\Windows\system32\cmd.exe - "c:\tlist.exe" /t

tlist.exe (2448)

Чтобы показать взаимоотношения каждого процесса с его родительскими и дочерними процессами, применяются отступы. Процессы, родители которых прекратили свое существование, выровнены по левому краю (как Explorer.exe в предыдущем примере), поскольку, даже при наличии прародительского процесса, способов обнаружения связи с ним просто не существует. Windows сохраняет только идентификатор процесса-создателя и не дает ссылок на создателя этого создателя и т. д.

Чтобы продемонстрировать тот факт, что Windows не отслеживает более одного идентификатора родительского процесса, выполните следующие действия:

  1. Откройте окно командной строки.
  2. Наберите title Parent, чтобы изменить заголовок окна на «Parent» (родительский).
  3. Наберите start cmd (что приведет к запуску второго окна командной строки).
  4. Наберите во втором окне командной строки title Child, чтобы изменить заголовок окна на «Child» (дочерний).
  5. Откройте Диспетчер задач.
  6. Наберите во втором окне командной строки mspaint (команду, запускающую Microsoft Paint).
  7. Снова обратитесь ко второму окну командной строки и наберите exit. (Заметьте, что Paint остается в рабочем состоянии.)
  8. Перейдите в Диспетчер задач.
  9. Щелкните на вкладке "Приложения".
  10. Щелкните правой кнопкой мыши на задаче Parent и выберите пункт "Перейти к процессу".
  11. Щелкните правой кнопкой мыши на процессе cmd.exe и выберите пункт "Завершить дерево процессов".
  12. В окне подтверждения Диспетчера задач щелкните на кнопке "Завершить дерево процессов".

Первое окно командной строки исчезнет, но по-прежнему можно будет наблюдать окно программы Paint, поскольку оно было потомком во втором поколении завершенного процесса командной строки. Поскольку промежуточный процесс (родительский по отношению к Paint) был завершен, связь между родительским процессом и его потомком во втором поколении была утрачена.

Для просмотра процессов и информации о них (а также для внесения изменений) используется несколько инструментальных средств. В описанных ниже экспериментах иллюстрируются различные виды информации о процессах, которые могут быть получены с помощью некоторых из этих средств. Большинство этих средств входит в состав самой Windows, а также в состав отладочного комплекта Debugging Tools for Windows и в состав Windows SDK, но есть и другие автономные средства под маркой Sysinternals. Многие из этих средств показывают частично совпадающие поднаборы сведений об основных процессах и потоках, которые иногда идентифицируются по-разному.

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

Продолжение в следующей статье.

Exit mobile version