コマンドが実行される流れから説明します。
Linuxカーネルがディスクから実行ファイルを読み出し
メモリに格納し
その内容にしたがってCPUがプログラムを実行しています。
メモリ上で実行状態にあるプログラムのことをプロセスと呼びます。
前提
ざっくりと雰囲気を掴むためにMacOS上のターミナルでの例を取り上げています。
MacOSもベースはLinuxですがUbuntuなどのLinuxディストリビューションとは
挙動が違う場合もありますのでご注意ください。
psコマンド|プロセスの表示
なにはともあれ見てみましょう。
ターミナルを立ち上げて以下のコマンドを入力してreturnキーを押してみましょう。
$ps
PID TTY TIME CMD
15834 ttys000 0:00.00 /bin/bash
これは現在のターミナルで実行されているプロセスだけを表示しています。
シェルのbashが動いていますよという意味です。
それぞれ項目を見ていきますと
PIDはプロセスID
TTYはターミナルのタブ(1プロセスの画面)とイメージするのが個人的にはわかりやすいと思っています。
ちなみにTTYのところが?となっているものはデーモンプロセスです。
TIMEはプロセスがCPUを動かしていた時間
CMDはコマンドの略で/bin/bashはbashというシェルスクリプトが動きましたよという意味。
プロセスがどんな動きをするのかハンズオン
以下の操作をしてみてください。
アプリケーション→ユーティリティからターミナルを開きます。
$ps
PID TTY TIME CMD
1676 ttys000 0:00.06 /bin/bash -l
10593 ttys001 0:00.05 -bash
表示されるものはそれぞれ違いますが色々出てくるともいます。
ここで表示される1行がプロセスです。
command+Tで新しいタブを開き以下のコマンドを打ってみましょう。
$echo test0214 > test0214.txt
$more test0214.txt
そしてcommand+Tで新しい3つめのタブを開き以下のコマンドを打ってみましょう。
$ps
PID TTY TIME CMD
1676 ttys000 0:00.06 /bin/bash -l
10593 ttys001 0:00.05 -bash
12082 ttys008 0:00.00 more test0214.txt
2つ目のタブで実行しているmoreコマンドが表示されました。
同じ形でcommand+Tで新しい4つめのタブを開き以下のコマンドを打ってみましょう。
$more test0214.txt
そしてcommand+Tで新しい5つめのタブを開き以下のコマンドで確認してみます。
$ps
PID TTY TIME CMD
1676 ttys000 0:00.06 /bin/bash -l
10593 ttys001 0:00.05 -bash
12082 ttys008 0:00.00 more test0214.txt
12573 ttys010 0:00.00 more test0214.txt
タブ2で実行中のmoreコマンドのプロセスと
タブ4で実行中のmoreコマンドのプロセスが
違うタブ(TTY)、別々のプロセス(PID)で走っているのが確認できると思います。
(test0214.txtを表示するという同じ動作をしていますが別々のプロセスとして実行されています)
今回はMacOSでの例でしたが、Linuxディストリビューションによっては動きが少し変わることもあるようです。
※@angel_p_57さんご指摘ありがとうございました。
プロセスが実行される流れ
コマンドを実行するとLinuxカーネルがディスクから実行ファイルを読み出してメモリに格納します。その内容に従ってCPUがプログラムを実行します。
プロセスは個別のメモリ領域を確保する
例えば同じmoreコマンドが3つ同時に実行されても
それぞれ別のプロセスとしてメモリ領域も違う形で実行されるため
処理が混じり合うことがありません。
またプロセスには実効ユーザーが設定されていて他のユーザープロセスは勝手に操作することが出来ないようになっています。
1つ1つのプロセスはプロセスID(psコマンドを打った結果のPIDという項目)という一意の番号をもっていて
Linuxカーネルが管理してくれています。
Linuxでプロセスが新しく作られる時は既に存在しているプロセスを元に作成されます。作成するプロセスを親プロセス、作成されるプロセスを子プロセスと呼びます。シェルからmoreコマンドを実行した際にはシェルが親プロセスとなり、moreが子プロセスとなります。
参考文献
この記事は以下の情報を参考にさせていただきました。
-新しいLinuxの教科書