このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。

Linuxコマンドの基本:プロセスとは

プロセス

 現代の多くのオペレーティングシステム(OS)は、マルチタスク機能を持っています。これにより、複数のプログラムを同時に並行して実行することが可能です。Linuxもその一つで、例えばファイルのコピーを待っている間にテキストファイルを開いて読むなど、ユーザーは一つのプログラムの終了を待たずに効率的に作業を進めることができます。ここでは、Linuxにおけるプロセスの仕組みについて詳しく解説します。

プロセスとは

 これまで多くのコマンドを紹介してきましたが、これらのコマンドの実体はディスク上に保存された実行ファイルです。シェルからコマンドを実行すると、Linuxカーネルはディスクからその実行ファイルを読み出してメモリに格納し、そのメモリ内容に従ってCPUがプログラムを実行します。このメモリ上で実行状態にあるプログラムのことを、プロセスと呼びます。

プロセスの概要

  • プロセス:実行中のプログラム。メモリ上で動作している。
  • 実行ファイル:ディスク上に保存されたプログラムのファイル。

図:ディスク上の実行ファイルがメモリに読み込まれ、プロセスとして実行される様子

1.ディスク

 ディスクには、/bin/cat/bin/ls/bin/date といった実行ファイルが保存されています。これらのファイルはコマンドを実行する際に、メモリに読み込まれて実行されます。ディスク上のファイルは物理的な場所に保存されており、直接実行はできませんが、メモリに読み込まれることで実行可能になります。

2.実行ファイル

 /bin/cat/bin/ls/bin/date はそれぞれ異なるコマンドの実行ファイルです。ユーザーがこれらのコマンドを実行すると、これらのファイルがメモリ上に読み込まれます。

3.メモリ

 実行ファイルがディスクからメモリに読み込まれると、メモリ上にプロセスが生成されます。この図では、/bin/cat/bin/ls/bin/date の3つの実行ファイルが、それぞれ異なるプロセスとしてメモリに読み込まれ、実行されています。

4.プロセス

 メモリ上では、各実行ファイルがそれぞれ独立したプロセスとして実行されています。図では4つのプロセスが表示されており、それぞれが異なるファイルを実行しています。

プロセスの特徴

  • 独立したメモリ領域:プロセスは、それぞれ独自のメモリ領域を持ちます。同じコマンドから実行された場合でも、各プロセスのデータが混在することはありません。
  • 実効ユーザー:プロセスには実効ユーザーが設定されており、ファイルの所有者と同様にアクセス権限が管理されています。他人のプロセスを勝手に操作することはできません。
  • プロセスID(PID):Linuxカーネルは各プロセスに一意の番号であるプロセスIDを割り振り、適切に管理しています。

プロセスの親子関係

 Linuxでは、新しいプロセスが作成されるとき、無から生成されるのではなく、既存のプロセスを元に作成されます。これを親子関係と呼び、以下のように分類します。

  • 親プロセス:新しいプロセスを作成する元のプロセス。
  • 子プロセス:親プロセスから作成された新しいプロセス。

例:シェルからlsコマンドを実行

  1. シェル(bashなど)が親プロセスとして動作。
  2. シェルがlsコマンドを実行すると、子プロセスとしてlsのプロセスが作成される。

プロセスを確認するコマンドと操作

 Linuxでは、現在実行中のプロセスを確認・操作するためのコマンドがいくつか用意されています。以下に代表的なコマンドを紹介します。

psコマンド

psコマンドは、現在のプロセスの状態を表示します。

使用例

user01@ubuntu:~$ ps
    PID TTY          TIME CMD
   3970 pts/0    00:00:00 bash
   4040 pts/0    00:00:00 ps
項目説明
PIDプロセスID
TTY端末の種類
TIMEプロセスが使用したCPU時間
CMD実行しているコマンド名
psコマンド

topコマンド

 topコマンドは、リアルタイムでプロセスの情報を表示します。「q」キーを押すとtopコマンドを終了してターミナルに戻ります。

使用例

user01@ubuntu:~$ top

実行結果

top - 23:09:56 up 6 min,  1 user,  load average: 0.22, 0.34, 0.20
Tasks: 201 total,   1 running, 200 sleeping,   0 stopped,   0 zombie
%Cpu(s):  2.6 us,  2.4 sy,  0.0 ni, 92.6 id,  0.0 wa,  0.0 hi,  2.4 si,  0.0 st 
MiB Mem :   3898.1 total,   2040.0 free,   1090.8 used,   1026.6 buff/cache     
MiB Swap:   3898.0 total,   3898.0 free,      0.0 used.   2807.3 avail Mem 

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND  
   3168 user01    20   0 3954772 390972 143848 S  22.3   9.8   0:11.22 gnome-s+ 
   3963 user01    20   0  777160  68292  53320 S   1.0   1.7   0:00.96 gnome-t+ 
      9 root      20   0       0      0      0 I   0.3   0.0   0:00.22 kworker+ 
...(省略)...
  • CPUやメモリの使用状況が一覧表示されます。
  • プロセスの優先度や実行時間など、詳細な情報を確認できます。

pstreeコマンド

pstreeコマンドは、プロセスの親子関係をツリー状に表示します。

使用例

システム上のプロセスがどのような親子関係になっているか、一目で分かります。

user01@ubuntu:~$ pstree
systemd─┬─ModemManager───3*[{ModemManager}]
        ├─NetworkManager───3*[{NetworkManager}]
        ├─VBoxDRMClient───5*[{VBoxDRMClient}]
        ├─VBoxService───8*[{VBoxService}]
        ├─accounts-daemon───3*[{accounts-daemon}]
        ├─avahi-daemon───avahi-daemon
        ├─colord───3*[{colord}]
        ├─cron
        ├─cups-browsed───3*[{cups-browsed}]
...(省略)...

killコマンド

killコマンドは、指定したプロセスにシグナルを送信して制御します。

使用例

バックグラウンドで、xeyesを起動させます。

  xeyesは、2つの動眼を表示するグラフィカルなアプリケーションです。killコマンドで、プロセスIDが1234のプロセス(xeyes)を終了させます。

user01@ubuntu:~$ xeyes &
[1] 4169
user01@ubuntu:~$ ps
    PID TTY          TIME CMD
   3970 pts/0    00:00:00 bash
   4169 pts/0    00:00:00 xeyes
   4215 pts/0    00:00:00 ps
user01@ubuntu:~$ kill 4169

まとめ

  • プロセスは、メモリ上で実行中のプログラムのことを指します。
  • Linuxカーネルは、各プロセスに一意のプロセスID(PID)を割り振り、適切に管理しています。
  • プロセスは親子関係を持ち、既存のプロセスから新しいプロセスが作成されます。
  • pstoppstreekillなどのコマンドを使用して、現在実行中のプロセスを確認・操作できます。

 プロセスの仕組みを理解することで、システムの状態を把握し、効率的にリソースを管理することができます。これらのコマンドを実際に使用してプロセスを操作し、Linuxのマルチタスク機能を最大限に活用してみましょう。