2008年9月18日木曜日

プロセスとスレッド

プロセスとは、プログラム(実行バイナリ)がOS上に実体を持ち、実行できる状態になったもののことです。プログラムそのものは、ファイルです。

プロセスはプログラムがメモリにロードされて実行できる状態になったものを指します。

スレッドとは、プロセスの中での実行単位のことです。

ひとつのプロセスには、必ず、ひとつ以上のスレッドを持ちます。

ひとつのプロセスに、複数のスレッドを持たせることができます。

ひとつのプロセスに複数のスレッドがあれば、複数のCPUで同時に処理を実行することができます。このことを、並列処理とかマルチスレッドと言います。

プロセスかスレッドのどちらかを複数にすることにより、マルチスレッド処理を実現することができます。

Javaでは、比較的、簡単に、マルチスレッド処理を実現できます。Javaでは、JavaVMがOSに対して、マルチスレッドで処理を実行するように制御してくれます。

たいていのDBMSは、複数プロセスや複数スレッドでの構成になっているため、複数の処理を同時に実行することができます。

プロセスは、「生成」されてから処理が行われるまでに、「実行」、「スリープ」、「実行可能」の状態に変化します。

「生成」とは、プロセスの誕生に相当します。次に、「実行可能」な状態になります。実行可能な状態とは、実行する準備が整ったということを意味します。その後、CPUが使用できるようになれば、「実行」状態となり、処理が行われます。ただ、どんなプロセスでも、ずっと処理が実行され続けることはありません。それは、途中で、データの読み込みや、書き込みをしたり、自ら、処理を一時的に停止したりするためです。これを、「スリープ」の状態と言います。WindowsやUNIX、LinuxのOSで、プロセスの一覧を確認すると、多数のプロセスが表示されますが、ほとんどが、何も処理をしていない「スリープ」の状態です。スリープ状態のプロセスは、たいていは、要求していた入出力が与えられると、目を覚まします。目が覚めたプロセスは、「実行可能」な状態になり、CPUが利用できるようになると「実行」状態になります。

UNIXやLinuxのvmstatコマンドを例に、プロセスとリソースの関係性について、説明します。

ひとつのプロセス(または、スレッド)が「実行中」の場合は、ひとつのCPU(または、コア)を利用していることになります。

「実行可能」な状態の場合は、CPUの使用率には現れず、run queue(procsのr列)に現れます(Windowsの場合は、Processor Queue)。

「スリープ」の状態の場合は、I/O待ちとなりますが、I/O待ちには、2種類あります。ディスクI/O待ちとネットワークI/Oです。ディスクI/O待ちであれば、wait I/OとしてCPU使用率に現れる(cpuのwa列)のと同時に、ブロックされているプロセス数として現れます(procsのb列)。ネットワークI/O待ちの場合は、wait I/Oには現れません。

ちなみに、プロセスがすべてスリープ状態であれば、CPUのアイドル(idle)として表示されます。(cpuのid列)