Linuxコマンドを勉強~プロセスとは、initプロセス~

プロセスとは

Linuxはカーネルを中心としたOSですが、カーネルの機能の1つにプロセス管理があります。
カーネルのプロセス管理とは、何かプログラムが実行されたとき、プロセスを生成しその終了までプログラムを管理することです。

Linuxがプログラムそのものではなく、プロセスという単位でプログラムを管理するのは、異なるユーザが同時に同じプログラムを実行するなどしたときに、それらが干渉することなく処理を行うことができるからです。(細かく言うと、プロセス単位で仮想メモリ空間を用意するため、干渉せずに物理メモリにアクセスすることができています)

またプロセスを管理するため、プロセスにはPID(プロセスID)が割り当てられています。

これをマルチタスクといいます。前述のアクセス権とこのプロセス管理によって、Linuxはマルチユーザー/マルチタスクOSを実現しています。

では、カーネルはどうやってプログラムを実行するかというと、
カーネルは、システムコールと呼ばれる手続きを踏んでカーネル内部にあるプログラム実行し、メモリやハードディスクなどを操作します。
システムコールは、ユーザではなくアプリケーションが実行します。

例えばlsコマンドなどのコマンド内部でも、システムコールを使ってカーネルのプログラムを実行しています。

システムコールにはfork()、exec()、wait()、exit()などあります。

下の図に、lsコマンドの実行を例に、プロセスの生成から終了までを表してみました。

8

大事なのは、プロセスがプロセスを生む、というところです。
このとき、親の情報は子に引き継がれ、子のプロセスIDを親が把握します。
この親子関係によって、プログラムがさらなるプログラムを実行する、ということが実現できます。

このように、Linuxのプログラムはすべて何かのプロセスの子プロセスです。
では、その親をどんどんたどっていくとどこに行きつくのか、というのが次の話。

initプロセス

カーネルは電源投入後、主にブートローダから実行されるプログラムです。
起動したカーネルは様々なことをしますが、その一つに、initプログラムの実行があります。
initプログラムはinitプロセスとして実行されます。
initプロセスのPIDは1となります。

Linux上で動くすべてのプログラムは、このinitプロセスから実行されます。

現在動作しているプロセスを確認するコマンドの1つに、pstreeコマンドがあります。
このコマンドは、すべてのプロセスをツリー構造で表示します。

今、「tail -f」コマンドで何かのファイルを開きっぱなしにしているとします。
このとき、別のターミナルを開いてpstreeコマンドを実行してみます。

上記のように、ツリー構造のルートにinitプロセスがあることが分かります。

また、ターミナルで実行したpstree自身と、現在実行しているtailコマンドのプロセスが、
それぞれbashプロセスの子プロセスになっていることが分かると思います。

gnome-terminalというプロセスは、ターミナルのことです。

プロセスの確認方法は次に勉強します。

広告
  • LINEで送る