Linux カーネルの fork()/exec() パターン、新しい実装方針へ
LWN.net は 2026年6月5日、Linux カーネルのプロセス作成システムコールの最適化を巡る議論を報じた。Li Chen が提案した「spawn templates」は改善されず、代わりに pidfd を基盤とした posix_spawn() の実装へ向かう方針が示唆された。
LWN.net のレポートによると、Li Chen はプロセス作成の fork() と exec() パターンを最適化する「spawn templates」のパッチセットを提案した。fork() はプロセスをコピーして子プロセスを作成し、exec() は現在のプロセスに新しいプログラムを実行する。Linux カーネルでは fork() は clone() として、exec() は execve() として実装されている。
fork() は親プロセスの状態をメモリ含めて全てコピーする比較的コストの高いシステムコールである。問題は、fork() の直後にほぼ常に exec() が呼ばれ、コピーされたメモリが破棄されることにある。vfork() はこのパターンを最適化する試みであったが、spawn templates はプロセスを繰り返し起動するアプリケーション向けの新しいアプローチを提案している。
spawn templates の仕様
Chen が提案したシステムコール spawn_template_create() は、実行ファイル用のテンプレートを表すファイルディスクリプタを返す。テンプレートはファイルディスクリプタ (execfd) またはパス (filename) のいずれかで指定されるが、両方の同時指定はできない。spawn_template_spawn() はテンプレートを使用して新しいプロセスを実行する。新しいファイルを実行する場合のすべての通常チェックが spawn templates でも適用される。
ベンチマーク結果は従来の fork()/exec() パターンに比べ約 2% の改善を示した。この改善が予想パターンに当てはまるアプリケーションに対し有意義である可能性がある。
カーネル開発者による別案提示
Mateusz Guzik は「このテーマは自分の心の奥底にあり、ずっと折に触れて考えている。fork + exec のイディオム全体は悲劇的であり、廃止される必要がある」と述べ、「pristine プロセスを作成することが進むべき道である」と主張した。
Christian Brauner は「exec 用のビルダー API を持つという考えはそこまで狂ったものではない」とコメントし、「正しいアプローチは pidfd_open() にオプションを追加して空のプロセスを作成することだ」と提案した。新しい pidfs_config() システムコールは空のプロセスを設定し、fsconfig() に類似するものになるという。Brauner は「posix_spawn() は fork()/exec() パターンの置換として適切であり、開発者は (現在の実装のように fork() と exec() を隠すのではなく) ネイティブ実装を歓迎するだろう」と述べた。
Chen は Brauner が広く描き出した API 案の方が優れていることに同意し、将来の取り組みはその方向に進むと述べた。spawn templates パッチは現在の形では受け入れられないと報じられているが、この議論は Linux カーネルで pidfd 抽象化を基盤とした posix_spawn() のネイティブ実装へ向かう可能性のある方向性を示唆している。
筆者の見立て
- Linux は finally gain a proper posix_spawn() implementation instead of spawn templates との予想を論じている
この記事は元記事の事実のみに基づいて自動生成されました。
出典
LWN.net「Moving beyond fork() + exec()」https://lwn.net/SubscriberLink/1076018/16f01bbbb8e0d1f0/