知識マップ: 親が落ちたあとに何が残るか ── 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タブで確認できる。
flowchart LR
accTitle: Job Objectと子プロセスの寿命の知識マップ
accDescr: Job Objectがプロセス木を一つの単位として束ね、KILL_ON_JOB_CLOSEで親クラッシュ時の残留と装置ハンドルの掴みっぱなしを防ぐ一方でクラッシュダンプの確保と両立しないこと、Jobハンドルの継承や生成と所属の競合窓・breakawayが残留の原因になり、CREATE_SUSPENDEDとPROC_THREAD_ATTRIBUTE_JOB_LISTが競合窓を閉じること、完了ポート通知がIOCPとGetQueuedCompletionStatusで受け取られ通知上限だけ到着保証があること、会計情報・入れ子とUI制限・TerminateJobObject・IsProcessInJobやProcess Explorerによる確認までを含む関係図
job_object["Job Object"]
kill_on_job_close["JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE"]
job_completion_port_notification["Jobの完了ポート通知"]
device_handle_retention["装置ハンドルの残留"]
process_tree["プロセス木(process tree)"]
parent_crash_recovery["親クラッシュ時の自動回収"]
is_process_in_job["IsProcessInJob"]
process_explorer["Process Explorer"]
orphaned_process["親を失った子プロセスの残存"]
crash_dump["クラッシュダンプ"]
job_handle_inheritance["Jobハンドルの継承"]
job_assignment_race["生成と所属の競合窓"]
create_suspended["CREATE_SUSPENDED"]
proc_thread_attribute_job_list["PROC_THREAD_ATTRIBUTE_JOB_LIST"]
iocp["I/O完了ポート(IOCP)"]
getqueuedcompletionstatus["GetQueuedCompletionStatus"]
job_notification_limit["Jobの通知上限"]
job_accounting["Jobの会計情報"]
nested_job["入れ子ジョブ"]
job_ui_restrictions["JobのUI制限"]
breakaway_option["JOB_OBJECT_LIMIT_BREAKAWAY_OK"]
watchdog_process["監視プロセス(watchdog)"]
terminate_job_object["TerminateJobObject"]
entire_process_tree_kill["Process.Kill(entireProcessTree: true)"]
job_object -.->|"実装を担う"| process_tree
job_object -->|"で構成できる"| kill_on_job_close
job_object -->|"推奨される対応"| parent_crash_recovery
job_object -->|"で確認できる"| is_process_in_job
job_object -->|"で確認できる"| process_explorer
kill_on_job_close -.->|"防止する"| orphaned_process
kill_on_job_close -.->|"防止する"| device_handle_retention
kill_on_job_close -.->|"両立しない"| crash_dump
job_handle_inheritance -.->|"原因になり得る"| orphaned_process
job_assignment_race -.->|"原因になり得る"| orphaned_process
create_suspended -->|"軽減する"| job_assignment_race
proc_thread_attribute_job_list -->|"防止する"| job_assignment_race
proc_thread_attribute_job_list -->|"前提とする"| job_object
job_completion_port_notification -->|"前提とする"| iocp
job_completion_port_notification -->|"で確認できる"| getqueuedcompletionstatus
job_notification_limit -->|"利用する"| job_completion_port_notification
job_accounting -->|"に保存される"| job_object
nested_job -->|"両立しない"| job_ui_restrictions
breakaway_option -.->|"原因になり得る"| orphaned_process
watchdog_process -.->|"利用する"| terminate_job_object
entire_process_tree_kill -->|"用いるのは非推奨"| parent_crash_recovery
概念間の関係(全21件)
図と同じ関係を文章でも列挙します。表示している文と機械可読な意味データ(RDFa)は同じ要素に載っています。確度が「確立した関係」のものは直接の関係として、「条件付きの関係」のものは成立条件つきの言明(rdf:Statement)として表現しています。
- Job Objectはプロセス木(process tree)の実装を担います。
- Job ObjectはJOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSEで構成できます。
- Job Objectは親クラッシュ時の自動回収に対する本記事の推奨です。
- Job ObjectはIsProcessInJobで確認できます。
- Job ObjectはProcess Explorerで確認できます。
- JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSEは親を失った子プロセスの残存を防ぎます。
- JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSEは装置ハンドルの残留を防ぎます。
- JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSEはクラッシュダンプと両立しません。
- Jobハンドルの継承は親を失った子プロセスの残存の原因になることがあります。
- 生成と所属の競合窓は親を失った子プロセスの残存の原因になることがあります。
- CREATE_SUSPENDEDは生成と所属の競合窓を軽減します。
- PROC_THREAD_ATTRIBUTE_JOB_LISTは生成と所属の競合窓を防ぎます。
- PROC_THREAD_ATTRIBUTE_JOB_LISTはJob Objectを前提とします。
- Jobの完了ポート通知はI/O完了ポート(IOCP)を前提とします。
- Jobの完了ポート通知はGetQueuedCompletionStatusで確認できます。
- Jobの通知上限はJobの完了ポート通知を利用します。
- Jobの会計情報はJob Objectに保存されます。
- 入れ子ジョブはJobのUI制限と両立しません。
- JOB_OBJECT_LIMIT_BREAKAWAY_OKは親を失った子プロセスの残存の原因になることがあります。
- 監視プロセス(watchdog)はTerminateJobObjectを利用します。
- Process.Kill(entireProcessTree: true)を親クラッシュ時の自動回収に用いることは推奨されません。
主要概念の定義
機械可読データ
このデータセットについて
このページはサイトの知識グラフ(_data/knowledge/)から自動生成されています。誤りの指摘はお問い合わせからお願いします。