プログラムから見ると、スレッドを準備して起動してやれば、あとはスレッド自身で処理を進めてくれる。しかもプロセスを切り替えるのと違って、仮想メモリーなどの割り当てた資源を切り替える必要はないので、スレッド切り替えは高速だ。そのためスレッドはかつて、「ライトウェイトプロセス」とも呼ばれていた。
スレッドをなぜ「ライトウェイトプロセス」と呼ぶのかというと、かつてのUNIXが由来の話である。もともとUNIXではプロセスしかなく、並列処理を行なうためには、ひとつのプロセスから別のプロセスを作っていた。しかし、これには環境をコピーするコスト(メモリーと時間)がかかるため、コピーをせずに高速な起動が可能な軽量プロセスとしてスレッドが導入されたためである。Windowsはこれにならい、プロセスとスレッドを導入したわけだ。
スレッドはスレッド制御用のAPIを使って、一時停止させたり、終了させることも可能だ。また複数のスレッドを実行させて、すべてのスレッドの処理が終わるまで待つといったことも可能だ。ただし、スレッドをどう実行するかはカーネル側で制御されており、親スレッドからは止めたり、再開させるといった程度の制御しかできない。またスレッド自身も、実行を続けるか、割り込みがかかるまで止まるといった程度しかできない。
しかし実際には、もっと細かくスレッドの動作を制御したい場合がある。そのために用意されているのが、「ファイバ」と呼ばれる機能だ(図3)。
ファイバは自分自身で、「次にどのファイバを実行するのか」を指定できる。このようにすることで、どの処理をするのかを細かく制御できる。スレッドの切り替えと違うのは、ファイバはそれぞれの実行コンテキスト(CPUのレジスターなど)を持っているため、別のファイバに切り替えたあとで元のファイバに処理が戻ると、切り替えた直後の部分から処理を継続できる。
ちなみに、なぜ「ファイバ」(繊維)と呼ぶのかと言うと、スレッドには「糸」という意味があるためだ。「糸よりも小さな実行単位」という意味で、ファイバと呼ぶようになったようだ。
★
まとめると、「プロセス」はプログラムの実行イメージやCPU情報、管理情報を含んだ「プログラムの実行単位」のことだ。一方、「タスク」は「作業」「処理」といった意味合いで使われる言葉にすぎない。そして「スレッド」は、プロセス内に作られる並列動作可能な「処理の単位」である。違いがおわかりいただけただろうか?

この連載の記事
- 第13回 ARM版Windows 8実現の布石となったWindows 7の「MinWin」
- 第12回 アプリがWindowsの機能を使うには? APIとDLLの仕組み
- 第11回 マルチコアCPUの消費電力はスケジューリングで変わる?
- 第10回 AMD FX向けにパッチで修正 スケジューラーが抱える難題
- 第9回 マルチコアCPUを賢く使いこなす スケジューリングの秘密
- 第7回 Windowsのメモリー管理をx86の仕組みから読み解く
- 第6回 メモリー不足を根本的に解決する64bit OSの仕組み
- 第5回 Windows 8でMetro Styleアプリを動かす「WinRT」
- 第4回 Windowsを動かすデバイスドライバーの仕組み 前編
- 第3回 OSの仕事はハードウェアをアプリから「隠す」こと?
- この連載の一覧へ