知識マップ: 親が落ちたあとに何が残るか ── Job Objectで子プロセスを飼う

記事「親が落ちたあとに何が残るか ── Job Objectで子プロセスを飼う」の主張を、概念と関係(エッジ)に分解した知識グラフの全体です。各関係には根拠・確認日・確度が付いています。

Job Objectは、親子の系譜ではなくどのJobに属するかで子・孫のプロセス木を一つの単位として束ね、親の生死と子プロセス木の寿命を結びつける基準点になる。JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSEを設定すると最後のJobハンドルが閉じたときに配下の全プロセスが終了する構成になり、親を失った子プロセスの残留や、カメラ・COMポートなどの装置ハンドルの掴みっぱなしを防げるが、強制終了される側の子・孫のクラッシュダンプや最終フレームを残すこととは両立しない(親自身のクラッシュダンプはWERが親の存命中に書ける)。Jobハンドルを子に継承させると親の死後もハンドルが閉じずKILL_ON_JOB_CLOSEが発火しなくなり、子が走り始めてからAssignするまでの競合窓やbreakawayの許可も、監視から漏れた残留プロセスの原因になる。CREATE_SUSPENDEDで生成してから所属させる手順は競合窓を狭め、PROC_THREAD_ATTRIBUTE_JOB_LIST(要Job Object)は生成時点から所属させて競合窓をなくす。Jobの通知メッセージはあらかじめ関連付けたI/O完了ポートに届き、GetQueuedCompletionStatusで取り出して確認する。通知上限(JobObjectNotificationLimitInformation)の超過通知もこの完了ポート通知を利用し、この通知だけは到着が保証される。会計情報は終了したプロセスの分も含めてJobに保持される。UI制限を設定したジョブは入れ子にできない。監視プロセスが装置を安全化してから畳む構成ではTerminateJobObjectを使う。.NETのKill(entireProcessTree: true)は親クラッシュ時の自動回収には推奨されない。プロセスの所属はIsProcessInJobとProcess ExplorerのJobタブで確認できる。

Job Objectと子プロセスの寿命の知識マップJob Objectがプロセス木を一つの単位として束ね、KILL_ON_JOB_CLOSEで親クラッシュ時の残留と装置ハンドルの掴みっぱなしを防ぐ一方でクラッシュダンプの確保と両立しないこと、Jobハンドルの継承や生成と所属の競合窓・breakawayが残留の原因になり、CREATE_SUSPENDEDとPROC_THREAD_ATTRIBUTE_JOB_LISTが競合窓を閉じること、完了ポート通知がIOCPとGetQueuedCompletionStatusで受け取られ通知上限だけ到着保証があること、会計情報・入れ子とUI制限・TerminateJobObject・IsProcessInJobやProcess Explorerによる確認までを含む関係図実装を担うで構成できる推奨される対応で確認できるで確認できる防止する防止する両立しない原因になり得る原因になり得る軽減する防止する前提とする前提とするで確認できる利用するに保存される両立しない原因になり得る利用する用いるのは非推奨Job ObjectJOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSEJobの完了ポート通知装置ハンドルの残留プロセス木(process tree)親クラッシュ時の自動回収IsProcessInJobProcess Explorer親を失った子プロセスの残存クラッシュダンプJobハンドルの継承生成と所属の競合窓CREATE_SUSPENDEDPROC_THREAD_ATTRIBUTE_JOB_LISTI/O完了ポート(IOCP)GetQueuedCompletionStatusJobの通知上限Jobの会計情報入れ子ジョブJobのUI制限JOB_OBJECT_LIMIT_BREAKAWAY_OK監視プロセス(watchdog)TerminateJobObjectProcess.Kill(entireProcessTree: true)

概念間の関係(全21件)

図と同じ関係を文章でも列挙します。表示している文と機械可読な意味データ(RDFa)は同じ要素に載っています。確度が「確立した関係」のものは直接の関係として、「条件付きの関係」のものは成立条件つきの言明(rdf:Statement)として表現しています。

主要概念の定義

Job Object
誰の子かではなくどのJobに属するかでプロセス群を束ね、制限やまとめての終了を行えるWindowsの仕組み。
JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE
最後のjob handleが閉じられたときに、Jobに関連付けられた全プロセスを終了させるJob Objectの制限フラグ。
Jobの完了ポート通知
Jobに関連付けたI/O完了ポートへ、プロセスの発生・終了・異常終了・アクティブ数ゼロ化などのメッセージが送られる通知機構。通知上限による通知を除き、メッセージの到着は保証されない。
装置ハンドルの残留
残留したプロセスがカメラ・シリアル・USBなどの装置ハンドルを排他的に握ったままになり、後続の再オープンがdevice busyで失敗する状態。
Jobハンドルの継承
Jobハンドルを子プロセスに継承させること。親の死後も子側のハンドルが開いたままになるため、最後のハンドル閉鎖を条件とする仕組みが働かなくなる原因になる。
生成と所属の競合窓
子プロセスが走り始めてからJobへ入れるまでの間に、子が生んだ孫がJobの外に出てしまう競合のこと。
CREATE_SUSPENDED
初期スレッドをサスペンド状態で生成し、ResumeThreadを呼ぶまで実行させないCreateProcessのフラグ。
PROC_THREAD_ATTRIBUTE_JOB_LIST
STARTUPINFOEXと組み合わせ、プロセスの起動時点からJobへ所属させるための属性。Windows 10/Windows Server 2016以降で使える。
Jobの通知上限
超過してもプロセスを止めず、完了ポートへの通知だけを行うJobの上限設定。この通知だけは到着が保証される。
Jobの会計情報
終了したプロセスの分も含めてJobが集計する、総プロセス数・CPU時間・ページフォールト数などの情報。QueryInformationJobObjectで取得する。
入れ子ジョブ
1つのプロセスを複数のJobに所属させて親子の階層を作る、Windows 8以降のJob Objectの機能。子ジョブは親ジョブのプロセスの部分集合になり、主要な資源制限はチェーン上で最も厳しい値が実効になる。
JOB_OBJECT_LIMIT_BREAKAWAY_OK
子プロセスがJobから離脱(breakaway)することを許可するJob Objectの制限フラグ。意図なく付けると、cleanupできるつもりだった木から一部が抜ける原因になる。
監視プロセス(watchdog)
本体プロセスの起動・終了・生存を外から見張り、exit codeや再起動回数を記録する別プロセス。
Process.Kill(entireProcessTree: true)
.NET Core 3.0以降で使える、指定プロセスとその子孫プロセスをまとめて強制終了する.NETのAPI。

機械可読データ

このデータセットについて

作成
合同会社小村ソフト
ライセンス
CC BY 4.0 ── 出典(合同会社小村ソフト)とライセンスへのリンクを明示し、改変した場合はその旨を示すことを条件に、再配布・改変を含めて再利用できます
最終確認日
2026-08-30 ── 収録する関係のうち、最後に出典と照合した日

このページはサイトの知識グラフ(_data/knowledge/)から自動生成されています。誤りの指摘はお問い合わせからお願いします。