コンピューティングにおけるマルチスレッド
マルチスレッドは、コンピュータプログラムが複数の制御スレッドを並行して実行する技法であり、応答性とスループットを向上させる一方、同期とスケジューリングの課題を伴う。
概要
マルチスレッドは、単一のコンピュータプロセス内に、複数のスレッド(プログラムされた命令の独立した実行系列)を含める実行モデルである。各スレッドはランタイムまたはオペレーティングシステムによって個別に管理・スケジューリングできる。このため、1つのプログラムは、バックグラウンドでデータを処理しながらユーザー入力を扱う、といった複数の作業を同時に実行できる。ハードウェアとスケジューラの動作に応じて、スレッドは真に並列に実行される場合も、1個以上のプロセッサ上で交互に実行される場合もある。
主な特性
スレッドは通常、プロセスのメモリとリソースを共有する一方、それぞれ固有のコールスタックとレジスタを保持する。主な特性には次のものがある。
- 軽量な実行:一般に、スレッドの作成と切り替えは、別個のプロセスを作成するより低コストである。
- 共有状態:スレッドは同じデータにアクセスできるため通信が容易になるが、協調が必要となる。
- スケジューリング:スレッドはユーザー空間(ユーザースレッド)でスケジューリングされる場合と、カーネル(カーネルスレッド)によってスケジューリングされる場合がある。実装はプラットフォームや言語ランタイムによって異なる。
用途と例
マルチスレッドは、応答性とスループットの向上のために広く用いられる。典型例としては、同時接続を処理するWebサーバー、I/O処理中もインターフェースの応答性を維持するグラフィカルアプリケーション、独立した作業を並列化する科学計算やデータ処理のコードがある。多くのライブラリは、ワーカースレッドの集合を効率的に管理するため、スレッドプールやタスクスケジューラを提供している。
課題と区別
並行性は、明示的に対処すべき危険をもたらす。代表的な問題には、競合状態、デッドロック、ライブロック、優先度逆転がある。共有データを保護するために、ミューテックス、条件変数、セマフォ、アトミック操作などの同期プリミティブが使われる。マルチスレッドとマルチプロセッシングを区別することも重要である。スレッドはプロセス内のアドレス空間を共有するのに対し、別個のプロセスはメッセージパッシングまたはOSが提供する機構を通じて通信する。
歴史とエコシステム
スレッドのサポートは、オペレーティングシステムと言語にまたがって発展してきた。POSIXスレッドなどの従来のAPIは、スレッドオブジェクト、タスク、非同期フレームワークなど、管理ランタイムにおける高水準の抽象化と併存している。環境によっては、ユーザー空間で実装される協調的な「グリーン」スレッドも使用される。適切なモデルを選ぶには、性能、安全性、並行動作を推論する容易さのバランスを取る必要がある。
さらに詳しい背景については、オペレーティングシステムの概念および並行プログラミングに関する一般的な資料を参照。
関連項目
著者
AlegsaOnline.com コンピューティングにおけるマルチスレッド Leandro Alegsa
URL: https://ja.alegsaonline.com/art/67492