マルチスレッドとオペレーティング システム

最近のオペレーティング システムでは、多数の異なるユーザーがプログラム (プロセス) を同時に実行できます。1 つの中央処理装置 (CPU) が搭載されたハードウェア システムでオペレーティング システムが動作する場合、厳密にはこれらのプロセスが同時に実行されるわけではありません。プロセスが同時に実行されているように見えるだけです。オペレーティング システムは CPU とその他のシステム リソースを必要なプロセスに割り当て、これらのリソースを実行中のプログラムから別のプログラムに (プリエンプティブ方式で) 切り替えます。このリソースの切替えにより、複数のプログラムが同時に実行されているように見えます。

最近の多数のオペレーティング システムでは、これと非常に良く似た方法により、各プロセス内で複数のスレッドを使用できます。ここでもまた、オペレーティング システムは CPU とさまざまなリソースを個別のスレッドに割り当て、これらのリソースの割り当てを実行中のスレッドから別のスレッドに切り替えます。この切替えにより、スレッドが同時に動作しているように見えます。

では、オペレーティング システムがプロセスとスレッドを同じように処理するのであれば、この 2 つをどのように区別するのでしょうか?

すべてのプロセスは、アドレス領域、オープン ファイル、他のシステム リソースを個別にもっています。そのため、同時に実行されている他のプロセスに対して与える影響を最小限、または影響がない状態で、各プロセスを実行できます。ただし、リソースを個別にもつことで、次のランタイム コストがかかります。

スレッドは 1 つのプロセス内で実行されるので、プロセスに関連するすべてのスレッドは、データおよびコードの同じアドレス領域、同じオープン ファイル、その他の大部分のリソースを共有します。また、各スレッドはそれぞれ固有のレジスタ セットとスタック領域をもっています。そのため、スレッドの作成には大量のシステム メモリは必要ありません。同じプロセス内のあるスレッドから別のスレッドに実行コンテキストを切り替えるときに、オペレーティング システムが行うことは CPU の所有権とレジスタ セットの切替えのみです。スレッドが「簡易プロセス」と呼ばれるのは、このためです。