プロセス管理
合わせて読みたい
新しくプロセスを生成する目的は主に2つ
1. 同じプログラムの処理を複数プロセスに分けて処理(Webサーバーが複数リクエストを受け付ける)
fork関数のみ
2. 別のプログラムを生成する(bashから各種プログラムを新規生成)
fork関数とexecve関数
Linux では fork と execve 関数を使う内部的には clone, execve というシステムコールを呼び出す 任意のプロセスで別のプログラムを生成するのに fork & execve というのは冗長なのでUNIX系OSからのC言語インタフェース規格POSIXで定義されたposix_spawn という関数で簡略化できる
親の親の…最終的な親プロセスは何か
https://scrapbox.io/files/635526a41535c000205ebed2.png
プロセスの祖先は 1 の systemd になっていた
ps aux でCPU時間を見ると bash などは起動してからほとんど使っていない、イベントが発生するまでスリープ状態になっている
STAT フィールドが S になっているとスリープ状態
CPUを使いたいというプロセスは R になっている
プロセス誕生後は、実行可能状態となりCPUを実行権を得て実行状態に、その後実行権を失いスリープ状態になる
もしくはゾンビ状態になって親プロセスが終了状態を得てプロセスが終了となる
スリープ状態のとき論理CPUではアイドルプロセスという特殊なプロセスが動作している(これは ps から見えない
論理CPUを休止状態にして実行可能状態になるまで消費電力を抑えて待機している
プロセス終了のシステムコールはexit_groups()、カーネルはメモリどのプロセスのリソースを回収 プロセス終了後は wait(), waitpid() というシステムコールにより情報を取得
プロセスの戻り値、シグナルによって終了したか否か、終了までどのくらいCPU時間を使ったか
https://scrapbox.io/files/63552a7c022f29001e94346c.png
終了した子プロセスの情報が得られるということは何らかの形で存在しているということ
カーネルは、initを孤児プロセスの親にする、ゾンビプロセスの親が終了すると initにゾンビプロセスが集まる
init は適宜wait()系システムコールを呼び出しリソースを回収している バックグラウンド実行後ジョブ番号を書くにして jobs で一覧をリスト fg でフォアグラウンドに戻す