Webエンジニアのブログ

マルチタスクやマルチスレッドは何かを説明する

もう忘れて調べるのを10回ぐらい繰り返しているので、そろそろ自分でアウトプットしておく。

マルチタスクとは

マルチタスクは、コンピュータにおいて複数のタスクを切り替えて実行できるシステムのことである。このタスクと呼ばれる実行単位には、プロセスやスレッドなどがある。タスクがプロセスの場合、そのマルチタスクはマルチプロセスと呼び、スレッドの場合はマルチスレッドと呼ぶことになる。

ひとつのプロセッサ(CPU)しかないコンピュータは、同時に1つのタスク(プロセスやスレッド)しか実行できない。しかし複数のタスクを数十ミリ秒といった短い時間で切り替えれば、あたかも複数のタスクを同時に実行しているかのように振る舞える。こういったマルチタスク機能を持ったOSをマルチタスクOSと呼んだりする。

Unix v6を始めとした、数々のUnix系OSはこのマルチタスク機能を備えている。タスクの切り替えによるオーバーヘッド(コンテキストスイッチ)は発生するが、ハードウェアの入出力待ちなどでタスクが止まっていても他のタスクが実行されるため、全体としてはスループットの上昇が期待できる。

プリエンティブ・ノンプリエンティブ

ここではタスクがどのように切り替えられるかについて説明する。タスクの切り替えには、一般的にハードウェアタイマ割り込みが用いられることが多い。ハードウェアタイマ割り込みとは、周辺デバイスなどから要求があった際に実行プロセスを中断し、要求に対する処理を行った後、プロセスを再開する仕組みのことである。ハードウェアタイマ割り込みによるタスクの切り替えを、プリエンプション(preemption, 横取り)と呼ぶ。

このプリエンプションを使ったマルチタスクを、プリエンティブなマルチタスクと呼ぶ。対照的に、各タスク自身が処理を終了して制御を戻すマルチタスク方式をノンプリエンティブなマルチタスク、または協調的マルチタスクと呼ぶ。

マルチスレッドとは

前述したとおり、マルチスレッドとは複数のスレッドを切り替えて実行できるシステムのことを指す。このスレッドには、ユーザースレッドとカーネルスレッドの2つに区別される。

まずカーネルスレッドとは、カーネル空間(OSのカーネルが存在する仮想メモリ領域)で実装されたスレッド機構のことである。カーネルスレッドの切り替えはカーネルが行い、複数のプロセッサがあれば並列処理が可能になる。しかしカーネルスレッドの実体は、ユーザー空間などを共有したプロセスであるため、コンテキストスイッチなどのオーバヘッドはプロセスとほぼ同じである。

ユーザースレッドは、ユーザ空間で実装されたスレッド機構のことである。特に仮想マシン上で動くものをグリーンスレッドと呼ぶ。ユーザースレッドのスケジューリングは、ユーザ空間にあるスレッドスケジューラが行う。ユーザ空間内でスレッドを切り替えるため、非常にオーバヘッドが小さい。しかしひとつのプロセス内にある複数のスレッドは、常に1つだけしか動作しないことになり、マルチプロセスの恩恵を受けることができない。

まとめ

  • マルチタスクは、複数のタスクを切り替えて実行できるシステムのこと
  • タスクがプロセスを指す場合はマルチプロセス、タスクを指す場合はマルチタスクと呼ぶ
  • スレッドにはカーネル空間で実装されたものと、ユーザ空間で実装されたものがある

{ "name": "hareku", "job": "Software Engineer" }