スレッド【オペレーティングシステム】

目次

スレッド

スレッドとは

プロセスは生成・消滅、コンテキストスイッチなどの操作に時間がかかります。これらはプロセスを処理するという本質的には関係ないオーバーヘッド処理になります。

これらの操作を高速化し、効率的にシステムリソースを活用するために、多くのオペレーティングシステムには スレッド(あるいは 軽量(ライトウェイト)プロセス)と呼ばれる仕組みが搭載されています。

スレッドとは、プログラムの中で 実行の流れ を表す最小の単位です。1つのプログラム(プロセス)は 1つ以上のスレッド を持つことができます。

別の言い方をすると、スレッドはプロセス内で実行される処理の単位ということになります。

具体例

スレッドはプログラムの実行単位のことですが、より具体的にはプロセスの中で独立して動作する最小の処理単位を指します。
一つのプログラムは、複数のスレッドを使って同時に複数の処理を並行して実行できます。

具体例:動画再生アプリ
例えば、動画再生アプリを考えてみましょう。
このアプリは以下のような処理を同時に行います。

  • 映像のデコード:圧縮された動画データを解凍して再生可能な形式に変換
  • 音声のデコード:映像と同期するための音声データの解凍
  • 字幕の表示:映像に合わせて字幕を表示
  • ユーザー入力の処理:一時停止や早送りなどの操作を受け付ける

この場合、1つのプログラム(プロセス)の中に、以下のような複数のスレッドが存在します。

  • スレッドA:映像をデコードして画面に表示
  • スレッドB:音声をデコードしてスピーカーに出力
  • スレッドC:字幕ファイルを読み込み、映像に同期して表示
  • スレッドD:ユーザーからの入力を監視して、再生や一時停止を処理

各スレッドは独立して並行に動作しながらも、映像・音声・字幕をうまく同期させるように協調しています。

スレッドの概念

スレッドは レジスタ と スタック を持ち、これらはスレッドごとに独立しています。一方で、コード、データ領域、ヒープ、ファイルディスクリプタ などのメモリ空間は、同じプロセス内のスレッド間で共有されます。

マルチスレッドの仕組み

マルチスレッド

一つのプロセスには以下の図のように一つ以上のスレッドを持つことができます。

プロセスでは、プログラムを実行するときに、今まさに実行している プログラムカウンタ(注目している機械語命令の位置)は 1つ しか存在しません。

一方、スレッドを利用すると、1つのプロセスの中で 複数のプログラムカウンタ が存在することになります。それぞれのスレッドが独自に実行の流れを持ち、CPUによって適切にスケジューリングされ、並行して実行されるように見えます。

また、マルチスレッド環境では、以下のような利点があります。

  • 応答性の向上
    UIスレッドとは別にバックグラウンドスレッドで処理を行うことで、ユーザー操作への応答性を維持できます。
  • リソースの有効活用
    マルチコアCPUを効率的に利用して、複数の処理を同時に進められます。
  • タスクの分割
    計算量の多い処理を複数のスレッドに分散することで、全体の処理時間を短縮できます。

スレッドコンテキスト

1つのプロセス内に複数のスレッドが存在する場合、CPUは実行するスレッドを切り替えながら処理を行います。このとき、スレッドを切り替える際には、スレッドコンテキストを退避したうえで、次のスレッドに切り替えます。

スレッドコンテキストは、プロセスコンテキストに比べて保持する情報が少なく、退避に伴うオーバーヘッドが少ないため、切り替えが高速に行われます。以下に、それぞれのコンテキストに含まれる要素を比較した表を示します。

項目スレッドコンテキストプロセスコンテキスト
プロセッサ状態
コンディション
プログラムカウンタ
汎用レジスタ
メモリイメージプロセス領域の一部(ヒープ、スタック)プロセス領域の全体(コード、データ、ヒープ、スタック)
メインメモリの管理情報
割り込みの優先度
  • プロセッサ状態: 現在のCPUの状態を表します。
  • コンディション: プログラムの分岐条件などに関わるフラグです。
  • プログラムカウンタ: 実行中の命令のアドレスを指します。
  • 汎用レジスタ: データやアドレスを一時的に保存するCPUのレジスタです。
  • メモリイメージ: プログラムの実行に必要なコードやデータのメモリ上の状態です。
  • メインメモリの管理情報: 仮想メモリやページテーブルの管理情報です。
  • 割り込みの優先度: 割り込み発生時にどの処理を優先するかを決める情報です。

スレッドの実現方法

スレッドの実現方法としては、従来のプロセスの中に 複数の実行単位であるスレッドを定義 できるようにしたものが一般的です。

スレッドは カーネルレベル と ユーザレベル のどちらでも実現可能です。それぞれの特徴について詳しく見ていきましょう。

カーネルレベル

カーネルレベルスレッドは、従来のプロセスと同様に カーネルがスレッドを管理 し、

  • スケジューリング
  • スレッド間の同期
  • スレッド間の通信

などを行う方式です。

特徴

  • カーネルが直接スレッドを管理するため、システム全体のスレッド状況を把握しやすい。
  • 複数のCPUコアを使う マルチプロセッサ環境 に適している。

デメリット

  • スレッド管理には カーネルモードへの切り替え が必要で、これに伴う オーバーヘッド が発生します。
  • スレッドのスケジューリングや切り替え処理も カーネルモード で行われるため、実行効率が低下する可能性があります。
  • スレッドコンテキストは カーネルのアドレス空間 に保持されるため、切り替えが重くなることがあります。

ユーザレベル

ユーザレベルスレッドは、アプリケーションのユーザ空間で ライブラリやランタイム を用いてスレッドを実現する方法です。

特に コルーチン を使って実装されることが多く、以下のように簡単な方法でスレッドを切り替えられます。

  • 切り替え時に プログラムカウンタ や スタックポインタ などのレジスタを退避・回復。
  • 各コルーチンに専用の スタック を割り当てる。

比較

項目カーネルレベルスレッドユーザレベルスレッド
管理主体カーネルユーザ空間のライブラリやランタイム
オーバーヘッド高い(カーネルモード切り替えが必要)低い(ユーザ空間で処理)
スケジューリングカーネルによる自動スケジューリングアプリケーション側で制御
CPUコアの利用複数のコアを利用可能1つのコアに限定されることが多い
入出力時の挙動入出力中でも他のスレッドが実行可能入出力待ちで全スレッドが停止する可能性
プリエンプションありなし(協調的切り替えのみ)
用途マルチプロセッサや高負荷環境軽量な並列処理やリアルタイム性が求められない環境
実装の複雑さ比較的複雑シンプル

スレッドの利用場面

サーバサイドの応答性向上

サーバプログラムを マルチスレッド のプロセスとして構成することで、クライアントの要求に対する 応答性を向上 させることができます。

これは、クライアントからサーバへの要求が発生するたびに、

  • その要求に対応する 新しいスレッド を生成
  • クライアントの要求処理と結果の応答を スレッドに委任

することで実現されます。

この方法を使えば、サーバは スレッドを生成した後、即座に次のクライアントの要求を受け付ける ことが可能になります。これにより、複数のクライアントからの要求を同時に処理でき、システム全体のスループットが向上します。

CPU処理と入出力処理のオーバーラップ

入出力要求は、一般的に同期的に行われます。つまり、入出力が完了するまで処理を待つ必要があるということです。

しかし、このような場合でも入出力要求ごとにスレッドを割り当てる ことで、次のようなメリットがあります。

  • 入出力を要求したスレッドは 待機状態 となり、入出力の完了を待つだけでよい。
  • 他のスレッド は、入出力完了を待つことなく 自分の処理を継続 できる。

入出力が完了すると、待機状態のスレッドに対して通知が行われ、処理が再開されます。

この仕組みは ネットワークサービスやリモートプロシージャコール(RPC) など、外部通信を伴う処理でも有効です。スレッドを活用することで、CPUのアイドル時間を減らし、システム全体の効率を向上させることができます。

具体例

入出力処理の完了を待つ必要がある場合、

  • 入出力が完了するまでスレッドはブロック状態になります。
  • 入出力が終了したら、何らかの方法で 親スレッドに通知 します。

入出力専門のスレッドを用意し、その他の処理を行うスレッドと並行して実行すると、

  • CPUの使用率を向上させることが可能です。

並列アルゴリズムの表現

並列に動作可能なアルゴリズム をスレッドを利用して実現することで、処理効率を向上させることができます。

ただし、すべてのアルゴリズムが並列処理によって効率化できるわけではないことに注意が必要です。

スレッドの分割によって処理を並列化できますが、

  • 分割の手間 や オーバーヘッドが発生します。
  • CPUが1つの場合 には、かえって処理が遅くなる可能性があります。
  • 一方で、複数のCPU がある場合には、スレッドによる並列化で大幅な性能向上が期待できます。

まとめ

本記事では、スレッドについて解説しました。スレッドはプロセスに包含される概念で、どのようなもので構成されているのかを解説しました。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次