プロセスとプログラムの関係
プロセスは実行されているプログラムそのものです。プログラムを実行•処理するCPUはプロセスを実行してプログラムを動かしています。プロセスはプログラムの実行単位という呼ばれ方もされます。
プログラムは大きな一つの塊で成り立っているのではなく、複数の小さなプログラムが積木のように集まってできていると想像してみてください。つまり、1つのアプリケーションを実行するプロセスは一つだけではなく、複数ある場合があるということです。
Linuxではコマンドを打ち込んで処理が実行されます。コマンドを打ち込むとプロセスが開始されます。実行されたプロセスを確認したい場合はpsコマンドやtopコマンドを使います。
linuxでosに命令を送るシェルもプログラムなのでプロセスとして表示されます。シェルのbashはプロセス名bashが立ち上がっています。
システムプロセスとユーザープロセス
ユーザーによって開始されるプロセス以外にシステムプロセスといって、勝手に起動するプロセスもあります。これらはOSを動かすのに必要なプロセスで、シェルのプロセスもその一つです。他にもsystemdというプロセスがあります。これはプロセスの中でも一番初めにカーネル(OS)によって起動されるプロセス(プロセスid1番)で他のプロセスを管理します。
プロセスには識別番号であるプロセスidが割り振られます。プロセスID(PID)はpsコマンドで確認できます。
また、並列処理等のため同じ名前のプロセスが複数立ち上げられる事がありますが、別々のプロセスIDが付与されるため、区別する事ができます。例: httpd pid:4012 httpd pid: 4045(httpdというプロセス名)
プロセスとスレッドの違い
スレッドは一つのプロセスから生成される実行単位で、プロセスとは違ってメモリなどのリソースを共有できるのが特徴です。
スレッドの利点
プロセスでは割り当てられたリソースを共有できないため、余ったリソースが無駄になってしまうが、スレッドでは無駄なくリソースを利用できます。
プロセスはリソースを共有しないのでアプリケーションのプロセスが落ちても他方のプロセスに影響しない。スレッド同士はリソースを共有しているので影響します。
スレッドの必要性
プロセスと基本的には似ていますが、スレッドを利用する目的はどこにあるでしょうか?
- リソースの効率的な利用
- 並列処理による高速化
などが挙げられます。
スレッドはプロセス内に立ち上げられるものです。1プロセスに対して1スレッドはシングルスレッドと呼ばれます。1プロセスに複数のスレッドを作ることもできます。これをマルチスレッドといいます。
立ち上げたプロセスはメモリなどのリソースを割り当てられます。割り当てられたリソースはそのプロセスしか利用できません。しかし、プロセスが与えられたリソースは最大限に利用されるとは限らず、無駄になってしまう事があります。たくさんプロセスを開始するほど無駄が増える可能性があります。スレッドの場合はリソースを共有するので無駄になりません。
メモリをアパート•部屋として、プロセスを人としてイメージするとプロセスは1人部屋利用者です。スレッドは相部屋利用者のようなものです。夜勤の人と昼勤の人でシェアすれば部屋(リソース)の無駄がないような感じでイメージすると分かりやすいかも?
ジョブとは?
ジョブは実行される仕事の単位です。こういうと分かりにくいですが、プログラムがコンピュータが処理するプログラミング言語によって書かれたデータとするなら、ジョブはプログラムにより実行される仕事を指します。
つまり、プロセスという実行単位がCPUによって処理されることによってそのプログラムが動作しますが、そのプログラムを実行するプロセスやスレッドのまとまりをジョブと言います。
もう少し言うと、プログラムに対して複数のスレッドやプロセスが動作している事がありますが、これらは確かに一つ一つは別々のプロセス、スレッドですが、もとは一つのプログラムを実行するためのものであるはずです。
- プログラム1
- プロセスa
- スレッドI
- スレッドIi
- スレッドIII
- プロセスb
- プロセスc
- プロセスa
プロセスa,b,cスレッドI, II,IIIのひとまとまりがジョブです。ジョブはプログラムを動作させる実行単位のまとまりです。
linuxではジョブはjobsコマンドで確認できます。ジョブは実行中のものや一時停止中のものもあります。
コマンドで実行したものもジョブですがjobsコマンドでは見えないと思います。なぜなら多くのコマンドは即時実行されて終了するからです。アンパサンド(&)をコマンドの後ろに付けてバックグラウンド実行させたり、Ctrl+zで停止させたりすると見えるようになります。
親プロセスと子プロセス
プロセスには親プロセスや子プロセスという概念があります。子プロセスは親プロセスから生み出されます。例えばinitやsystemdと呼ばれるプロセスは最初に起動されるプロセスでこのsystemdというプロセスが親プロセスとなって他の子プロセスが生成されます。
コマンドを打ち込むシェルであるbashもsystemdの子プロセスです。topコマンドをbashで実行するとtopの親プロセスはbashになります。
linuxでは親プロセスが終了すると子プロセスは終了します。全てのプロセスを統括するsystemdは一番初めに生成して、一番最後に停止します。全てのプロセスの主であるsystemdは「始まりであり終わりである」ということですね