本文へ移動

スレッド(コンピュータサイエンス)

スレッドは、プロセス内で独立して実行される命令列です。プログラム内のタスクを並行して実行し、プロセス資源を共有しますが、競合状態、デッドロック、データ破損を避けるための同期が必要です。

概要

スレッド(実行スレッドの略)は、同じプログラム内のほかの命令列とは独立してスケジューリングおよび実行できる、プログラムされた命令の単一の連なりである。スレッドにより、プログラムは作業を複数の同時実行単位へ分割できる。そのため、入出力、ユーザーインターフェースの描画、バックグラウンド計算、イベント処理を、相互に停止させることなく進められる。導入的な説明および一般的な定義については、スレッドを参照。

画像ギャラリー

1 画像

特性と構造

スレッドは通常、プロセス内に存在し、そのプロセスのメモリイメージ、ファイルディスクリプタ、その他の資源を共有する。一方で、プログラムカウンタ、レジスタ、スタックなど、それぞれ固有の実行コンテキストを維持する。この密接な関係により、スレッドは独立したプロセスと比べて比較的「軽量」である。通常、スレッドの生成や切替えに伴うオーバーヘッドは、オペレーティングシステムが管理する完全なプロセスで同じ操作を行う場合より小さい。スレッドは一般にスレッドIDで識別され、ユーザーレベル、カーネルレベル、または両者を組み合わせたハイブリッドモデルで実装される。

ライフサイクルとスケジューリング

スレッドのライフサイクルには、一般に準備完了、実行中、ブロック(待機中)、終了といった状態がある。オペレーティングシステムまたはユーザーレベルのランタイムは、利用可能なCPUコアへスレッドをスケジューリングする。複数のスレッドが同時に実行される場合、マルチコアハードウェア上では並列性が実現される。単一コア上で実行を交互に切り替える場合には、並行性または疑似並列性という効果が得られる。スケジューリング方針、優先度、タイムスライシングは、応答性とスループットに影響する。

同期と危険性

スレッドはメモリを共有するため、プログラマは競合状態や状態の不整合を避けるよう、共有データへのアクセスを調整しなければならない。代表的な同期プリミティブには、次のものがある。

  • ミューテックスとロック — 資源への排他的アクセスを強制する。
  • セマフォ — 数に限りのある資源のための計数機構。
  • 条件変数とモニタ — スレッド間の待機と通知に用いる。
  • リード・ライトロックとアトミック操作 — 性能が重視される場合に用いる。

適切な同期がなければ、スレッドはデッドロックやライブロックに陥ったり、再現が難しい微妙なバグを生じさせたりすることがある。

用途と例

スレッドは、サーバー、グラフィカルユーザーインターフェース、科学技術計算、リアルタイムシステムで広く用いられる。一般的なパターンには、タスクを処理するワーカープール、インターフェースの応答性を保つためのバックグラウンドI/Oスレッド、複数のCPUコアを活用する並列ループがある。プログラミング環境は、POSIXスレッド、言語レベルのスレッド(たとえばJavaスレッド)、ランタイムが管理する軽量な「グリーン」スレッドなどのスレッド抽象化を提供する。

歴史、区別と注目すべき事項

スレッドの概念は、オペレーティングシステムとハードウェアがマルチタスクおよびタイムシェアリングをサポートするのに伴って発展した。設計者は、コンテキスト切替えのコストを抑え、完全なプロセスより細粒度の並行性を可能にするため、スレッドを導入した。重要な区別として、ユーザーレベルとカーネルレベルのスレッドの違い、ならびに通信の容易さ(共有メモリ)と隔離性(別個のプロセス)とのトレードオフがある。プロセスとスレッドの対比についてはプロセスの資料を、オペレーティングシステムの文書についてはOSリソースを参照。スレッドプログラミングには慎重な設計が求められるが、適切に用いれば、性能、応答性、資源利用率を向上させる。

関連項目

著者

AlegsaOnline.com スレッド(コンピュータサイエンス)

URL: https://ja.alegsaonline.com/art/99622

共有