最初に
本記事は「スレッド」について少し掘り下げての解説記事となります。
プロセスについては→【小ネタ】プロセスってなんだろう?という話
並列処理・並行処理については→【小ネタ】並列処理とは何か?そして並列処理と並行処理の違いとは?
非同期については→Unity非同期完全に理解するための第一歩~非同期処理とは何か~
スレッドとは?
スレッドとはプロセス内に作られる並列処理を行うための仕組みであり、処理の単位です。
シングルスレッドなら1プロセスに1スレッド、マルチスレッドなら1プロセスで複数のスレッドが動作しています。ただしその実行管理(スケジューリング)はOS側で行います。
スレッドはプロセスに割り当てられたメモリを使用して動作しています。スレッド同士ではメモリを共有しているため、メモリの切り替えも含めたプロセスの切り替えに比べると、スレッドの切り替えは高速に動きます。ただし、メモリを共有しているということは、ほとんどのデータをスレッド同士で共有しているということで、同じ変数に対してスレッド同士が同時に値を書き換えようとする場合に開発者側が意図していない状況になることが殆どです。なので、マルチスレッドプログラムを開発するのであれば、このような問題が起きない(スレッドセーフ
)ようなプログラムを意識する必要があります。
また、共有メモリへのアクセス速度は、非共有メモリへのアクセスより何倍も遅くなります。
スレッドの使い方
ほとんどのOSがOS依存ライブラリでスレッドを用意します。ゲームエンジンなどでも基本的にはスレッドを用意できるAPIが提供されています。
スレッド制御用のAPIを使用することでスレッドの制御を開始、一時停止、終了を行わせることができます。またマルチスレッドであれば、全てのスレッドの処理が終わるまで待つこともできます。ただしスレッドをどのように実行させるかまでは制御できません。
ゲームエンジンでのスレッド
ゲームエンジンではマルチタスク処理の方法の一つとして、エンジンのサブシステム毎にスレッドを割り当てて実行する方法があるようです。この場合、メインスレッドではメインのゲームループを処理しつつ、サブシステムの処理をコントロールして同期させます。
このようなアーキテクチャは基本的に、プロセスが動作対象とするハードウェア上にある何らかのスレッドライブラリによってサポートされています。PS3ならSPURS、UnityやUE4で開発するならエンジン側でAPIを用意してくれています。
昔のスレッド
昔、スレッドは「ライトウェイトプロセス」とも呼ばれていました。由来はUNIXであり、もともとUNIXにはプロセスしかなく、並列処理を行うためには一つのプロセスから子プロセスを作成していました。しかしこれでは環境をコピーするコストが大幅にかかり、切り替え速度も遅いため、高速で切り替えが可能で軽量なプロセスとしてスレッドが導入されました。Windowsはこれに習い、プロセスとスレッドを導入しました。
参考
- イケてるエンジニアになろうシリーズ 〜メモリとプロセスとスレッド編〜
- 意味の違いがわかる? タスクとプロセスとスレッド
- ゲームエンジンアーキテクチャ(文献)