読者です 読者をやめる 読者になる 読者になる

猫型エンジニアのブログ

プログラム/ネットワーク系の技術関連をまとめたページです 

並列処理の用語

 Pythonソースコードを読んで理解する必要があるので、はじめてまともに向き合いました。今まで並列処理が必要になったことなどないので、本当に手さぐり状態です。ライブラリのドキュメントを読んでいても書いてある意味が分からないので、この分野で使われている用語の整理から始めてみます。

 参照元は英語Wikiです。日本語よりも遥かに内容が充実していて本当に助かります。下手に日本語で検索するよりも便利です。これだけの情報を得るのに、一昔前ならお金を払って本を買うしかなかったのかと思うと感慨深いです。

 ここに書いてあるのは単に調べれば自明のことで、それらを自分の言葉で書き直しているだけです。しかし書くという行為のなかで一度自分の頭の中で情報の整理・再構成がされるので、書き終わると単に目を通すだけとはちがってすごく納得感がでます。

 並列処理で難しいのは、通常のプログラミングでは意識することのあまりない、ハードウェア周りなどの低レイヤーに依存する箇所が、本質的に関わってくるからですね。

スレッド

 OSのスケジューラによって管理される、プログラムの最小実行単位です。一般的にスレッドはプロセスの内部で実行されます。
 ちなみに英語だとthread of execution(実行にあたっての脈絡)になります。こちらの方がスレッドよりも意味が分かりやすいですね。

マルチスレッド

 複数のスレッドを並列的に処理すること。単一プロセッサでもマルチプロセッサでも、マルチスレッドを実現することは可能で、CPUのコア数は関係ありません。
 単一プロセッサの場合は、個々のスレッドはコンテクストスイッチによってそれぞれ別の瞬間に切り替えられながら実行されており、本当の意味で同時に実行していません。
 マルチプロセッサ/マルチコアの場合は、個々のスレッドは別々のプロセッサ/コアに割り当てられて実行されるため、文字通り複数の処理が同時に実行されることになります。
 そのため書かれたプログラム中のマルチスレッドが、実際に同時に実行されるかどうかは、ハードウェアやOSに依存することになります。

 マルチプロセスよりもマルチスレッドのほうが、一般的にシステムのオーバヘッドが少ないため、パフォーマンスが向上することがあります。

 プログラマシステムコールを経由してカーネルのマルチスレッドを操作することができます。<= ユーザスレッド、カーネルスレッドの違い?

マルチスレッドの場合は、実行時のソースコードおよび変数の値(=Context)をスレッド間で共有する。

ユーザスレッド

ユーザ空間で実装されたスレッド。スレッドの管理もスケジュールもユーザ空間上でなされ、カーネルは関与しません。
ユーザスレッドの作成や管理のカーネルに対する負荷が低いですが、プロセッサーのマルチプロセスやマルチスレッドを支援する機能を使用できません。また関連するカーネルスレッドが停止すると、その上で動作しているユーザスレッドも停止します。

ユーザスレッドではコンテキストスイッチング(同一プロセス内のスレッドの切り替え)にカーネルが関与しないため、効率的に行える。

カーネルスレッド

カーネル空間で実装されたスレッド。ネイティブスレッドとも呼ぶようです。カーネルによってスケジュール管理されます。

グリーンスレッド

OSではなく仮想マシンやランタイムライブラリによってスケジュールされるスレッド。グリーンスレッドは、OSの機能によらずにマルチスレッド環境をエミュレートする。

カーネルのスレッドに関するサポートが受けられない環境上で、マルチスレッドを実行することができます。

注意:ここでの仮想マシンVMwareKVM等のOSを実行するために仮想マシンではなく、JVMなどの言語処理系の仮想マシンになります

シングルプロセッサ上では、カーネルスレッドとグリーンスレッドのどちらがよいパフォーマンスを発揮するかは一般的には明らかではありません。


Rubyのスレッド周りの話 - Qiita

ネイティブスレッド

スケジューラ

コンテキストスイッチ

同一の状態で処理を再開するために、プロセッサーの状態(レジスターの中身やメモリーマップなど)を退避・復元させることです。
状態の内容はプロセッサーやOSによってことなります。

日本語の文脈の切り替えと考えると意味はとりやすいです。

プロセス

 マルチプロセスの場合はプロセス間で資源を共有しませんが、マルチスレッドの場合はスレッド間で資源の共有を行います。

プロセスとスレッドの違い

 マルチプロセスはそれぞれ独立したメモリ空間を持つため、プロセスの切り替えにかかる負荷はスレッドのそれよりも高くなります。

プリエンプション

メモ

pthreadsプログラミングによると、以前はマルチスレッド処理を実装するのはプラットフォームに依存していて移植できなかったらしい。