目標
「プロセス」の概要を理解する。
「プロセスID」について概要を理解する。
「プロセスの親子関係」について概要を理解する。
「子プロセスの生成」について概要を理解する。
「ジョブ」「セッション」について概要を理解する。
「フォアグラウンドジョブ」「バックグラウンドジョブ」について概要を理解する。
プロセス
プロセスの概要
プロセスとは
Linuxでは動作中のプログラムのことをプロセスといいます。これは、「実行状態」「待ち状態」「実行可能状態」のいずれかの状態で、CPUの管理下にある処理単位です。

プロセスは次の順で準備(プロセスの生成→実行可能状態)が行われます。
- プロセステーブルへのエントリ
- カーネルは新しいプロセスのために、プロセステーブル(Process Table)にエントリを作成します。ここには、プロセスID(PID)や親プロセスID(PPID)、プロセスの状態、優先度などの情報が格納されます。
- メモリブロックへの割り当て(プロセステーブルへブロック情報追加)
- プロセスに対して必要な仮想メモリ空間が確保されます。コード領域、データ領域、スタック領域などが割り当てられます。
- プログラムファイルの展開(プログラムカウンターへ最初のプロセスを登録)
- 指定された実行ファイル(バイナリプログラム)がメモリにロードされ、プログラムカウンタ(PC)はプログラムのエントリポイントに設定されます。これにより、CPUはどこから実行を開始するかを知ることができます。
- プロセス状態の設定
- 準備が完了したプロセスは、「実行可能状態(Ready)」となり、スケジューラによってCPUに割り当てられるのを待ちます。
プロセスID
プロセスにはプロセスIDといった重複しない整数が割り当てられてプロセステーブルで管理されます。プロセスIDは「PID」 (プロセス識別子)といってプロセスを区別するために利用されます。
プロセスの親子関係
プロセスは別のプロセスの生成を行うことがあります。この時、生成する側を「親プロセス」、生成される側を「子プロセス」といいます。(※プロセスの生成にはメモリの割り当てなどが必要なため、そのような処理はカーネルに依頼します。)
プロセスが生成されると子プロセスは親プロセスのIDを持っていて、親子関係が分かるようになっています。親プロセスのIDをPPID(Parent PID)といいます。
子プロセスの生成順序について
プロセスはページテーブルという「仮想的なアドレス」と「物理的なアドレス」を紐づけるテーブルを利用して処理を行います。

親プロセスは子プロセスを生成する時fork()関数を利用します。
fork()関数
Linuxでは、プロセスが別のプロセス(子プロセス)を生成する際に、fork()関数を使用します。このとき、親プロセスのページテーブルのエントリが複製され、親と子は同じ物理メモリページを読み取り専用として共有します。
※この時点ではメモリを共有しています。

その後、親または子が共有されているメモリページに書き込みを試みると、そのページは書き込み禁止であるため、保護違反によるページフォールトが発生します。
※この時点ではメモリを共有しています。

このとき、CPUはカーネルモードに切り替わり、次の処理を行います。
- 該当する物理メモリページの新しいコピーを確保
- 書き込みを行おうとしていたプロセスのページテーブルを更新し、そのページを新しい物理ページにマッピング
- 新しいページに書き込み可能属性を設定
これにより、親子プロセスは同一の内容を持ちつつも、独立したメモリページを使うことができます。
※この時点では別々のメモリを確保しています。

その後、カーネルモードでの処理を終えると処理はプロセス(ユーザーモード側)へ戻されます。
execve()関数
fork()関数で作成した子プロセスは親プロセスのコピーとなっています。このあと、子プロセスではexecve()関数を利用して別のプログラムと置き換えを行います。

ジョブ
ジョブとセッションの概要
ジョブとは
1つ以上のプロセスをもつ「処理のあつまり」のことをジョブといいシェルで制御できます。単位としては、ひとつのコマンド処理もひとつのジョブ。パイプでつないだ複数のコマンド処理もひとつのジョブとなります。
セッションとは
Linux において「セッション」とは、ユーザーが端末や SSH などを通じてログインした際に対応する、一連のプロセスのまとまりを指します。各セッションには一意の「セッション ID(SID)」が割り当てられます。
セッションの中には複数のプロセスグループが含まれることができます。つまり、1つのログインセッション内で複数のジョブ(プロセスグループ)を管理することが可能です。

「フォアグラウンドジョブ」と「バックグラウンドジョブ」
フォアグラウンドジョブ
各セッション(1ユーザーが利用する1端末)に対して1つだけ存在することができるジョブです。基本的なコマンド入力がフォアグラウンドジョブとなります。
フォアグラウンドジョブは入力したコマンドの全ての処理が完了するまで、別のコマンドを受け付けなくなります。シェルを占有した操作と言えます。
バックグラウンドジョブ
キーボードを利用したコマンド入力にバックグラウンドジョブを指定したジョブをバックグラウンドジョブといいます。コマンドの後に「スペース + &」を入力します。
この時、シェルはこのジョブをバックグラウンドジョブとして管理します。バックグラウンドジョブとして動くジョブはジョブ内のひとつひとつのプロセスの処理の終了を制御しません。全てのプロセスが終了するまで動き続けます。
今回は以上になります。

ブックマークのすすめ
「ほわほわぶろぐ」を常に検索するのが面倒だという方はブックマークをお勧めします。ブックマークの設定は別記事にて掲載しています。

