1つのプログラムからいくつも生まれる
ディスクに保存されているプログラムは、いわば図面です。それを実行して、実際に動き始めた単位がプロセスです。同じ図面を使っても、工場の別々の作業台でそれぞれ作業できるように、同じプログラムを2つ起動すれば、2つのプロセスが生まれます。
プロセスは、OS が管理する「実行中のプログラム」の単位で、それぞれが独立したメモリと資源(CPU の時間やファイルなど)を持ちます。作業台ごとに専用の材料と道具が用意されているので、1つの台で問題が起きても、ほかの台の作業には影響しません。片方のプロセスが異常終了しても、もう片方は動き続けます。Webブラウザの中には、タブごとに別のプロセスで動かして、1つのタブが固まってもほかのタブを巻き込まないようにしているものもあります。
作業台の割り振りを管理しているのはOSです。1つの CPU コアが一度に進められる処理は1つですが、OS がプロセスを細かく切り替えることで、複数のプログラムが同時に動いているように見せています。
作業台の中のもっと細かい手
プロセスの中には、スレッドというさらに細かい実行の流れがあります。1つの作業台で、何人かが同じ材料と道具を分け合いながら並行して手を動かしているイメージです。
| 材料や道具(メモリ) | 特徴 | |
|---|---|---|
| プロセス | 台ごとに別々 | 独立しているので、一つが壊れてもほかは無事 |
| スレッド | 同じ台の中で共有する | 軽くて切り替えが速い。一つの不具合がほかに響くことがある |
Webサーバーがリクエストを受けるたびにプロセスやスレッドを用意して対応したり、複数の CPU コアを使って処理を速くしたりするのは、この仕組みを使い分けた結果です。コンテナも、プロセスを隔離された環境にまとめて動かす仕組みです。
増やせば速くなるとは限らない
プロセスを増やせばたくさんの仕事を同時にさばけそうに見えますが、1台のサーバーが持てる資源には上限があります。作業台を増やしすぎれば、工場の床(メモリ)も電力(CPU)も足りなくなります。データベースへの接続数や同時に開けるファイルの数といった上限にも、先に突き当たることがあります。
だからプロセスの数には上限を決め、サーバーの資源全体を見て設計します。異常終了したプロセスを自動で再起動する仕組みも、セットで用意しておきたいところです。終了したのに片付けられず残ったプロセス(ゾンビプロセス)が溜まっていないかも、資源の無駄を見つける手がかりになります。