ショートカット
ファシリテーター × あり方
コーディングの向こう側
Hello, ANOTHER world!
オブジェクト指向のはなし
プログラミングのはなし
C言語実力診断クイズ
eSkillBooks
プログラミングのはなし

スレッドはプロセスじゃない!

今回は番外編として、ちょっと豆知識を。

スレッドとプロセスの違いを理解している人が意外と少ないようです。簡単に説明すると、

  • プロセスは固有のメモリ空間・固有のスタック上で動作する
  • スレッドは共有のメモリ空間・固有のスタック上で動作する

という違いがあります。プロセスは必ずシステムレベルでサポートされますが、スレッドはライブラリによるサポートも可能です(実際はどちらもシステムと密接に関連している場合が多いですが)。

別の見方では、システムが管理するそれぞれのプログラムが1つのプロセスであり、プロセスは並列実行されます。そして1つのプロセスのなかにある並列実行の単位をスレッドと呼びます。たとえば Macintosh や Windows ではワープロなどのアプリケーションが1つのプロセスとして実行され、そのなかのウィンドウがそれぞれ1つのスレッドになっている場合が多いようです。

プロセスもスレッドも並列実行されるため、スタックは固有のものをもっています。しかし、スレッドのメモリ空間はプロセス内で共有されています。そのため静的な変数は同じプロセスに属するすべてのスレッドから操作可能です(auto 変数はスタック上にとられるためスレッドに固有です)。

スレッドどうしが同じメモリ空間を共有しているということは、複数のスレッドから使用する変数の操作を慎重に行わなければならないことを意味しています。そこで、複数のスレッドが同時に実行できない領域を設定するという方法が用いられます。この領域を「クリティカル・セクション」といいます。これによって、あるスレッドが変数に書き込みをしている間は他のスレッドが同じ変数にアクセスできないようにします。

「クリティカル・セクション」による方法は、セマフォによる待ち合わせ処理によく似ています。UNIX の世界ではスレッドが用いられないですが、共有メモリとセマフォでスレッドと同様の機能が実現されています。

簡単に説明しましたが、もっと詳しく知りたい人は、良い専門書がいくつも出版されていますのでそちらを参照してください。マルチタスク OS が当たり前になってきたこのごろですが、並列処理はオブジェクト指向とともに今後ますます重要な基礎技術になっていくと思われます。今のうちに理解しておかないと!

というわけで、ちょっと豆知識でした。

(「プログラミングのはなし」は1998年1月から1999年1月にかけて作成されたコンテンツです。)