• 掲示板におけるスレッド

スレッドとは。掲示板の構成要素のこと。トピックとも言われる。
スレッドは掲示板に特定のテーマを持つ小さな掲示板のようなものである。
扱う話題が多岐に渡る場合や人数の多い大きな掲示板では、話題が散漫になりがちで、議論が進行しなくなることがなくもない。


  • コンピュータにおけるスレッド

スレッドとは、軽量プロセスと呼ばれる実行の主体。


  • スレッドとプロセスとマルチタスク

WindowsなどのOSは、一つのCPUであっても同時に複数のソフトウエアが動作するように設計されている。
単一のCPUでも複数のソフトウエアを同時に利用可能なOSをマルチタスクOSと呼ぶ。
現在、一般的となったパーソナルコンピュータ用OSはマルチタスクOSである。

プログラムが実行される時、必ず一つのプロセスとしてコンピュータ上で実行される。OSからは
一つのプロセスとして認識され、この時、プログラムの実行単位はプロセスと呼ぶ。
プロセスは実行とアプリケーションが一つに結びついている。
OS上で複数のアプリケーションが起動している際にも、プロセスと呼び、一つ一つの実行単位を区別している。
Notepadやブラウザを起動すると、二つのアプリケーションはそれぞれ二つのプロセスとして認識されている。

スレッドは、プロセスの中で動作する、さらに小さい実行単位で、軽量プロセスとも呼ばれる単位である。
一つのアプリケーションの中で、さらに小さなプロセス実行単位が起動しているようなものだ。
ブラウザという一つのアプリケーション内部で、さらに小さなプロセスが起動している状態である。


  • プロセスとスレッドの違い

  1. それぞれのプロセスは基本的に独立しているが、スレッドは一つの起動中プロセスのサブシステムである。
  2. 複プロセスはアドレス空間が独立しているが、スレッド群は一つのプロセス内でアドレス空間を共有している。
  3. スレッドはメモリや実行状態を共有するが、プロセスはそれぞれのプロセスが別として維持される。


  • 歴史

スレッドという概念は、軽量プロセスという考え方から発生している。スレッド、軽量プロセス
機能はUNIXと呼ばれるOSが始めて実装した。

単一CPUでの並行処理は、マルチタスクOSではない場合、割り込み処理を利用した例が多い。
例えば、古い時代の8/16bitコンピュータでは、OSとよばれるソフトウエアがそもそも存在しない為、並行実行が難しい。
そのため、古い時代のコンピュータでは、タイマーと割り込みによって、並行処理を行っていた。
現在でも規模の小さな組み込み小型マイコン上のソフトウエアでは、割り込みによって並行処理を行っているものがある。
旧式BASICでも、この種の割り込みを実装した命令が存在した。

近年のパーソナルコンピュータでは、OSはマルチタスク機能を保有しており、プログラム実行はカーネルがスケジュールする。
高機能なカーネルOS上では割り込みなどの処理を用いて並行処理をする事は最適とは言えず、
OSスケジューラを介するスレッド切り替えが安全である。
プログラム内でコプロセス等が並行処理する場合、別プロセスを起動すると大げさ過ぎる場合もある。
そうした割り込みコンカレンシー的な用途の際に、スレッドは用いることが出来る。


  • スレッドの実装

スレッドと呼ばれる概念には、幾つか異なる実装がある。

  1. ユーザーレベルスレッド(N:1)
  2. カーネルレベルスレッド(1:1)
  3. ハイブリッドスレッド(N:M)

ユーザーレベルスレッドの典型的な例は、PerlやJava、Rubyなどの上で動作するスレッドである。
最新のバージョンでは異なるものの、過去の実装では、一つのRubyVMプロセス上で、擬似的に
スレッドを実装していた。これは、言語上でのスレッドなのでデュアルコアCPU上では、
複数のスレッドが各CPUに割り当てられない。一つのプロセスが複数のスレッドを切り替えて処理し、
アプリケーションプログラム内で切り替える擬似的なスレッドである。OSの関与は無い。
これは多くの言語が異なるマシン間での互換性維持の為に利用しているもので、abのver2系の古い
インタプリタにも該当する。
現在の最新のJavaやRubyバージョンでは、各言語のスレッドは、ネイティブ(カーネル)スレッドにマッピングされる。

カーネルスレッドとは、OSのカーネルによってスケジュールされるスレッドである。
典型的な例はCライブラリで実装されているスレッドで、殆どのOSで動作するネイティブスレッドが該当する。
多くのスレッドはOSカーネルによってスケジュールされるので、近年のように、多くの
CPUを搭載するマシン上では、複数のスレッドは複数のCPUに対応する。
複数あるスレッドのうち、一つのスレッドが一つのCPUに割り当てられるのでマルチスレッディング
されたアプリケーションはデュアルコアマシン等では処理速度が向上する。
1CPUであった場合、ユーザーレベルスレッドとカーネルスレッドの差は、スケジューラがOSなのか
アプリケーション側にあるかの違いだけで、実行自体には変わりは無い。

その他、スレッドに似た概念として、日本ではあまり知られていないが、"ファイバ"という概念も存在する。
これらはWin32APIにも含まれている。またUNIXなどでも利用出来、SymbianOSではファイバ
を参考としたActiveSchedulerが存在する。


  • Java/.NETのクラスライブラリのスレッド

java/.netなどでは、スレッドという概念を持っており、スレッドを利用する場合はThreadクラス
を利用する事で可能である。この点はC/C++で動作するOSネイティブなスレッドライブラリとは違いがある。
当然、ab上でWin32APIのスレッドを使ったり、pthread等を使う場合とjavaとでは概念は同じでも
実装が異なるので利用方法が違う。

C/C++等でスレッドを使う場合と、java/.net等クラスライブラリのスレッドでは、同じ概念でも呼び方や
実装が異なる。例えばCでのスレッド利用では、スレッド間の同期やロックの用語は、
OSやカーネルに近い呼び方をし、機能もOS機能やライブラリに深く関係する。
ab上でWin32APIのスレッドを使う場合にも当てはまる。

これとは対照的に、java/.net等では、OS用語などを用いない。クラスライブラリにThreadが含まれ、ある程度は言語仕様
に含まれる。またライブラリは予めスレッドセーフを考慮したり、スレッド間の同期やロック等などの
概念はOSの概念とは別にクラスに予め機能が備わっていたり、スレッドの為のより高機能なライブラリが実装され、
利用可能であったりするので、
OSやカーネルで用いる表現よりも、クラスで構成されている分、独自の表現を使う事がある。

javaのスレッドは、初期にはユーザースレッドとして実装されていた。これはVirtualMachine上で
動作するスレッドで、互換性の為に、擬似スレッドとして実装されていた為である。
近年では、javaのスレッドはカーネルスレッドにマッピングされて実行されるようになっている。

Javaでは機種依存をVMが吸収する。javaや.net自体、OSで動作するサブシステムなので、機能は
OSネイティブなライブラリをラッピングしている点に注意が必要だ。


  • マルチスレッドの背景


世界のコンピュータがマルチコアに向かっている背景には、単一CPUの動作限界が挙げられる。
処理速度、クロック、消費電力、の限界に対しては複数のCPUを用いる並列処理が有効
となり、今後のコンピュータの基本構造となっていく事が予測されている。
マルチスレッドを利用する要因の一つとなっている。