スポンサーリンク
OS

【OS】スレッド

スレッドとは?

UNIXなどのプロセスは、プロセスごとに別々のメモリ空間を持っているために、以下のような場合にオーバーヘッドが大きくなる。

プロセス作成時にアドレス空間の生成が必要
アドレス空間が別なため、プロセス間でメモリを経由して簡単にデータを渡すことができない。

これらの問題を解決するために1つのプロセスのなかに、さらに複数の制御を持てるようにする。

シングルスレッドプロセスとマルチスレッドプロセス

シングルスレッドプロセス

マルチスレッドプロセス

利点

応用性

プロセスの一部がブロックされた場合に実行を継続できる場合がある。特にユーザーインターフェースによって重要である

リソース共有

スレッドはプロセスのリソースを共有する。共有メモリやメッセージの受け渡しよりも簡単

経済性

プロセスの作成よりもスレッドの作成の方が安価。スレッドの切り替えはプロセスの切り替えよりもオーバーヘッド(余計な負荷)が少ない

スケーラビリティー

システムの利用や負荷の増大、用途の拡大などに応じて、どれだけ柔軟に性能や機能を向上、拡張できるかを表したもの。ソフトウェアの場合は、小規模な機器やシステムから大規模な者まで同じソフトで対応できることを意味する場合もある。

マルチコアプログラミング

並列性(Parallelism)

システムが複数のタスクを同時に実行できることを意味する

データの並列処理

複数のコアに同じデータのサブセットを分散し、各コアで同じ操作を行う。

タスクの並列処理

コア間ですれどを分散し、各スレッドを分散し独自の操作を実行する

アムダールの法則

並列処理でどういう時にどのようにパフォーマンスが上がるか

speedup \leq \frac{1}{S+\frac{(1-S)}{N}}
S:シリアル部分
N:処理するコア数

Nが無限大に近づいた時スピードアップは\frac{1}{S}になる

並行性(Concurrency)

複数のタスクの進行をサポートする

ユーザースレッドとカーネルスレッド

ユーザースレッド

ユーザーレベルのスレッドライブラリによる管理

・主要なスレッドライブラリ
POSIX Pthreads
Windows threads
java threads

カーネルスレッド

カーネルでサポート

Windows
Linux
Mac OS X
iOS
Android

マルチスレッドモデル

一対多

単一のカーネルスレッドにマップされた多くのユーザーレベルのスレッド

1つのスレッドをブロックすると、全てがブロックされる

マルチコアシステムでは、カーネルは一度にいつだけであるため、複数のスレッドが並行して実行されない場合がある。

一対一

各ユーザーレベルのスレッドはカーネルスレッドにマップする

ユーザーレベルのスレッドを作成すると、カーネルスレッドが作成される

一対多よりも並行性が高い

多対多

多くのユーザーレベルのスレッドを多くのカーネルスレッドにマップできる。

OSが十分な数のカーネルスレッドを作成できるようにする

Two-level Model

多対多に似ているがユーザースレッドをカーネルスレッドにバインドできる点が異なる

スレッドライブラリ

スレッドライブラリは、スレッドを作成および管理するためのAPIをプログラマに提供する。

Pthread(POSIX thread)

ユーザーレベルとカーネルレベルとして提供される。

C言語でスレッドプログラミングをするときに使用されるCライブラリです。

Java Threads

JavaスレッドはJVM(Java virtual machine)によって管理される。

 

暗黙的なスレッド化

スレッドの数が増えるにつれて人気高まり、明示的なスレッドではプログラムの正確性がより難しくなる

Thread Pools

作業割り当てを待つプールに多数のスレッドを作成する

メリット

新しいスレッドを作成するよりも既存のスレッドでリクエストを処理する方がわずかに速い

アプリケーションのスレッド数をプールのサイズにバインドできます

 

Fork-Join

複数のスレッド(タスク)が分岐され結合される

OpenMP

並列計算機環境において共有メモリ・マルチスレッド型の並列アプリケーションソフトウェア開発をサポートするために標準化されたAPIである

 

Grand Central Dispatch

serial

ブロックはFIFO順に削除される。キューはプロセスごとにある。

concurrent

FIFO順で削除される。同時に複数の削除が可能

Intel Threading Building Blocks(TBB)

C++の並列プログラムを設計するためのテンプレートライブラリ

スレッドの問題

fork()とexec()の問題

fork()は、呼び出したスレッドを複製するか、全てのスレッドを複製するか →fork()には2種類ある

exec() usually works as normal – replace the running process including all threads

シグナル処理

シグナルは、特定のイベントが発生したことをプロセスに通知するために使用される

シグナルハンドラ

シグナルハンドラはシグナルを処理する

シグナルハンドラは、デフォルトとユーザーが定義したものがある
ユーザーがシグナルハンドラを定義する場合、デフォルトのシグナルハンドラを上書きする

シグナルはプロセスに伝達される

 

スレッドキャンセル

ターゲットスレッド:キャンセルされるスレッドのこと

非同期キャンセル

ターゲットスレッドをすぐに終了する

遅延キャンセル

ターゲットスレッドは定期的にキャンセルするべきかどうかをチェックする

どのようにキャンセルするか

スレッドキャンセルは、スレッドの状態に依存する。

スレッドのキャンセルが無効になっている時は、有効になるまでキャンセルは保留される。

スレッドがキャンセルポイントに到達した時のみキャンセルされる。

 

スレッドローカルストレージ(TLS)

TLSにより各スレッドは独自のデータのコピーを持つことができる。

 

スケジューラアクティベイション

多対多モデルとTwo-level Modelの両方においては、アプリケーションに割り当てられた適切な数のカーネルスレッドを維持するために通信が必要です。

Lightweight Process (LWP)

ユーザースレッドとカーネルスレッドの間で中間データ構造を使用する
この通信により、アプリケーションは正しい数のカーネルスレッドを維持できる。

スポンサーリンク