知識マップ: Windowsアプリで子プロセスを安全に扱うチェックリスト
記事「Windowsアプリで子プロセスを安全に扱うチェックリスト」の主張を、概念と関係(エッジ)に分解した知識グラフの全体です。各関係には根拠・確認日・確度が付いています。
Windowsアプリで子プロセスを安全に扱う設計の基準点はJob Objectで、KILL_ON_JOB_CLOSEを付けることで親クラッシュ時にもプロセス木ごと自動回収でき、Process.Kill(entireProcessTree: true)だけでは代替できません。終了は協調終了(graceful shutdown)を依頼してから短いtimeoutで待ち、最後にJobごと強制終了する3段階が事故りにくく、console子への協調終了はprocess groupとconsole制御イベントで行います。stdoutとstderrを並列にdrainしないと、Windowsのpipeが有限バッファのために親子が読み待ち・書き待ちで固まるstdioデッドロックが起きます。watchdogは監視対象と同じJobに入れず外側に置き、heartbeatでハングを検知し、restart budgetでcrash loopを防ぐ設計が安定します。
flowchart LR
accTitle: Windows子プロセス安全管理の知識マップ
accDescr: Job Objectによるプロセス木の束ねと親クラッシュ時の自動回収、協調終了から強制終了までの終了手順、stdout/stderrの並列drainによるデッドロック回避、watchdogをJobの外に置きheartbeatとrestart budgetで監視する設計の関係を示す図。
job_object["Job Object"]
stdio_deadlock["標準入出力のデッドロック"]
watchdog_process["監視プロセス(watchdog)"]
kill_on_job_close["JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE"]
orphaned_process["親を失った子プロセスの残存"]
parent_crash_recovery["親クラッシュ時の自動回収"]
entire_process_tree_kill["Process.Kill(entireProcessTree: true)"]
proc_thread_attribute_job_list["PROC_THREAD_ATTRIBUTE_JOB_LIST"]
process_group["プロセスグループ(コンソール)"]
console_ctrl_event["コンソール制御イベント"]
graceful_shutdown["graceful shutdown"]
heartbeat_monitoring["heartbeatによる生存確認"]
restart_budget["再起動予算(restart budget)"]
crash_loop["crash loop"]
parallel_stdio_drain["stdout/stderrの並列drain"]
iocp["I/O完了ポート(IOCP)"]
process_tree["プロセス木(process tree)"]
breakaway_option["JOB_OBJECT_LIMIT_BREAKAWAY_OK"]
job_object -->|"で構成できる"| kill_on_job_close
kill_on_job_close -.->|"防止する"| orphaned_process
job_object -->|"推奨される対応"| parent_crash_recovery
entire_process_tree_kill -->|"用いるのは非推奨"| parent_crash_recovery
proc_thread_attribute_job_list -->|"前提とする"| job_object
process_group -->|"利用する"| console_ctrl_event
console_ctrl_event -->|"前提とする"| process_group
graceful_shutdown -->|"より先に行うべき"| entire_process_tree_kill
graceful_shutdown -.->|"利用する"| console_ctrl_event
watchdog_process -->|"用いるのは非推奨"| job_object
watchdog_process -.->|"利用する"| heartbeat_monitoring
watchdog_process -->|"自動化する"| restart_budget
restart_budget -->|"防止する"| crash_loop
parallel_stdio_drain -->|"防止する"| stdio_deadlock
job_object -.->|"利用する"| iocp
job_object -->|"実装を担う"| process_tree
breakaway_option -.->|"原因になり得る"| orphaned_process
概念間の関係(全17件)
図と同じ関係を文章でも列挙します。表示している文と機械可読な意味データ(RDFa)は同じ要素に載っています。確度が「確立した関係」のものは直接の関係として、「条件付きの関係」のものは成立条件つきの言明(rdf:Statement)として表現しています。
- Job ObjectはJOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSEで構成できます。
- JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSEは親を失った子プロセスの残存を防ぎます。
- Job Objectは親クラッシュ時の自動回収に対する本記事の推奨です。
- Process.Kill(entireProcessTree: true)を親クラッシュ時の自動回収に用いることは推奨されません。
- PROC_THREAD_ATTRIBUTE_JOB_LISTはJob Objectを前提とします。
- プロセスグループ(コンソール)はコンソール制御イベントを利用します。
- コンソール制御イベントはプロセスグループ(コンソール)を前提とします。
- graceful shutdownはProcess.Kill(entireProcessTree: true)より先に行うべきです。
- graceful shutdownはコンソール制御イベントを利用します。
- 監視プロセス(watchdog)をJob Objectに用いることは推奨されません。
- 監視プロセス(watchdog)はheartbeatによる生存確認を利用します。
- 監視プロセス(watchdog)は再起動予算(restart budget)を自動化します。
- 再起動予算(restart budget)はcrash loopを防ぎます。
- stdout/stderrの並列drainは標準入出力のデッドロックを防ぎます。
- Job ObjectはI/O完了ポート(IOCP)を利用します。
- Job Objectはプロセス木(process tree)の実装を担います。
- JOB_OBJECT_LIMIT_BREAKAWAY_OKは親を失った子プロセスの残存の原因になることがあります。
主要概念の定義
機械可読データ
このページはサイトの知識グラフ(_data/knowledge/)から自動生成されています。誤りの指摘はお問い合わせからお願いします。