スレッド_(コンピュータ)
[Wikipedia|▼Menu]
ライトウェイトプロセス(light-weight process、LWP)または軽量プロセスとは、スレッドを複数並行して実行するためのカーネル内の機構。マルチプロセッシングにおいて、ひとつのプロセス内のスレッドを複数個同時に実行する仕組みである。カーネルスレッドとLWPを総称してネイティブスレッドと呼ぶこともある。

LWPは上述の2つの方式を組み合わせたもので、SolarisSVR4.2MPで導入されたスレッド機構である。プログラミング上いくつでもスレッドを生成できるとしても、並列実行できるのはプロセッサ数までである。従って、カーネルスレッド方式のように全スレッドをカーネルが制御するのは無駄が大きい。そこでカーネルはLWPというスレッドを実行するオブジェクトを管理し、LWPが適当なユーザースレッドを選択して実行する。LWPの個数はプロセス当たりの上限(全プロセッサ数+α)が設定されているため無駄が少なくなり、ユーザースレッドはメモリなどが許す限り生成可能となる。また、ユーザースレッド間の切り替えをユーザー空間で行うため、オーバーヘッドはユーザースレッドとカーネルスレッドの中間になる。

LWPはCライブラリ内でスレッド作成の延長で必要に応じて作成される。Cライブラリ内のスレッドスケジューラが、ユーザースレッドとLWPのマッピングを行う。このマッピングを指して、LWP方式を「M対Nスレッド」と呼ぶことがある。つまり、ユーザープロセス内のM個のスレッドとカーネル内のN個のLWPがマッピングを切り換えながら実行されることを意味している。

カーネルはLWPに関するシステムコールを提供しており、Cライブラリがそれを使用する(ユーザーにも公開されているが、一般に直接使うことはほとんどない)。LWPはコンテキストスイッチの対象として扱われるため、LWP方式のオペレーティングシステムではプロセス制御ブロックの一部がLWP毎のデータ構造になっている。

また、LWPとユーザースレッドを固定的に結びつけることもでき、これを「結合スレッド」と呼ぶ(一般のスレッドは「非結合スレッド」)。
ユーザーインターフェイススレッド詳細は「ユーザーインターフェイススレッド」を参照

グラフィカルユーザインタフェースにおいては、デッドロックにまつわる複雑さを回避するためUIを操作するスレッドを1つに統一し、その上でワーカーデザインパターンを採用するという手法がよく採用される。
ライトウェイトスレッド

ライトウェイトスレッド(light-weight thread)または軽量スレッドとは、ユーザープロセス空間内で、疑似的にスレッディング動作を行わせることができる概念である。通常のスレッドと区別する場合に「論理スレッド」と呼ぶ場合がある。

ライトウェイトプロセスとは異なり、スタックなどに退避されている「スレッドコンテキスト情報」の、暗黙の切り替えは行われない場合がある。また、タイムスライスによる論理スレッドの切り替えが起きず、任意のタイミング(例:APIの呼び出し時)にのみ、論理スレッドが切り替わる。完全にユーザープロセス空間内で実現され、一般的に論理スレッドコンテキストの情報量は小さいため、論理スレッド切り替えのオーバーヘッドは非常に小さい。

ライトウェイトスレッドとして分類される機構として、コルーチンや、C#/VB.NETなどの.NET言語におけるイテレータブロックが挙げられる。
スレッドライブラリ

C言語C++といった初期のプログラミング言語においては、スレッドは当初言語仕様では標準サポートされていなかった。そのため、例えばMicrosoft WindowsではWindows APIのスレッド、POSIX準拠OSではPOSIXスレッド (Pthreads) といったように、プラットフォーム固有のAPIを利用する必要があった。Java.NET Framework/.NET Coreに代表されるように、現代的なほとんどの後発言語およびプラットフォームではスレッドを標準的にサポートしている。

C++11規格ではBoost C++ライブラリをベースとしたスレッドライブラリが標準化された。C11規格でもスレッドライブラリが標準として定義されたが、実装は任意であり必須ではない[7]
スレッドの暗黙的利用

マルチスレッドのプログラミングは前述のように、シングルスレッド前提のプログラミングと比べて難易度が高い。マルチスレッドの動作は非決定論的であり、慎重にプログラミングしなければ、タイミングによって発生したりしなかったりする厄介な異常動作や不具合を引き起こすこともある。マルチスレッド環境におけるバグは、しばしば原因特定が困難となる。

一般的なアプリケーションプログラミングでは、スレッドを明示的に起動して利用することは少ない。代わりに、並列処理や並行処理のバックエンドとしてスレッドを暗黙的に利用する、上位レベルのAPIを利用することが多い。例としてOpenMPや、.NETのタスク並列ライブラリ(英語版) (TPL) などが挙げられる。Future パターンをサポートするプログラミング環境では、並行処理の実行にスレッドを利用するが、煩雑なスレッドの操作をほとんど意識することなく並行処理を効率的に記述することができる。また、これらはAPI呼び出しのたびにスレッドを起動/終了するのではなく、あらかじめいくつかのスレッドを起動しておいて再利用することのできるスレッドプールを内部で使用していることが多い。上位レベルのAPIを利用することで、オーバーヘッドを低減し、また実行環境のハードウェア構成を意識することなく、環境に適した数のスレッドを活用することが可能となる。しかし、スレッドを暗黙利用する場合でも、共有資源に複数のスレッドから同時アクセスする場合の排他制御などに関しては、依然として配慮が必要であることが多い。
脚注[脚注の使い方]
注釈^ 古いアーキテクチャや組み込み環境では、複数のプロセスがメモリ空間を共有しているシステムもある。例えばWin16などが挙げられる。
^ 例えば32ビット版のMicrosoft Windowsでは、個々のスレッドに割り当てられるスタックサイズが既定で1MiBとなっており、そのため1プロセスが生成できるスレッドの最大数(理論上限値)は既定で2,048までとなっている[4][5][6]。64ビット版Windowsでは理論上限値は緩和されるが、実際に生成可能なスレッドの数は物理メモリの搭載量に左右されることに変わりはない。

出典^ “スレッドとは - IT用語辞典”. IT用語辞典 e-Words. 2022年6月15日閲覧。
^ マルチスレッドの基本概念 (マルチスレッドのプログラミング) 。


次ページ
記事の検索
おまかせリスト
▼オプションを表示
ブックマーク登録
mixiチェック!
Twitterに投稿
オプション/リンク一覧
話題のニュース
列車運行情報
暇つぶしWikipedia

Size:38 KB
出典: フリー百科事典『ウィキペディア(Wikipedia)
担当:undef