スレッド_(コンピュータ)
[Wikipedia|▼Menu]
.mw-parser-output .ambox{border:1px solid #a2a9b1;border-left:10px solid #36c;background-color:#fbfbfb;box-sizing:border-box}.mw-parser-output .ambox+link+.ambox,.mw-parser-output .ambox+link+style+.ambox,.mw-parser-output .ambox+link+link+.ambox,.mw-parser-output .ambox+.mw-empty-elt+link+.ambox,.mw-parser-output .ambox+.mw-empty-elt+link+style+.ambox,.mw-parser-output .ambox+.mw-empty-elt+link+link+.ambox{margin-top:-1px}html body.mediawiki .mw-parser-output .ambox.mbox-small-left{margin:4px 1em 4px 0;overflow:hidden;width:238px;border-collapse:collapse;font-size:88%;line-height:1.25em}.mw-parser-output .ambox-speedy{border-left:10px solid #b32424;background-color:#fee7e6}.mw-parser-output .ambox-delete{border-left:10px solid #b32424}.mw-parser-output .ambox-content{border-left:10px solid #f28500}.mw-parser-output .ambox-style{border-left:10px solid #fc3}.mw-parser-output .ambox-move{border-left:10px solid #9932cc}.mw-parser-output .ambox-protection{border-left:10px solid #a2a9b1}.mw-parser-output .ambox .mbox-text{border:none;padding:0.25em 0.5em;width:100%;font-size:90%}.mw-parser-output .ambox .mbox-image{border:none;padding:2px 0 2px 0.5em;text-align:center}.mw-parser-output .ambox .mbox-imageright{border:none;padding:2px 0.5em 2px 0;text-align:center}.mw-parser-output .ambox .mbox-empty-cell{border:none;padding:0;width:1px}.mw-parser-output .ambox .mbox-image-div{width:52px}html.client-js body.skin-minerva .mw-parser-output .mbox-text-span{margin-left:23px!important}@media(min-width:720px){.mw-parser-output .ambox{margin:0 10%}}

この記事は検証可能参考文献や出典が全く示されていないか、不十分です。出典を追加して記事の信頼性向上にご協力ください。(このテンプレートの使い方
出典検索?: "スレッド" コンピュータ ? ニュース ・ 書籍 ・ スカラー ・ CiNii ・ J-STAGE ・ NDL ・ dlib.jp ・ ジャパンサーチ ・ TWL(2017年5月)

スレッド(thread)とは、コンピュータプログラムにおいて特定の処理を行うための一貫性のある命令の流れのことであり、プロセッサ利用の最小単位[1]プロセスは少なくとも1つ以上のスレッドを含む。一般的に各プロセスには独立した仮想アドレス空間が割り当てられるが、プロセス内のスレッド群はアドレス空間を共有する。そのためプログラムを実行するときのコンテキスト情報が最小で済み、同じプロセス内でスレッドを切り替える際はアドレス空間の切り替えが不要となるので、切り替えが高速になる[2]。スレッドは、thread of execution(実行の脈絡)という言葉を省略したものである。複数のスレッドを生成して個々に処理を割り当てて実行させることで、並行処理による応答性の向上などを実現でき、さらにマルチコアプロセッサを複数のスレッドによって活用することで、並列処理による実行時間の短縮などを実現できる(これらの手法をマルチスレッドプログラミングと呼ぶ)。

プログラミングの観点からみると、アプリケーションの処理の「実行の脈絡」は1つでないことが多い。例えば即応性が求められるGUIを描画したりユーザーと対話したりするためのイベントループを実行するフローと、処理に時間のかかるネットワークアクセスやファイルI/O、低速ハードウェアとの通信などを実行するフローは完全に分離してしまったほうが都合がよい。これを単一のコンテキスト(シングルスレッド)上で実現しようとするとシグナルタイマーを駆使してコーディングすることになる。あるいは、複数のプロセスに分割してプロセス間通信で協調動作させるという方法もある。しかし、いずれの場合もそれらの機能を使うための余分な、本来のアルゴリズムと関係ないコーディングが必要となる。スレッドを使用したプログラミングは本来のアルゴリズム(アプリケーションロジック)に集中しやすくなり、プログラムの構造が改善されるという効果がある。
スレッドとプロセスとタスク

計算機上で並行計算並列計算あるいはマルチタスクといった、複数の処理を同時に実行するためには、計算機およびその上で動作するオペレーティングシステム (OS) が、プロセッサCPU)時間を個々の処理に対して適切に分配・スケジューリングする機能に対応している必要がある。同時に実行する部分を指定することができる、処理の分割の単位として、スレッドとプロセスがある。

新たなプロセスを動作させるためには、CPUやメインメモリ上のアドレス空間などの計算資源(リソース)を割り当てる必要がある。それぞれのプロセスは、割り当てられた資源内で独立して動く。通例、システム全体の動作の安定性および安全性の観点から、個々のプロセスは実際のメモリ上の位置を指す物理アドレス空間を直接使用するのではなく、OSによって仮想化・分離された仮想アドレス空間を使用する[3][注釈 1]。プロセスごとにメモリ空間が独立しているため、あるプロセスから別のプロセスが参照しているメモリに直接アクセスするようなことはできない。しかし、独立したメモリ空間が不必要な場合では、メモリの利用効率が悪くなってしまう。プログラムによっては、処理ごとに別々の空間にあるメモリを利用するのではなく、単一の空間内のメモリを共有しながら複数の処理を行なう「共有メモリ方式」のほうが、ロジックの実装のしやすさやメモリ効率の面で優れている場合がある。これを可能にするのがスレッドである。

マルチタスクOSにおいて、1つのタスクは、1つ以上のプロセスから構成され、1つのプロセスは、1つ以上のスレッドから構成される。集合で表すと、スレッド プロセス ∈ タスクというようになる。しかし、この関係は環境によって異なる。例えば、リアルタイムOSでは、タスク スレッド、スレッド ∈ プロセス、である。しかし、タスクとプロセスの間に要素関係はない。

スレッドを使うことで、同一プロセス内の複数スレッドを同一メモリ空間上で実行でき、メモリ消費量などが軽減できるようになっている。しかし、このため、マルチスレッド処理のプログラミングにおいては、同じデータを複数のスレッドが同時に書き換えることによる不整合に注意し、排他制御を行う必要がある。共有ライブラリ使用時には、その共有ライブラリがスレッドセーフリエントラント)になっているかどうか気をつけてプログラミングしなければならない。

また、複数のスレッドが協調動作する際、お互いの処理完了を待ち合わせてデッドロック (deadlock) 状態に陥ることのないよう配慮する必要もある。

ある処理を単一のスレッドのみを用いて動作させる環境もしくは手法をシングルスレッドという。対して、複数のスレッドが同時に動作することをマルチスレッドという。プログラム(概ねプロセス)の開始時にはメインとなるスレッドが動作する。必要に応じてその他の処理をするスレッドを作り、実行させることもできる。

基本的なモデルとして、1つのCPUコアがある瞬間に同時に実行しているのは、割り込み処理なども含めて1つのスレッド、1つのプロセス、1つのタスクであるとする。なお、あるスレッドの実行時に余ったCPU資源を別のスレッドに割り当てる技術が同時マルチスレッディング (SMT) であり、SMTが動作しているとき、内部的な物理CPUコアとしては2つ以上のスレッドを同時に実行していることになるが、アプリケーションソフトウェアの観点では、SMTによって生み出される論理CPUコア(論理プロセッサ、見せかけのコア)がある瞬間に実行できるスレッドは1つである。「ハードウェアマルチスレッディング」も参照
ユーザースレッドとカーネルスレッド

ユーザ空間で実装されたスレッド機構をユーザースレッド、特に仮想機械上で動くものをグリーンスレッドと呼ぶ。ユーザースレッドの切り替えは、そのプロセスがユーザー空間で動作中にライブラリ内のスレッドスケジューラが行う。これは非常にオーバーヘッドが小さく、しかも実装が簡単と言える。しかし、ひとつのプロセス内の複数のスレッドは常に1つだけが動作していることになり、マルチプロセッサシステムの恩恵を受けられない。また、あるスレッドがカーネル内で入出力待ちでスリープしてしまうと、全スレッドが入出力待ちとなってしまうという問題があった。すなわち、ユーザースレッドはあくまでもプログラミングの手法としてのみ意味を持ち、性能向上に寄与するものではない。

カーネル空間で実装されたスレッド機構をカーネルスレッドと呼ぶ。カーネルスレッドの切り替えはカーネルが行うため、マルチプロセッサシステムであれば同じプロセス内の複数のスレッドを並行して実行することもでき、どれかひとつのスレッドがスリープしても別のスレッドは処理を続行できる。しかし、カーネルスレッドは単にユーザー空間などのリソースを共有しているだけで、@media screen{.mw-parser-output .fix-domain{border-bottom:dashed 1px}}プロセス管理から見ればプロセスとほとんど変わりないため、オーバーヘッド(コンテキストスイッチなど)もプロセス並みとなる[要出典]。また、カーネルが全スレッドを管理するため、生成可能なスレッド数の制限がきつくなる[注釈 2]
ライトウェイトプロセス

ライトウェイトプロセス(light-weight process、LWP)または軽量プロセスとは、スレッドを複数並行して実行するためのカーネル内の機構。


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

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