Windows プロセスの親子関係の特徴とは

Windows 11の深層

プロセスの階層を表示するには

Windowsで動いているプロセスの親子関係を確認するには、 Debugging Tools for Windowsで提供されている “Tlist.exe” コマンドを活用するとよいでしょう。

Debugging Tools for Windows はこちらのリンクからダウンロードします。

デフォルトでは、次のフォルダにインストールされます。

%PROGRAMFILES(X86)%\Windows Kits\10\Debuggers\

Tlistはさらに下のフォルダにあります。

%PROGRAMFILES(X86)%\Windows Kits\10\Debuggers\X64

ターミナルからTlistを実行してみます。オプションは”/t”です。

C:\Users\win>cd %PROGRAMFILES(X86)%\Windows Kits\10\Debuggers\X64

C:\Program Files (x86)\Windows Kits\10\Debuggers\x64>tlist /t
System Process (0)
System (4)
  smss.exe (480)
  Memory Compression (2108)
Registry (104)
csrss.exe (612)
wininit.exe (684)
  services.exe (756)
    svchost.exe (992)
      SearchHost.exe (6072) 検索
      StartMenuExperienceHost.exe (6080) スタート
      Widgets.exe (4400)
        msedgewebview2.exe (12992)
          msedgewebview2.exe (13008)
          msedgewebview2.exe (13252)
          msedgewebview2.exe (13268)
          msedgewebview2.exe (13296)
          msedgewebview2.exe (13400)

・・・<<<省略>>>・・・

GoogleCrashHandler.exe (7424)
GoogleCrashHandler64.exe (7440)
msedge.exe (10124)
  msedge.exe (12396)
  msedge.exe (2808)
  msedge.exe (7936)
  msedge.exe (13148)
  msedge.exe (3304)
  msedge.exe (11916)

C:\Program Files (x86)\Windows Kits\10\Debuggers\x64>

インデントはプロセスの階層を表しています。
出力結果を見ると、親プロセスのいないプロセスがいます。UNIX系のOSでは親プロセスがいないプロセスは存在しません。たとえば、(厳密にはUNIXではありませんが)LinuxのUbuntu 22.10だと、「systemd」がすべてのプロセスの親プロセスとして存在します。

この親がいないプロセスが存在する点がWindowsの特徴といえます。

親のいない子を作るには

親のいない子プロセスを作るのは簡単です。

  1. コマンドプロンプト(CMD)を起動します。
  2. CMDから、さらに新たなCMDを起動します。”start cmd”と入力します。
  3. 新たに起動された2つ目のCMDは、子プロセスになります。
  4. 子プロセスのCMDから「メモ帳」を起動します。最上位の親CMDからだと、メモ帳は孫プロセスになります。

子のCMDから以下を実行します。

cd %PROGRAMFILES(X86)%\Windows Kits\10\Debuggers\X64
tlist /t

下図で示す通り、tlistコマンドによりプロセスの階層は、cmd.exe > cmd.exe > Notepad.exe であることがわかります。親のCMDの親は “explorer.exe (1696) Program Manager” でした。

では、プロセスの階層としては真ん中にいる、子のCMDを終了したらどうなるでしょうか。
子のCMDから”exit”と入力してCMDを終了します。親のCMDとメモ帳が残ります。

再度、tlistコマンドでNotepad.exe プロセスを確認すると、最上位の親のいないプロセスになっていることがわかります。