このレッスンでは、Linux システム上で新しいプロセスがどのように開始されるかという基本的な概念を探ります。このメカニズムを理解することは、オペレーティングシステムの内部動作についての洞察を与えてくれます。
fork と exec のモデル
Linux でのプロセス作成の主要なメカニズムは、既存のプロセスがforkシステムコールを使用して自身を複製することを含みます。fork呼び出しは、ほぼ同一の子プロセスを作成します。この新しい子プロセスは独自のプロセス ID(PID)を受け取り、元のプロセスはPPID(親プロセス ID)として識別される親になります。
fork の後、子プロセスは親と同じプログラムの実行を継続するか、より一般的にはexecveシステムコールを使用して新しいプログラムをロードし実行します。execve呼び出しは、プロセスのメモリ空間を新しいプログラムのものに効果的に置き換え、異なるタスクの開始を可能にします。この 2 段階の「fork-exec」モデルは、Linux でプロセスを作成する方法の基礎です。
親子関係の観察
psコマンドを使用して、この親子関係が実際にどのように機能しているかを観察できます。
ps l
lオプションは、実行中のプロセスに関する詳細を示す「ロングフォーマット」ビューを提供します。PPID(親プロセス ID)というラベルの付いた列が表示されます。現在のシェルのプロセス(例:bash)を見てください。ps lコマンドを実行すると、シェルのPIDがps lプロセスのPPIDと一致することに気づくでしょう。これは、シェルがpsプロセスを作成するために自身を fork したためです。
init プロセス
すべてのプロセスが別のプロセスの子供であるならば、オリジナルの祖先が存在しなければなりません。それがinitプロセスです。システムが起動すると、カーネルはinitを最初のユーザー空間プロセスとして作成し、PID 1 を割り当てます。initプロセスは、他のすべてのプロセスの究極の親であり、システムを管理するためにルート権限で実行されます。システムがシャットダウンするまで終了することはできず、システムを稼働させ続ける多くのサービスを起動する責任があります。