プロセスとは
実行中のプログラム、つまりアプリケーションを管理する単位
コマンドインタープリターであるシェル自身もプロセスである
-
fork
シェルは子プロセスとして自分の分身を作ること -
exec
シェルは子プロセスにコマンド実行を任せる
プロセスの基本的な状態遷移
1.ユーザがシェルからコマンド実行
2.fork
3.exec
4.子プロセスの終了待ち
5.子プロセスはコマンドの実行を終える
6.実行を終えると親プロセスに終了を伝え消滅
7.親プロセスは子プロセスの終了を受け取りシェルプロンプトを表示
8.ユーザの次のコマンドに備える
スケジューリング
Linuxはマルチユーザ、マルチタスクのOSである
つまり1つのCPUで複数のユーザが同時にログインでき、プロセスを同時に実行できる
各プロセスはLinuxのスケジューラによって管理されている
ラウンドロビン方式
1.各プロセスはRun Queueという待ち行列で待機しCPUを使える順番を待つ
2.自分の番で処理を一定時間(タイムスライス)進められる
3.一定時間を過ぎるとキューで次のCPUの番になる
このスケジューリングをラウンドロビン方式という
プロセスによっては優先度が高いものがあり、そのパラメータとしてNice値がある
-20(最も優先度が高い)〜19(最も優先度が低い)まで
フォアグランドジョブとバックグラウンドジョブ
- ジョブ
シェルが管理するプログラムの単位
シェルからコマンドを実行するときに、ジョブをフォアグラウンドとバックグラウンドに切り替える
機能がある
処理のかかるジョブの終了を待つのではなく、別の作業ができるようにジョブをバックグラウンドで実行
すれば同じ端末から別のコマンドを実行できるようになる
プロセスID
Linuxのプロセスには一意のIDであるプロセスID(PID)が付与される
また、自分のPIDは$$で取得可能
$ echo $$
00000
ps [オプション]
実行中のプロセスのスナップショットを表示
オプション | 意味 |
---|---|
-A | すべてのプロセスを選択。-eと等しい |
e | コマンドの後に環境を表示する |
l,-l | 長いフォーマット。-のあるなしで表示は異なる |
w,-w | 出力幅を広げる。このオプションを2つ指定すると幅の制限がなくなる |
シグナル
シグナルをを使いプロセスを制御する
シグナル番号 | シグナル名 | 意味 |
---|---|---|
1 | HUP | ハングアップ |
2 | INT | 割り込み |
3 | QUIT | 強制停止。コアダンプ生成 |
9 | KILL | 強制終了 |
15 | TERM | 終了。killコマンドのデフォルトシグナル |
シグナルの送信方法
- シェルに割り当てられたキーの入力
- kill コマンド
- プログラムでkill()関数を呼ぶ
プロセス間通信
Linux上で処理を完了するのに1つにプロセスで完了したり、複数のプロセスが同期したり動作を変更して達成することがある
これをプロセス間通信という
パイプ、シグナルはプロセス間通信の手法である
プロセス間通信の手法
名前 | 特徴 |
---|---|
パイプ | 1つのプロセスの標準入出力をつなぎかえる |
シグナル | 特定のシグナルの受信を持って特定の処理を開始 |
共有メモリ | 特定のメモリ領域を複数のプロセスで共有することでメッセージの受け渡しが可能 |
セマフォ | 資源のロックを行い、複数のプロセス間で同時に書き込みをしないよう排他処理を実現 |
メッセージキュー | キューにメッセージを格納し複数のプロセス間での非同期の通信を実現 |
ソケット | ネットワーク経由のホスト感のプロセスでの通信を実現 |
参考書籍
『Linux標準教科書 v3.0.2』 LPI-Japan 2019年