目標
「プロセス」の概要を理解する。
「プロセスID」について概要を理解する。
「プロセスの親子関係」について概要を理解する。
「子プロセスの生成」について概要を理解する。
「ジョブ」「セッション」について概要を理解する。
「フォアグラウンドジョブ」「バックグラウンドジョブ」について概要を理解する。
プロセス
プロセスの概要
プロセスとは
Linux起動後に動作中(「実行状態」や「待ち状態」、もしくは「実行可能状態」)のプログラムのことをプロセスといいます。
プロセスは次の順で準備(プロセスの生成→実行可能状態)が行われます。
- プロセステーブルへのエントリ
- メモリブロックへの割り当て(プロセステーブルへブロック情報追加)
- プログラムファイルの展開(プログラムカウンターへ最初のプロセスを登録)
プロセスID
プロセスにはプロセスIDといった重複しない整数が割り当てられてプロセステーブルで管理されます。プロセスIDは「PID」 (プロセス識別子)といってプロセスを区別するために利用されます。
プロセスの親子関係
プロセスは別のプロセスの生成を行うことがあります。この時、生成する側を「親プロセス」、生成される側を「子プロセス」といいます。(※プロセスの生成にはメモリの割り当てなどが必要なため、そのような処理はカーネルに依頼します。)
プロセスが生成されると子プロセスは親プロセスのIDを持っていて、親子関係が分かるようになっています。親プロセスのIDをPPID(Parent PID)といいます。
子プロセスの生成順序について
プロセスはページテーブルという「仮想的なアドレス」と「物理的なアドレス」を紐づけるテーブルを利用してに処理を行います。
親プロセスは子プロセスを生成する時fork()関数を利用します。
fork()関数
Linuxではプロセスが別のプロセスを生成するとき、fork()関数を利用してページテーブルの内容を複製します。(親プロセスのページテーブルが複製されます。)
その後、テーブルの内容を変更した場合、メモリに対しては書き込みの権限がないので「何もない!」となります。この状態を「ページフォールト」と呼びます。
この時、CPUでは書き込みの権限があるカーネルモードに切り替わりって書き込みが可能になります。カーネルモードで「メモリの確保」や「親プロセスのコピー」などを行います。
その後、カーネルモードでの処理を終えると処理はプロセス(ユーザーモード側)へ戻されます。
execve()関数
fork()関数で作成した子プロセスは親プロセスのコピーとなっています。このあと、子プロセスではexecve()関数を利用して別のプログラムと置き換えを行います。
ジョブ
ジョブとセッションの概要
ジョブとは
1つ以上のプロセスをもつ「処理のあつまり」のことをジョブといいシェルで制御できます。単位としては、ひとつのコマンド処理もひとつのジョブ。パイプでつないだ複数のコマンド処理もひとつのジョブとなります。
セッションとは
ユーザーがLinuxを操作する場合、そのユーザーがアクセスしてきた端末やSSHのログインセッションに対応するもので各セッションにはセッションIDが割り振られます。このセッションにはプロセスグループを複数存在させることができます。
「フォアグラウンドジョブ」と「バックグラウンドジョブ」
フォアグラウンドジョブ
各セッション(1ユーザーが利用する1端末)に対して1つだけ存在することができるジョブです。基本的なコマンド入力がフォアグラウンドジョブとなります。
フォアグラウンドジョブは入力したコマンドの全ての処理が完了するまで、別のコマンドを受け付けなくなります。シェルを占有した操作と言えます。
バックグラウンドジョブ
キーボードを利用したコマンド入力にバックグラウンドジョブを指定したジョブをバックグラウンドジョブといいます。コマンドの後に「スペース + &」を入力します。
この時、シェルはこのジョブをバックグラウンドジョブとして管理します。バックグラウンドジョブとして動くジョブはジョブ内のひとつひとつのプロセスの処理の終了を制御しません。全てのプロセスが終了するまで動き続けます。
今回は以上になります。
ブックマークのすすめ
「ほわほわぶろぐ」を常に検索するのが面倒だという方はブックマークをお勧めします。ブックマークの設定は別記事にて掲載しています。