Linuxコマンドを勉強~ps その2~

「STAT」項目の内容

「STAT」項目はプロセスの状態を表示します。

D 割り込み不可の待機状態
R 実行中または実行可能
S 割り込み可能な待機状態
T ジョブ制御シグナルまたはトレースされているために停止中
Z 親プロセスによって回収されなかったゾンビプロセス

となっています。
これらの文字の後、次のような記号が連なっている場合があります。

< 優先度が高い
N 優先度が低い
L メモリロックされている
s セッションリーダー
l マルチスレッド化されている
+ フォアグラウンドのプロセスグループに含まれている

ということです。

プロセスにまつわるキーワードがごろごろ眠っています。

プロセスの状態

プロセスには、大きく待機状態、実行状態、停止状態という状態があります。
待機状態とは、例えばファイルの入出力を行うプログラムがディスクを読み書きしている間、その完了を待っている状態です。
また、待機状態にはシグナルを受け付けると実行待ち状態に遷移する待機状態と、シグナルを受け付けても待機状態を続ける待機状態の2種類があります。
前者は「STAT」項目上は”S”、後者が”D”と表示されます。

シグナルとは、プロセス間でやりとりを行うための仕組みです。現在のプロセスの状態に割り込んで別の状態に遷移させるために使用します。
例えばターミナル上で動かしたコマンドを中断させる場合にCtrl+Cを実行しますが、これは実行中のプロセスに、プロセスを強制終了させるシグナルを送っているからです。
このシグナルを発生させてプロセスやジョブを制御するコマンドに、killコマンドがあります。killコマンドについては後で勉強します。

実行状態には、実行待ち状態と実行中状態があります。この2つは「STAT」項目上、”R”で表示されます。
Linuxでは、プロセスを実行する順番をスケジューリングしています。今まさに実行しているプロセスを実行中状態、スケジューリングされるプロセスとして登録されているがまだ実行されてはいない、というプロセスが実行待ち状態です。

停止状態は、プロセスの実行が一時停止している状態です。一時停止しているプロセスを実行することはできませんが、一時停止から再開させることで再び実行が始まります。「STAT」項目上、”T”で表示されます。

この大きく4つの状態(実行中、割り込み可能待機、割り込み不可待機、停止中)に加えて、終了状態というものが存在します。

前回、プログラム実行を行うと親プロセスが子プロセスに対してwait()システムコールを行い、プログラムが終了すると言いましたが、子プロセスは自身のプロセスが終了しexit()システムコールを実行した後、親プロセスのwait()が実行されるまでこの終了状態になります。

このとき、何らかの原因で親プロセスのwait()が実行されなかった場合、子プロセスの実行自体は終了しているにも関わらずwaitによるリソースの解放がされず、子プロセスは終了状態のままで残ります。
これをゾンビプロセスといいます(死んだはずのプロセスが解放されずシステム内をさまよっているから、ということでしょうか)。「STAT」項目上、”Z”で表示されます。ゾンビという言い方はマニュアルにものってます。公式ですね。

ジョブ

ジョブとは、複数のプロセスがまとまって一連の動きをしていることを言います。
簡単な例は、パイプです。パイプは各プロセスをつなげて全体で1つの仕事をします。つまりジョブといえます。

ジョブについてもいずれ勉強します。

優先度

優先度とは、同時間に動いているプロセスがあった場合にCPUをより多く消費してくれるための度合、ということです。この指標となるのがnice値です。

nice値は「-20」から「20」まであり、デフォルトは「0」です。数値が低い(マイナス方向)ほど、優先度は高くなります。
この優先度が高いプロセスには、「STAT」項目上、”<“がつくことがあります。
優先度が低いプロセスには、「STAT」項目上、”N”がつくことがあります。
また、プロセスの優先度は「ps -l」またはtopコマンドというコマンドで確認できます。

ここで、nice値とは優先度の指標ですので、実際に動作しているCPUの優先度は別にあります。それを動的優先度、またはリアルタイム優先度といいます。
動的優先度も「ps -l」コマンドなどで確認できます。

この「PRI」項目がその動的優先度となります。
「NI」項目がnice値です。nice値のことを静的優先度ともいいます。

動的優先度はnice値をもとに計算されているのですが、詳細はniceコマンドの勉強のときにやります(たぶん)。

メモリロック

次に、メモリロックとは何でしょうか。
メモリロックとは、プロセスが使用する仮想メモリがページアウト(メモリの内容をHDDのページング領域に退避すること)することを防ぐ仕組みです。いつやるか分かりませんが、これも後ほど勉強します。
このメモリロックされているプロセスには、「STAT」項目上、”L”がつくことがあります。

セッションリーダー

次は、セッションリーダーという言葉について勉強します。
前述のジョブのことを、プロセスグループといいます。つまり、パイプを実行するとそれぞれのコマンドのプロセスは同じプロセスグループに属することになります。
プロセスグループはプロセスグループID(PGID)という番号で管理されます。
「ps -j」などで確認できます。

今、「tail -f test/a.txt | more」というコマンドを実行したとします。
それを別ターミナルで確認すると、こうなります。

この「PGID」項目がプロセスグループIDですが、tailコマンドとmoreコマンドのPGIDが同じであることが分かります。
ジョブのように複数プロセスで構成されている処理を簡単に制御できるため、プロセスグループがあります。

このプロセスグループはセッションと呼ばれるものの一員となります。
セッションとは例えば「ログインセッション」のことで、ログインしてからログアウトするまでの期間管理されます。

前回、ターミナルでログインするとbashプロセスが生成されると図のちょっとしたとこに書きましたが、
このbashプロセスは制御端末であるターミナルとやりとりをするのですが、そのターミナルが切断されると、そのセッション内の全プロセスを停止します。

この、所属するプロセスグループ(bashプロセスの子プロセス(グループ)孫プロセス(グループ)・・・)をひとまとめに制御しているのがセッションリーダーです。

先ほどの「ps -ej」の実行結果で「PGID」の隣に「SID」という項目がありましたが、これは「セッションID」といい、所属セッションを表すIDです。セッションリーダーと同じSIDになります。

先ほどと同じ操作を行い、-oオプションで整形して「STAT」項目も付けて出してみました。

同じターミナルで実行されたtailコマンドとmoreコマンドは、そのターミナルとやりとりする「PID=3608」のbashプロセスのSIDと同じSIDを持っています。
別ターミナルで実行しているpsコマンドも同様です。

そして、セッションリーダーであるbashプロセスの「STAT」項目に”s”がついていることも分かります。

フォアグラウンド

ところで、実行中のtail、more、psコマンドには、「STAT」項目に”+”が付いていることと思います。
これはフォアグラウンドのプロセスグループでることを表しています。

フォアグラウンドのプロセスグループ(フォアグラウンドジョブ)とは、とりあえずユーザが実行しているジョブだと思ってください。
ユーザが実行したコマンドは、何も指定しなければフォアグラウンドのプロセスグループに属し、端末が切断されると実行途中でもプロセスを終了します。
これは、ターミナルで実行したコマンドのセッションリーダーがbashだからです。

しかしながら、端末が切断されても処理を続けて実行させたい場合もあると思います。
そういった場合は、コマンドをバックグラウンドジョブとして実行します。

セッションリーダーであるプロセスが終了するとき、所属するプロセスにプロセス終了などのシグナルを送りますが、バックグラウンドジョブは基本的に放置します。そうすることで、バックグラウンドジョブは端末を切断しても継続して動くのです。

このジョブ制御に関するコマンドにはjobsやbg、fg、nohupなどありますが、これらの勉強も後で、ということで。

マルチスレッド

最後に残ったキーワードはマルチスレッドですね。
プロセスが実行されると、普通は1つのプログラムが実行されるのですが、マルチスレッド化することで1つのプロセスで複数のプログラムを実行できますよ、という感じです。
詳細はまあ・・・当分やんないと思います。LPICとは全然分野が違うことですし。

とりあえずざっとキーワードを押さえたところで、残ったpsコマンドの表示項目についての勉強を続けます。

psコマンドの表示項目続き

「ps u」コマンドを実行してみます。

「START」項目は、プロセスの開始時刻ですね。
「%CPU」はCPU使用率というやつです。CPUの実行時間中、どのぐらいの時間このプロセスが実行されていたか、という割合です。
「%MEM」は、プロセスが使用している物理メモリの使用率です。
「VSZ」は、プロセスが現在使用している仮想メモリサイズです。単位はキロバイトです。
「RSS」は、ページスワップされていない物理メモリの使用量です。単位はキロバイトです。

このぐらいでしょうか。

次に、「ps -l」コマンドを実行してみます。

「F」はプロセスフラグといい、プロセスの状態を表したフラグです。0の場合はすでに終了しているプロセスを表す、1はシステムのメモリ常駐プロセス、など。
「S」は「STAT」項目のことです。
「UID」はユーザIDです。
「C」は「%CPU」項目です。
「PPID」は、親プロセスのプロセスIDです。
「ADDR」はプロセスのセグメント番号が入ってたりします。セグメントとは、仮想メモリの管理単位の1つです。
「SZ」はプロセスの物理ページサイズということです。
「WCHAN」はプロセスがスリープしているカーネル関数の名前(直訳)。実行中のプロセスは”-“となります。

他にも表示項目はたくさんあります。
ということで、psコマンドについてはここまで。

広告
  • LINEで送る