Google Chrome ブラウザ(chrome.exe) の Windows 上でのプロセス/スレッド構成

投稿: 2021年09月24日
タグ: 
  Web  Windows  技術メモ

Windows 上でエクスプローラーを見ると大量に動いている chrome.exe について調べた際のメモです。
オプション設定によっては Chrome ブラウザを単一プロセスで動かす等もできるようですが、既定インストールの状態というのを前提にした内容です。

  • Chrome ブラウザはマルチプロセスアーキテクチャーを採っており、1つの親プロセスと多数の子プロセスで構成される
  • 各タブにプロセスが割り当てられるが、ページ内の他ドメイン処理(iframe) は別プロセスとして並列実行される(その分 メモリを食うので気にした方がよい)
  • 各タブに紐づく子プロセス内の特定スレッド(スレッド番号0) で HTMLレンダリングエンジン(Blink)、JavaScript エンジン(V8) が動く
  • chrome.exe は 1つの親プロセスと多数の子プロセスを含む

    Process Explorer で Google Chrome ブラウザの chrome.exe プロセスを見てみると合計 15個のプロセスが起動していました。 ブラウザのタブはブランクで 1つだけ開いている状態ですが、結構な数のプロセスが立ち上がってます。
    15個のうちの1つが残りの 14個を起動しており、chrome.exe の親プロセスは explorer.exe になっています。

    画像_2021-09-24_2.jpg

    Chrome (Chromium) はマルチプロセスアーキテクチャーである

    Chrome ブラウザのコードベースである Chromium はマルチプロセスアーキテクチャーを採っており、次のドキュメントで概要が紹介されています。

    Chromium Project - Multi-process Architecture
    https://www.chromium.org/developers/design-documents/multi-process-architectureopen_in_new

    Process Explorer で見た通り、1つの親プロセスから複数のプロセスが起動され、プロセスが IPC(プロセス間通信) して動く仕組みになっています。
    また、子プロセスは WebKit(Blink) が乗っており、子プロセスは HTML のレンダリングを担っているように見えます。
    ただ、実際に Chrome ブラウザのタブを 1つも開いていない状態でも多数のプロセスが起動していますし、 1つのタブを開いただけで複数のプロセスが起動することもあります。
    各プロセスが何をやっているのか見ていきます。

    Google Chrome タスクマネージャーで Chrome プロセスを確認する

    Chrome ブラウザはタスクマネージャーの機能で各プロセスの概要やプロセスIDを確認できるので、何が動いているかはタスクマネージャーで確認できます。 Windows の場合、Shift + Esc を押すとタスクマネージャーが表示されます。

    画像_2021-09-24_3.jpg

    Chromeタスクマネージャーで『ブラウザ』と表示されているのは親プロセスで『タブ:』から始まるプロセスが各タブに対応するプロセスになってます。 その他、拡張機能のプロセスとユーティリティ系プロセスが動いているのがわかります。

    また、新規 Chrome のタブではなく「ウィンドウ」を開いてみたところ、既存の親プロセス配下でレンダリング用の子プロセスが起動される動きになっていました。 開くタブが既存のウィンドウか新しいウィンドウか、は Chrome のプロセス実行という観点からは大差ないようです。
    ここからは個々のプロセスを見ていきます。

    Chrome 親プロセスは多数の管理用スレッドを実行している

    まずは Google Chrome の中で 1つのみ存在する親プロセスです。 プロセスの中で何をやっているかを把握するために、Debugging tools for Windows(WinDbg) で Chrome の親プロセスにアタッチしてみます。

    以下は Chrome 親プロセスのスレッド一覧の表示結果です。30近いスレッドが実行されており、スレッド番号 0 のメインスレッド以外に複数の役割を持ったスレッドが実行されています。

    WinDbg
    0:028> ~ 0 Id: 1d78.3798 Suspend: Unfrozen "CrBrowserMain" 1 Id: 1d78.25d0 Suspend: Unfrozen "LoaderLockSampler" 2 Id: 1d78.9f8 Suspend: Unfrozen "BrokerEvent" 3 Id: 1d78.3f24 Suspend: Unfrozen "HangWatcher" 4 Id: 1d78.2298 Suspend: Unfrozen "ThreadPoolServiceThread" 5 Id: 1d78.2b88 Suspend: Unfrozen "ThreadPoolSingleThreadCOMSTASharedForegroundBlocking0" 6 Id: 1d78.2c94 Suspend: Unfrozen 7 Id: 1d78.30c0 Suspend: Unfrozen "Chrome_IOThread" 8 Id: 1d78.2c74 Suspend: Unfrozen "MemoryInfra" 9 Id: 1d78.3ae0 Suspend: Unfrozen "ThreadPoolSingleThreadCOMSTASharedForeground1" 10 Id: 1d78.2718 Suspend: Unfrozen "ThreadPoolSingleThreadForegroundBlocking2" 11 Id: 1d78.2cc4 Suspend: Unfrozen "CompositorTileWorker1" 12 Id: 1d78.3f3c Suspend: Unfrozen "VideoCaptureThread" 13 Id: 1d78.518 Suspend: Unfrozen "BrowserWatchdog" 14 Id: 1d78.269c Suspend: Unfrozen "ThreadPoolSingleThreadSharedBackgroundBlocking3" 15 Id: 1d78.bf4 Suspend: Unfrozen "ThreadPoolSingleThreadSharedForegroundBlocking4" 16 Id: 1d78.2760 Suspend: Unfrozen "ThreadPoolSingleThreadCOMSTASharedForegroundBlocking5" 17 Id: 1d78.2eb4 Suspend: Unfrozen "CacheThread_BlockFile" 18 Id: 1d78.1b80 Suspend: Unfrozen "ThreadPoolSingleThreadCOMSTASharedBackgroundBlocking6" 19 Id: 1d78.ab0 Suspend: Unfrozen 20 Id: 1d78.1c0c Suspend: Unfrozen 21 Id: 1d78.2960 Suspend: Unfrozen "ThreadPoolForegroundWorker" 22 Id: 1d78.1d48 Suspend: Unfrozen "ThreadPoolForegroundWorker" 23 Id: 1d78.3fd8 Suspend: Unfrozen 24 Id: 1d78.15b4 Suspend: Unfrozen 25 Id: 1d78.2e88 Suspend: Unfrozen "ThreadPoolForegroundWorker" 26 Id: 1d78.371c Suspend: Unfrozen "ThreadPoolBackgroundWorker" 27 Id: 1d78.a20 Suspend: Unfrozen "DManip Delegate Thread" . 28 Id: 1d78.2494 Suspend: Unfrozen

    各スレッドの役割ごとのドキュメントまでは用意されていないようですが、それぞれの名前で検索するとソースコードが見つかります。
    例えば、「HangWatcher」というスレッドは以下のコードで実装されているようです。その名の通り、各処理がハングしてないか監視する役割のようです。

    GitHub - chromium/base/threading/hang_watcher.cc
    https://github.com/chromium/chromium/blob/master/base/threading/hang_watcher.ccopen_in_new

    新しいタブボタン(+) を押したタイミングで新しいレンダリング用プロセスが起動されるが、それ以外にもプロセスは生成される

    親プロセスのどこかで子プロセスを起動しているはずなので、親プロセスでプロセス起動時(CreateProcess) にブレイクポイントを貼って確認します。
    ブラウザ上で「新しいタブ」の + ボタンを押した瞬間に引っ掛かりました。以下がその際のスタックです。
    スタックの見方としては、「下から上に関数が順に実行されている」です。

    WinDbg
    0:010> k # Child-SP RetAddr Call Site 00 0000003a`90dfe8c8 00007ffa`e3bc63c3 KERNELBASE!CreateProcessInternalW 01 0000003a`90dfe8d0 00007ffa`e4e57c50 KERNELBASE!CreateProcessAsUserW+0x63 02 0000003a`90dfe940 00007ff6`334df075 ADVAPI32!CreateProcessAsUserW+0x60 03 0000003a`90dfe9b0 00007ff6`3354e1f5 chrome_exe!sandbox::TargetProcess::Create+0xe5 [C:\b\s\w\ir\cache\builder\src\sandbox\win\src\target_process.cc @ 169] 04 0000003a`90dfeb50 00007ffa`8620f454 chrome_exe!sandbox::BrokerServicesBase::SpawnTarget+0x4a5 [C:\b\s\w\ir\cache\builder\src\sandbox\win\src\broker_services.cc @ 546] 05 0000003a`90dfeca0 00007ffa`84514551 chrome!sandbox::policy::SandboxWin::StartSandboxedProcess+0x11c4 [C:\b\s\w\ir\cache\builder\src\sandbox\policy\win\sandbox_win.cc @ 1135] 06 0000003a`90dff070 00007ffa`845139e4 chrome!content::StartSandboxedProcess+0x231 [C:\b\s\w\ir\cache\builder\src\content\common\sandbox_init_win.cc @ 50] 07 0000003a`90dff1e0 00007ffa`84513439 chrome!content::internal::ChildProcessLauncherHelper::LaunchProcessOnLauncherThread+0xb4 [C:\b\s\w\ir\cache\builder\src\content\browser\child_process_launcher_helper_win.cc @ 75] 08 0000003a`90dff2f0 00007ffa`86af27cd chrome!content::internal::ChildProcessLauncherHelper::LaunchOnLauncherThread+0xf9 [C:\b\s\w\ir\cache\builder\src\content\browser\child_process_launcher_helper.cc @ 130] 09 (Inline Function) --------`-------- chrome!base::OnceCallback<void ()>::Run+0x10 [C:\b\s\w\ir\cache\builder\src\base\callback.h @ 98] 0a 0000003a`90dff480 00007ffa`83b4d607 chrome!base::TaskAnnotator::RunTask+0x1dd [C:\b\s\w\ir\cache\builder\src\base\task\common\task_annotator.cc @ 178] 0b 0000003a`90dff5d0 00007ffa`86fc8365 chrome!base::internal::TaskTracker::RunBlockShutdown+0x17 [C:\b\s\w\ir\cache\builder\src\base\task\thread_pool\task_tracker.cc @ 669] 0c (Inline Function) --------`-------- chrome!base::internal::TaskTracker::RunTaskWithShutdownBehavior+0x70e [C:\b\s\w\ir\cache\builder\src\base\task\thread_pool\task_tracker.cc @ 682] 0d 0000003a`90dff600 00007ffa`86fc72c1 chrome!base::internal::TaskTracker::RunTask+0xb15 [C:\b\s\w\ir\cache\builder\src\base\task\thread_pool\task_tracker.cc @ 525] 0e 0000003a`90dff9a0 00007ffa`86fc6ba8 chrome!base::internal::TaskTracker::RunAndPopNextTask+0x1e1 [C:\b\s\w\ir\cache\builder\src\base\task\thread_pool\task_tracker.cc @ 434] 0f 0000003a`90dffb70 00007ffa`83b4dbd8 chrome!base::internal::WorkerThread::RunWorker+0x438 [C:\b\s\w\ir\cache\builder\src\base\task\thread_pool\worker_thread.cc @ 371] 10 0000003a`90dffcf0 00007ffa`84108edc chrome!base::internal::WorkerThread::RunDedicatedWorker+0x18 [C:\b\s\w\ir\cache\builder\src\base\task\thread_pool\worker_thread.cc @ 282] 11 0000003a`90dffd30 00007ffa`e4f07034 chrome!base::`anonymous namespace'::ThreadFunc+0xec [C:\b\s\w\ir\cache\builder\src\base\threading\platform_thread_win.cc @ 113] 12 0000003a`90dffdb0 00007ffa`e6122651 KERNEL32!BaseThreadInitThunk+0x14 13 0000003a`90dffde0 00000000`00000000 ntdll!RtlUserThreadStart+0x21

    ChildProcessLauncherHelper::LaunchOnLauncherThread という関数で子プロセス起動処理を行っているようなので、次は この関数実行時の変数を確認してみます。
    見てみると親プロセスの中から chrome.exe に多数のパラメーターをつけて実行しているようです。 パラメーターの中に --type=renderer というのがあり、これでどういう役割の子プロセスか指定しているようです。 render は HTMLレンダリング用のプロセスということなので、ドキュメントに書いてある通りの動きになっています。

    WinDbg
    0:010> dv 0:010> dx -r1 ((chrome!content::internal::ChildProcessLauncherHelper *)0x31f6075724c0) 0:010> dx -r1 (*((chrome!std::__1::unique_ptr<base::CommandLine,std::__1::default_delete<base::CommandLine> > *)0x31f6075724d8)) 0:010> dx -r1 (*((chrome!std::__1::vector<std::__1::wstring,std::__1::allocator<std::__1::wstring> > *)0x31f607d246c0)) (*((chrome!std::__1::vector<std::__1::wstring,std::__1::allocator<std::__1::wstring> > *)0x31f607d246c0)) : { size=12 } [Type: std::__1::vector<std::__1::wstring,std::__1::allocator<std::__1::wstring> >] [<Raw View>] [Type: std::__1::vector<std::__1::wstring,std::__1::allocator<std::__1::wstring> >] [0] : "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" [1] : "--type=renderer" [2] : "--extension-process" [3] : "--field-trial-handle=1712,4293541542748197566,12990903297734657359,131072" [4] : "--enable-features=ParallelDownloading" [5] : "--lang=ja" [6] : "--device-scale-factor=1.5" [7] : "--num-raster-threads=4" [8] : "--enable-main-frame-before-activation" [9] : "--renderer-client-id=297" [10] : "--no-v8-untrusted-code-mitigations" [11] : "/prefetch:1"

    タブを 1つ開くだけで複数のプロセスが起動することがあります。例えば、yahoo.co.jp のページを開くと以下のようにサブフレームという名前で複数のプロセスが起動します。

    画像_2021-09-24_4.jpg

    各ドメインへのアクセスにプロセスを個別に起動して並列処理しているようです。
    このサイトでも、はてなブックマークや Twitter ボタンを設置していますが、それらはサブフレームで実行されています。
    iframe を多数入れ込んでいるサイトはその分だけ chrome.exe のプロセスが起動され、読み手のリソース(メモリ等) を奪っていくということになりそうです。
    1プロセス起動すると数十MB 程度のメモリを簡単に獲得するので、気を付けたいところです。

    Chrome 子プロセスのスレッド番号 0 で HTMLレンダリングエンジン(Blink) + JavaScriptエンジン(V8) が動いている

    次に、ブラウザのタブを実行している子プロセスの 1つにデバッガをアタッチしてみます。以下がスタックです。
    スレッド番号 0 に CrRendererMain というスレッドがおり、このスレッドで HTMLレンダリングを行っているようです。

    WinDbg
    0:026> ~ 0 Id: 2398.2a70 Suspend: 1 Teb: 000000d1`06f49000 Unfrozen "CrRendererMain" 1 Id: 2398.293c Suspend: 1 Teb: 000000d1`06f4b000 Unfrozen "LoaderLockSampler" 2 Id: 2398.4664 Suspend: 1 Teb: 000000d1`06f4d000 Unfrozen "ThreadPoolServiceThread" 3 Id: 2398.4580 Suspend: 1 Teb: 000000d1`06f4f000 Unfrozen "ThreadPoolForegroundWorker" 4 Id: 2398.2928 Suspend: 1 Teb: 000000d1`06f51000 Unfrozen "ThreadPoolBackgroundWorker" 5 Id: 2398.3b0c Suspend: 1 Teb: 000000d1`06f53000 Unfrozen "Chrome_ChildIOThread" 6 Id: 2398.3804 Suspend: 1 Teb: 000000d1`06f55000 Unfrozen "ThreadPoolForegroundWorker" 7 Id: 2398.2f2c Suspend: 1 Teb: 000000d1`06f57000 Unfrozen 8 Id: 2398.3b40 Suspend: 1 Teb: 000000d1`06f59000 Unfrozen "GpuMemoryThread" 9 Id: 2398.ff4 Suspend: 1 Teb: 000000d1`06f5b000 Unfrozen "Compositor" 10 Id: 2398.4070 Suspend: 1 Teb: 000000d1`06f5d000 Unfrozen "ThreadPoolSingleThreadSharedForegroundBlocking0" 11 Id: 2398.4f4 Suspend: 1 Teb: 000000d1`06f61000 Unfrozen "CompositorTileWorker1" 12 Id: 2398.3904 Suspend: 1 Teb: 000000d1`06f63000 Unfrozen "CompositorTileWorker2" 13 Id: 2398.2944 Suspend: 1 Teb: 000000d1`06f65000 Unfrozen "CompositorTileWorker3" 14 Id: 2398.267c Suspend: 1 Teb: 000000d1`06f67000 Unfrozen "CompositorTileWorker4" 15 Id: 2398.e74 Suspend: 1 Teb: 000000d1`06f69000 Unfrozen "CompositorTileWorkerBackground" 16 Id: 2398.3014 Suspend: 1 Teb: 000000d1`06f6b000 Unfrozen "ThreadPoolForegroundWorker" 17 Id: 2398.3edc Suspend: 1 Teb: 000000d1`06f6d000 Unfrozen "ThreadPoolForegroundWorker" 18 Id: 2398.25e0 Suspend: 1 Teb: 000000d1`06f6f000 Unfrozen "ThreadPoolForegroundWorker" 19 Id: 2398.3aa8 Suspend: 1 Teb: 000000d1`06f71000 Unfrozen "ThreadPoolForegroundWorker" 20 Id: 2398.4560 Suspend: 1 Teb: 000000d1`06f73000 Unfrozen "ThreadPoolForegroundWorker" 21 Id: 2398.a88 Suspend: 1 Teb: 000000d1`06f75000 Unfrozen "ThreadPoolForegroundWorker" 22 Id: 2398.7e0 Suspend: 1 Teb: 000000d1`06f77000 Unfrozen "ThreadPoolForegroundWorker" 23 Id: 2398.42d8 Suspend: 1 Teb: 000000d1`06f79000 Unfrozen "ThreadPoolForegroundWorker" 24 Id: 2398.1ddc Suspend: 1 Teb: 000000d1`06f7b000 Unfrozen "ThreadPoolForegroundWorker" 25 Id: 2398.2008 Suspend: 1 Teb: 000000d1`06f7f000 Unfrozen "MemoryInfra" . 26 Id: 2398.37d8 Suspend: 1 Teb: 000000d1`06f81000 Unfrozen

    Google Chrome は HTMLレンダリングエンジンとして Blink を使い、その中で JavaScript エンジンとして V8 というのを使っているとのことなので、V8 の処理内で止めればどのように子プロセスが実行されているのか確認できそうです。 V8 配下にある確実に呼ばれそうな適当な関数(chrome!v8::base::hash_value) にブレイクポイントを貼ってみました。ブラウザを操作すると即引っ掛かりました。

    ちょっと深いスタックになってますが、以下が V8 の JavaScript 実行中で止めたスタックです。

    WinDbg
    0:000> k # Child-SP RetAddr Call Site 00 (Inline Function) --------`-------- chrome!v8::base::`anonymous namespace'::hash_value_unsigned [C:\b\s\w\ir\cache\builder\src\v8\src\base\functional.cc @ 29] 01 0000003a`275fd558 00007ffa`7c50b837 chrome!v8::base::hash_value 02 (Inline Function) --------`-------- chrome!v8::base::hash_value+0x5 [C:\b\s\w\ir\cache\builder\src\v8\src\base\functional.h @ 105] 03 (Inline Function) --------`-------- chrome!v8::base::hash<int>::operator()+0x5 [C:\b\s\w\ir\cache\builder\src\v8\src\base\functional.h @ 157] 04 (Inline Function) --------`-------- chrome!v8::base::hash_combine+0xb [C:\b\s\w\ir\cache\builder\src\v8\src\base\functional.h @ 74] 05 (Inline Function) --------`-------- chrome!v8::base::hash_combine+0x19 [C:\b\s\w\ir\cache\builder\src\v8\src\base\functional.h @ 74] 06 (Inline Function) --------`-------- chrome!v8::internal::Version::Hash+0x19 [C:\b\s\w\ir\cache\builder\src\v8\src\utils\version.h @ 31] 07 (Inline Function) --------`-------- chrome!v8::internal::SerializedCodeData::SanityCheck+0x8d [C:\b\s\w\ir\cache\builder\src\v8\src\snapshot\code-serializer.cc @ 452] 08 (Inline Function) --------`-------- chrome!v8::internal::SerializedCodeData::FromCachedData+0x91 [C:\b\s\w\ir\cache\builder\src\v8\src\snapshot\code-serializer.cc @ 498] 09 0000003a`275fd560 00007ffa`7c50851e chrome!v8::internal::CodeSerializer::Deserialize+0xf7 [C:\b\s\w\ir\cache\builder\src\v8\src\snapshot\code-serializer.cc @ 305] 0a 0000003a`275fd680 00007ffa`7c507ad8 chrome!v8::internal::Compiler::GetSharedFunctionInfoForScript+0x3ce [C:\b\s\w\ir\cache\builder\src\v8\src\codegen\compiler.cc @ 2850] 0b 0000003a`275fd880 00007ffa`7c505938 chrome!v8::ScriptCompiler::CompileUnboundInternal+0x278 [C:\b\s\w\ir\cache\builder\src\v8\src\api\api.cc @ 2397] 0c 0000003a`275fda70 00007ffa`7c5056ec chrome!v8::ScriptCompiler::Compile+0x68 [C:\b\s\w\ir\cache\builder\src\v8\src\api\api.cc @ 2445] 0d 0000003a`275fdae0 00007ffa`7c504a30 chrome!blink::`anonymous namespace'::CompileScriptInternal+0x26c [C:\b\s\w\ir\cache\builder\src\third_party\blink\renderer\bindings\core\v8\v8_script_runner.cc @ 170] 0e 0000003a`275fdbc0 00007ffa`7c502d73 chrome!blink::V8ScriptRunner::CompileScript+0x230 [C:\b\s\w\ir\cache\builder\src\third_party\blink\renderer\bindings\core\v8\v8_script_runner.cc @ 258] 0f 0000003a`275fdd90 00007ffa`7c502a30 chrome!blink::V8ScriptRunner::CompileAndRunScript+0x303 [C:\b\s\w\ir\cache\builder\src\third_party\blink\renderer\bindings\core\v8\v8_script_runner.cc @ 490] 10 (Inline Function) --------`-------- chrome!blink::ClassicScript::RunScriptOnScriptStateAndReturnValue+0x24 [C:\b\s\w\ir\cache\builder\src\third_party\blink\renderer\core\script\classic_script.cc @ 32] 11 (Inline Function) --------`-------- chrome!blink::ClassicScript::RunScriptAndReturnValue+0x3b [C:\b\s\w\ir\cache\builder\src\third_party\blink\renderer\core\script\classic_script.cc @ 50] 12 (Inline Function) --------`-------- chrome!blink::ClassicScript::RunScript+0x5a [C:\b\s\w\ir\cache\builder\src\third_party\blink\renderer\core\script\classic_script.cc @ 44] 13 0000003a`275fe120 00007ffa`7ccc6cb4 chrome!blink::ClassicScript::RunScript+0x90 [C:\b\s\w\ir\cache\builder\src\third_party\blink\renderer\core\script\classic_script.cc @ 37] 14 (Inline Function) --------`-------- chrome!blink::PendingScript::ExecuteScriptBlockInternal+0x123 [C:\b\s\w\ir\cache\builder\src\third_party\blink\renderer\core\script\pending_script.cc @ 264] 15 0000003a`275fe1d0 00007ffa`7cd3fb29 chrome!blink::PendingScript::ExecuteScriptBlock+0x234 [C:\b\s\w\ir\cache\builder\src\third_party\blink\renderer\core\script\pending_script.cc @ 170] 16 (Inline Function) --------`-------- chrome!blink::ScriptRunner::ExecuteAsyncTask+0x7d [C:\b\s\w\ir\cache\builder\src\third_party\blink\renderer\core\script\script_runner.cc @ 287] 17 0000003a`275fe2b0 00007ffa`7f6f27cd chrome!blink::ScriptRunner::ExecuteTask+0xb9 [C:\b\s\w\ir\cache\builder\src\third_party\blink\renderer\core\script\script_runner.cc @ 301] 18 (Inline Function) --------`-------- chrome!base::OnceCallback<void ()>::Run+0x10 [C:\b\s\w\ir\cache\builder\src\base\callback.h @ 98] 19 0000003a`275fe360 00007ffa`7f6f0f6c chrome!base::TaskAnnotator::RunTask+0x1dd [C:\b\s\w\ir\cache\builder\src\base\task\common\task_annotator.cc @ 178] 1a (Inline Function) --------`-------- chrome!base::sequence_manager::internal::ThreadControllerWithMessagePumpImpl::DoWorkImpl+0x4b0 [C:\b\s\w\ir\cache\builder\src\base\task\sequence_manager\thread_controller_with_message_pump_impl.cc @ 360] 1b 0000003a`275fe4b0 00007ffa`7e158db9 chrome!base::sequence_manager::internal::ThreadControllerWithMessagePumpImpl::DoWork+0x53c [C:\b\s\w\ir\cache\builder\src\base\task\sequence_manager\thread_controller_with_message_pump_impl.cc @ 260] 1c 0000003a`275fe810 00007ffa`7cd61773 chrome!base::MessagePumpDefault::Run+0xc9 [C:\b\s\w\ir\cache\builder\src\base\message_loop\message_pump_default.cc @ 41] 1d 0000003a`275fe8c0 00007ffa`7cf79926 chrome!base::sequence_manager::internal::ThreadControllerWithMessagePumpImpl::Run+0x83 [C:\b\s\w\ir\cache\builder\src\base\task\sequence_manager\thread_controller_with_message_pump_impl.cc @ 470] 1e 0000003a`275fe930 00007ffa`7cddc82f chrome!base::RunLoop::Run+0x1a6 [C:\b\s\w\ir\cache\builder\src\base\run_loop.cc @ 136] 1f 0000003a`275fea40 00007ffa`7ed6bba9 chrome!content::RendererMain+0x31f [C:\b\s\w\ir\cache\builder\src\content\renderer\renderer_main.cc @ 262] 20 (Inline Function) --------`-------- chrome!content::RunOtherNamedProcessTypeMain+0x5f8 [C:\b\s\w\ir\cache\builder\src\content\app\content_main_runner_impl.cc @ 621] 21 0000003a`275fec00 00007ffa`7cd3c0d7 chrome!content::ContentMainRunnerImpl::Run+0x7c9 [C:\b\s\w\ir\cache\builder\src\content\app\content_main_runner_impl.cc @ 955] 22 (Inline Function) --------`-------- chrome!content::RunContentProcess+0x330 [C:\b\s\w\ir\cache\builder\src\content\app\content_main.cc @ 386] 23 0000003a`275fed50 00007ffa`7cd39dff chrome!content::ContentMain+0x377 [C:\b\s\w\ir\cache\builder\src\content\app\content_main.cc @ 412] 24 0000003a`275fef60 00007ff7`7f9592e0 chrome!ChromeMain+0x18f [C:\b\s\w\ir\cache\builder\src\chrome\app\chrome_main.cc @ 154] 25 0000003a`275ff070 00007ff7`7f958e97 chrome_exe!MainDllLoader::Launch+0x300 [C:\b\s\w\ir\cache\builder\src\chrome\app\main_dll_loader_win.cc @ 169] 26 0000003a`275ff2f0 00007ff7`7f9bf8e2 chrome_exe!wWinMain+0xcb7 [C:\b\s\w\ir\cache\builder\src\chrome\app\chrome_exe_main_win.cc @ 382] 27 (Inline Function) --------`-------- chrome_exe!invoke_main+0x21 [d:\A01\_work\6\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl @ 118] 28 0000003a`275ff720 00007ffa`e4f07034 chrome_exe!__scrt_common_main_seh+0x106 [d:\A01\_work\6\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl @ 288] 29 0000003a`275ff760 00007ffa`e6122651 KERNEL32!BaseThreadInitThunk+0x14 2a 0000003a`275ff790 00000000`00000000 ntdll!RtlUserThreadStart+0x21

    Chrome の子プロセスのスレッド番号 0 内で Blink が実行され、Blink から V8 の「ScriptCompiler::Compile」という関数が呼ばれています。
    Blink 内の「V8ScriptRunner::CompileAndRunScript」という関数で JavaScript エンジンが実行されているようです。

    v8_script_runner.cc
    https://github.com/chromium/chromium/blob/master/third_party/blink/renderer/bindings/core/v8/v8_script_runner.cc#L431open_in_new

    『JavaScript エンジン』という名前から v8::RunScript みたいに v8自身でスクリプトを実行する関数が呼ばれてると思っていたのですが、このスタックを見る限り v8 はコンパイルだけして Blink に実行を委ねているように見えます。

    拡張機能では定期的に起動してくるプロセスもいる

    ブラウザ操作をしていないのに chrome.exe プロセスが新規に起動され、気づいたらデバッガが止まっていたということが何度かありました。見てみると、Google ドキュメントのプロセスがポコポコ起動しては終了し、というのを繰り返していました。 定期処理や常駐処理が必要なものもあると思いますので、拡張機能によってはバックエンドで起動されるプロセスもいるようです。