ソフトウェア開発におけるプロセスとスレッドの違い

以前、スレッド間通信についての記事にて、スレッドの集合体がプロセスともいうことができることを記載しておりました。今回はこのプロセスとスレッドの違いについてフォーカスを当てたいと思います。
理由は、以外にこの違いを理解せず、後々、その言葉の違いの認識違いにより重大な問題(上位者の意図とは異なるプログラムを作成してしまうことなど)を引き起こす危険性もありうるためです。

私自身、この業界に身を転じてから、このプロセスとスレッドの違いを明確に理解したのは約1年経過した時期の頃でした。それまでは、何度か、上位者と認識が合わず、困らせてしまったものでした。

それでは、プロセスとスレッドの違い及び利用例についてみて参りましょう。

ソフトウェア開発、プロセスとスレッドの違い

プロセス=スレッドの集合体

一つのプロセスをさらに細かく分解し、それぞれ勝手に(非同期に)動くものがスレッドともいえる。

同期、非同期、初めて耳にする人にはわかりにくい表現でしょうね。実がこの違いはプロセスとスレッドの違いと同じぐらい理解を間違えると大変な問題を将来起こしてしまう可能性が高いので、ついでにご説明しましょう。

非同期とは複数の処理が互いに縛られることなく、あたかも同時並行で動く様をいいます。
逆に同期とは複数の処理が、順番をお辞儀よく待って、互いに入れ替わり、立ち替わりで規則正しく動く様をいいます。

実際の生活で例えてみますと、

  • マラソンランナーに参加する人々=非同期な人々
  • 人気ラーメン店にマナーを守って並ぶ人々=同期な人々

というような感じですね。

メモリ領域の使い方の違い

プロセス同士(大名家同士)は各々、自分の領地(メモリ領域)を割り当てられます。逆にスレッド同士(領主、家来衆)は同じ家中でプロセス(お家)を支えます。

IT業界の言い方に直せば、

「プロセス間のメモリ空間は互いに利用することはできない。スレッド間は同じように利用できるメモリ空間上で動作する。」

プロセスは単独で動作できるプログラム単位

プロセスはコンピュータ(具体的にはCPUやメモリ)の力を借りて単独で動作することができる。スレッドは単独で動作することはできない。

Windowsアプリケーションの拡張子が.exeとなっているファイルもクリックすると立ちあがりますよね。
代表的なものにワードやエクセル、WEBブラウザ、拡張子がexeファイルのものはすべてプロセスです。

そしてワードやエクセルの中のスレッド同士が細かく役割を分割して、線を引いたり、絵を書いたりできるようにしているようなイメージです。

これではまだ具体的なイメージができないと思いますので、利用例をご紹介いたします。

プロセスとスレッドを使ったソフトウェア開発事例

インターネットショッピングサイトを例に記載します。
インターネットショッピングサイトは複数のプロセスで成り立っています。
(システム開発においてただひとつのプロセスで構成されることは稀です。大概、複数のプロセス(スレッドではないことに注意)の組み合わせでひとつのシステムが成り立ちます。)

プロセスを使ったケース

  • お客様のブラウザとの会話(HTTP通信)の間をとりなすのがWEBサーバーソフトウェア(有名なものとしてApache(アパッチ)があります)
  • WEBサーバーソフトウェアを通して受け取った会話内容を解析するソフトウェア(一般にCGIやサーブレットと呼ばれている部分)
  • お客様情報を長期保管するデータベースサーバー(有名なものとしてMySQL,Postgresql,Oracleデータベース等))、他プロセスからの要求に応じて更新や参照、削除などを行う。等々

スレッドを使ったケース

プロセス例のWEBサーバーソフトウェアを細かく分割すると

  • お客様のブラウザと直接HTTP通信を行うスレッド
  • お客様依頼内容を解析するスレッド
  • お客様依頼内容を保存するスレッド(データベースサーバと通信するスレッド) 等々

その他の極端な例としては実は皆さんお使いのPCやスマートフォンに搭載されているWindows OSやLinux OSなどのオペレーティングシステム(OS)もひとつの巨大プロセスです。
内部では本当にたくさんのスレッドで構成されています。

次回も引き続き、まだ3回目ですので実務で役に立ちそうな課題をご紹介したいと思います。

もし、何か興味がある課題がありましたら、コメント頂ければ検討させていただきます。

  • B!