「スレッド」とは(本当に)何ですか?


237

私は良い定義を見つけ、スレッドが本当に何であるかを理解しようと努めてきました。

私は明らかな何かを見逃しているように思えますが、スレッドとは何かについて読むたびに、それはほぼ循環的な定義であり、「スレッドは実行のスレッド」または「実行中のタスクに分割する方法」です。ええと。えっ?

私が読んだことから、スレッドは実際にはプロセスのような具体的なものではないようです。それは実際には単なる概念です。私は道のこの作品を理解してどのようなことから、プロセッサは(と呼ばれているプログラムのためのいくつかのコマンドを実行実行のスレッドを)、それは少しのためのいくつかの他のプログラムのための処理に切り替えるために必要がある場合、それは保存状態のをそれが現在どこかで実行しているプログラム(スレッドローカルストレージ)、次に他のプログラムの命令の実行を開始します。そして前後に。このように、スレッドは実際には現在実行中のプログラムの「実行パスの1つ」の単なる概念です。

プロセスとは異なり、これは本当に何かです-それはリソースの集まりなどです。

あまり役に立たなかった定義の例として。。。

ウィキペディアから:

「コンピューターサイエンスのスレッドとは、実行のスレッドの略です。スレッドとは、プログラムが自身を2つ以上の同時(または疑似同時)実行中のタスクに分割する(「分割」と呼ばれる)方法です。スレッドとプロセスは1つとは異なります別のオペレーティングシステムへのオペレーティングシステムですが、一般に、スレッドはプロセス内に含まれており、同じプロセス内の異なるスレッドは同じリソースを共有しますが、同じマルチタスクオペレーティングシステム内の異なるプロセスは同じリソースを共有しません。

それで私は正しいのですか?違う?本当にスレッドとは何ですか?

編集:どうやらスレッドにも独自の呼び出しスタックが与えられているため、これはやや具体的なものです。


6
「プロセス」は、抽象的な用語にすぎません。
ホッブズ

スレッドローカルストレージはスレッドの呼び出しスタックにすぎませんか?
committedandroider


3
以下の答えは...抽象的です。簡単に言えば(そしていくつかの詳細については詳しく説明します)、かつて、コンピュータプログラムは一度に1つのことしかできませんでした。つまり、A、その後、B、C、そして…。最近のシステムでは、これは理想的ではありません。たとえば、ファイルをダウンロードしながらWebを閲覧し続けたいとします。したがって、プログラムには1つ以上の「スレッド」があります。各「スレッド」は一度に1つのことしか実行できませんが、異なるスレッドは同時に実行できます。スレッド1は、A、B、Cの順に実行できます。スレッド2はX、Y、Zの順に実行できます。BはAが終了するまで開始できませんが、AとX 同時に実行できます。
モハン

@Mohanは素晴らしいですが、それはプロセスとどう違うのですか?
エリック

回答:


153

スレッドは、プロセッサレジスタ(単一コアの場合)の独立した値のセットです。これには、命令ポインター(別名プログラムカウンター)が含まれるため、何がどの順序で実行されるかを制御します。また、スタックポインターも含まれています。スタックポインターは、各スレッドの一意のメモリ領域を指す方が適切です。そうしないと、お互いに干渉します。

スレッドは、制御フロー(関数呼び出し、ループ、goto)の影響を受けるソフトウェアユニットです。これらの命令は、命令ポインターで動作し、特定のスレッドに属しているためです。スレッドは多くの場合、いくつかの優先順位付けスキームに従ってスケジュールされます(ただし、プロセッサコアごとに1つのスレッドを持つシステムを設計することは可能です。この場合、すべてのスレッドが常に実行され、スケジュールは必要ありません)。

実際、命令ポインタの値とその場所に格納されている命令は、命令ポインタの新しい値を決定するのに十分です。ほとんどの命令では、これは単に命令のサイズによってIPを進めるだけですが、制御フロー命令は他の予測可能な方法でIPを変更します。IPがとる一連の値は、プログラムコードを実行する実行パスを形成し、「スレッド」という名前を生み出します。


10
+1。スレッドは、レジスタ値のセットよりも「具体的」ではありません。
グレッグ・ヒューギル

6
「値のセット」とは何ですか?彼らは何ですか?彼らはどのようにスレッドを定義しますか?
リチャード

20
@Richard:CPUレジスタの正確なリストはアーキテクチャによって異なりますが、命令ポインターとスタックポインターはかなり普遍的です。これらのスレッドは、このスレッド(レジスタ値のセット)がプロセッサコアに読み込まれると、そのスレッドが実行されている限り、スレッドを定義します。プロセッサは、スレッドが要求する命令をフェッチし、スレッドレジスタを更新しています。コンテキストスイッチが必要な場合、プロセッサはこのレジスタ値のセットをメモリに保存し、通常は割り込み処理ロジックの一部として、別のスレッドに属するセットをロードします。
Ben Voigt

4
ベンに感謝します。それはとても役に立ちます。
リチャード

2
こんにちはthx @BenVoigt。私のような初心者がつまずくかもしれないいくつかの明確化:「プロセッサレジスタ」とはどういう意味ですか?「命令ポインタ」と「スタックポインタ」とはどういう意味ですか?
BKSpurgeon

215

スレッドは、CPUが命令のストリームを実行するために必要なすべての情報である実行コンテキストです。

本を読んでいて、今すぐ休憩を取りたいが、戻ってきて、停止したところから読み直せるようにしたいとします。これを実現する1つの方法は、ページ番号、行番号、および単語番号を書き留めることです。したがって、本を読むための実行コンテキストはこれらの3つの数値です。

ルームメートがいて、彼女が同じテクニックを使用している場合、彼女はあなたがそれを使用していないときに本を受け取り、彼女が停止したところから読書を再開できます。その後、それを取り戻し、元の場所から再開できます。

スレッドは同じように機能します。CPUは、複数の計算を同時に実行しているような錯覚を与えます。これは、各計算に少し時間を費やすことによって行われます。計算ごとに実行コンテキストがあるため、それが可能です。友達と本を共有できるように、多くのタスクがCPUを共有できます。

より技術的なレベルでは、実行コンテキスト(つまりスレッド)は、CPUのレジスタの値で構成されます。

最後:スレッドはプロセスとは異なります。スレッドは実行のコンテキストであり、プロセスは計算に関連するリソースの集まりです。プロセスは1つまたは複数のスレッドを持つことができます。

明確化:プロセスに関連付けられたリソースには、メモリページ(プロセス内のすべてのスレッドがメモリの同じビューを持っている)、ファイル記述子(たとえば、開いているソケット)、およびセキュリティ資格情報(たとえば、プロセスを開始したユーザーのID)が含まれます。処理する)。


20
より良いアナロジーは、人をCPUと同一視し(両方とも何かを行う)、本をアドレス空間と同一視します(両方とも存在します)。このように、異なる本のブックマークは、異なるプロセスのスレッドのようなものです。複数のブックマークを含む1冊の本は、マルチスレッドプロセスに類似しています。これは、人々が「スレッド」と言うときに通常意味するものです。シングルプロセッサマシンで機能しますが、マルチプロセッシングについて話すと多少故障します。CPUの実行が(F機能誰も苦労)が、それはない人は第11章を読み問題
ソロモン遅い

@pwnall、私のような他の人のために難しい概念を消化してくれてありがとう!マルチスレッドはマルチプロセッシングに関係していますか(または、間違った用語を使用している場合に備えて、多くのCPUでプロセスを並行して実行していますか)?
aerijman

51

スレッドを正式に定義するには、まずスレッドが動作する場所の境界を理解する必要があります。

コンピュータプログラムは、ストアからコンピュータのメモリに読み込まれて実行を開始すると、プロセスになります。プロセスは、プロセッサまたはプロセッサのセットによって実行できます。メモリ内のプロセス記述には、プログラムの現在の位置(つまり、現在実行されている命令)、レジスター、変数ストア、ファイルハンドル、シグナルなどを追跡するプログラムカウンターなどの重要な情報が含まれています。

スレッドは、独立して、他のコードの実行可能なプログラム内でそのような命令のシーケンスです。図は概念を示しています。 ここに画像の説明を入力してください

スレッドは同じプロセスアドレス空間内にあるため、プロセスのメモリ記述に存在する情報の多くをスレッド間で共有できます。

スタック(スレッドごとに異なるメモリ領域へのスタックポインタ)、レジスタ、スレッド固有のデータなど、一部の情報は複製できません。この情報は、プログラムのメインスレッド、および場合によってはプログラム内の1つ以上の他のスレッドとは無関係スレッドをスケジュールできるようにするのに十分です。

マルチスレッドプログラムを実行するには、明示的なオペレーティングシステムのサポートが必要です。さいわい、ほとんどの最新のオペレーティングシステムは、Linux(NPTLを介して)、BSDバリアント、Mac OS X、Windows、Solaris、AIX、HP-UXなどのスレッドをサポートしています。オペレーティングシステムは、異なるメカニズムを使用してマルチスレッドサポートを実装している場合があります。

ここでは、グラフィカルにコンセプトが表現されています。

ここでは、トピックに関する詳細情報を見つけることができます。それも私の情報源でした。

Edward LeeSeshiaによる、Introduction to Embedded Systemからの文を追加します

スレッドは、同時に実行され、メモリ空間を共有する必須のプログラムです。彼らはお互いの変数にアクセスできます。この分野の多くの専門家は、「スレッド」という用語をより狭く使用して、メモリを共有するプログラムを構築する特定の方法を指し、[その他]は、命令型プログラムが同時に実行されてメモリを共有するメカニズムを広く指します。この広い意味では、スレッドは、オペレーティングシステムがまったくなくても(ベアアイアン)、ほとんどすべてのマイクロプロセッサに割り込みの形で存在します。


45

プロセスは、必要に応じてネットワークを使用してデータを共有する2人の異なるコンピューターを使用する2人のようなものです。スレッドは、同じコンピューターを使用している2人の人のようなもので、明示的にデータを共有する必要はありませんが、慎重に順番を変える必要があります。

概念的には、スレッドとは、同じアドレススペースでぶらぶらしている複数のミツバチのことです。各スレッドには独自のスタック、独自のプログラムカウンターなどがありますが、プロセス内のすべてのスレッドは同じメモリを共有します。2つのプログラムが同時に実行されているが、どちらも同じオブジェクトにアクセスできるとします。

これをプロセスと比較してください。プロセスはそれぞれ独自のアドレス空間を持っています。つまり、あるプロセスのポインタを使用して、別のプロセスのオブジェクトを参照することはできません(共有メモリを使用しない限り)。

理解すべき重要な点は次のとおりです。

  • プロセスとスレッドはどちらも「同時に実行」できます。
  • プロセスはメモリを共有しません(デフォルトでは)が、スレッドはすべてのメモリを同じプロセス内の他のスレッドと共有します。
  • プロセス内の各スレッドには、独自のスタックと独自の命令ポインターがあります。

「プロセスは何も共有しない(デフォルト)」と言いますが、たとえを言えば、「プロセスは2台の異なるコンピューターを使用し、必要に応じてネットワークを使用してデータを共有する2人のようなものです」と述べています。
committedandroider

@committedandroider:よかった。プロセスはメモリを共有しない(デフォルト)が、スレッドはすべてのメモリを共有するように私の回答を編集しました。
Joey Adams

36

私は、ABRAHAM SILBERSCHATZ、PETER BAER GALVIN、およびGREG GAGNEの著書「Operating Systems Concepts」の多くのテキストを、自分の理解とともに使用します。

処理する

すべてのアプリケーションは、テキスト(またはコード)の形式でコンピューターに常駐します。

プログラム自体はプロセスではないことを強調します。プログラムは、ディスクに格納された命令のリストを含むファイル(実行可能ファイルと呼ばれることが多い)などの受動的エンティティです。

アプリケーションを起動すると、実行のインスタンスが作成されます。この実行のインスタンスはプロセスと呼ばれます。編集:(私の解釈によれば、クラスとクラスのインスタンスに類似しており、クラスのインスタンスはプロセスです。)

プロセスの例は、Google Chromeのプロセスです。Google Chromeを起動すると、3つのプロセスが生成されます。

ブラウザプロセスは、ユーザーインターフェイス、ディスクおよびネットワークI / Oの管理を担当します。Chromeを起動すると、新しいブラウザプロセスが作成されます。ブラウザプロセスは1つだけ作成されます。

レンダラープロセスには、Webページをレンダリングするためのロジックが含まれています。したがって、HTML、Javascript、画像などを処理するためのロジックが含まれています。原則として、新しいタブで開いたWebサイトごとに新しいレンダラープロセスが作成されるため、複数のレンダラープロセスが同時にアクティブになる場合があります。

•使用中のプラグインのタイプ(FlashやQuickTimeなど)ごとにプラグインプロセスが作成されます。プラグインプロセスには、プラグインのコードに加えて、プラグインが関連するレンダラープロセスおよびブラウザープロセスと通信できるようにする追加コードが含まれています。

これに答えるには、まずプロセッサが何であるかを知っておくべきだと思います。プロセッサは、実際に計算を実行するハードウェアです。編集:(2つの数値の加算、配列の並べ替え、基本的に記述されたコードの実行などの計算)

次に、スレッドの定義に移ります。

スレッドはCPU使用率の基本単位です。スレッドID、プログラムカウンター、レジスタセット、スタックで構成されます。

編集:インテルのWebサイトからのスレッドの定義:

スレッド(実行スレッド)は、単一のCPUコアを通過または処理できる、命令の基本的な順序付けされたシーケンスを表すソフトウェア用語です。

したがって、Chromeアプリケーションのレンダラープロセスが数値の配列を並べ替えると、並べ替えは実​​行のスレッドまたはスレッドで行われます。(スレッドに関する文法は私を混乱させるようです)

私の解釈

プロセスは実行インスタンスです。スレッドは、CPUアクセスを介して計算を実行する実際のワーカーです。プロセスに対して複数のスレッドが実行されている場合、プロセスは共通メモリを提供します。

編集: 私はより多くのコンテキストを与えるのに役立つと私が見つけた他の情報

すべての現代のコンピューターには複数のスレッドがあります。コンピューターのスレッドの数は、コンピューターのコアの数によって異なります。

並行コンピューティング

ウィキペディアから:

並行コンピューティングは、順次(次の開始前に完了する)の代わりに、重複する期間中に(並行して)いくつかの計算が実行されるコンピューティングの形式です。これはシステムのプロパティであり(これは、個々のプログラム、コンピューター、またはネットワークの場合があります)、計算(「プロセス」)ごとに個別の実行ポイントまたは「制御スレッド」があります。

したがって、4つの数値の合計を計算するプログラムを作成できます。

(1 + 3) + (4 + 5)

この合計を計算するプログラム(実行のスレッドで実行される1つのプロセス)で、別のスレッドで実行できる別のプロセスをフォークして(4 + 5)計算し、結果を元のプロセスに返すことができます。元のプロセスは(1 + 3)の合計を計算します。


5
それが本当の答えです
Suhail Mumtaz Awan

1
たくさん助けてくれました。これは説明がどのように見えるかです。
Dinesh Kumar

この回答の大きな価値は、必要に応じて詳細を確認できる参考書を提供することです。@chatuurありがとうございます!
デサ2018

7

残念ながら、スレッドは存在します。スレッドは具体的なものです。あなたは1つを殺すことができ、他はまだ走っているでしょう。新しいスレッドを生成できます。各スレッドは独自のプロセスではありませんが、プロセス内で個別に実行されます。マルチコアマシンでは、2つのスレッドを同時に実行できます。

http://en.wikipedia.org/wiki/Simultaneous_multithreading

http://www.intel.com/intelpress/samples/mcp_samplech01.pdf


1
それを「具体的なもの」にするのは何ですか?TLSとそのコールスタックに格納されているデータだけですか?
リチャード

それは理解のための単なる抽象化ではない...それが実際に複数のスレッドを装って前後に実行された単一のスレッドである場合、OPは正しいでしょうが、そうです、このデータはそれを具体化すると言っています。
Orbit

私を啓発します 。。。だから答えは何ですか?
リチャード

@Richardはセマンティクスについての議論に入ることを検討していません。概念的にOPを明確にするために私の回答をフレーズしました。
オービット

@richard TLSとは何ですか?
committedandroider

6

スレッドは、実行ルールを備えたメモリコンテキスト(またはTanenbaumがスレッドをより適切に配置する方法、リソースのグループ化)にすぎません。これはソフトウェア構造です。CPUはスレッドが何であるかを理解していません(ここでは例外がいくつかあり、一部のプロセッサはハードウェアスレッドを持っています)。命令を実行するだけです。

カーネルはスレッドとプロセスの概念を導入して、メモリと命令の順序を意味のある方法で管理します。


5

これはYahoo Answerから取られました:

スレッドは、アプリケーションのアーキテクチャに影響されないコーディング構造です。1つのプロセスに複数のスレッドが含まれることがよくあります。スレッドは、同じ変数を共有するため、互いに直接通信することもできます。

プロセスは、独自の状態情報を持つ独立した実行単位です。また、独自のアドレススペースを使用し、プロセス間通信メカニズムを通じてのみ他のプロセスと対話できます。

ただし、簡単に言えば、スレッドは「タスク」のようなものです。たとえば、何かをしているときを考えてください。たとえば、1つの紙に数式を書き留めているとします。これは1つのスレッドと見なすことができます。次に、別のスレッドは、別の紙に何かを書いています。そこでマルチタスクが登場します。

Intelプロセッサは「ハイパースレッディング」を備えているとされ(AMDにも搭載されています)、複数の「スレッド」またはマルチタスクをより効率的に実行できるようになっています。

スレッドの処理方法のロジスティクスについてはわかりません。私はそれらの間でプロセッサが行き来することについて聞いたことを思い出しますが、これについては100%確信がありません。うまくいけば、他の誰かがそれに答えることができます。


Intelプロセッサはどのようにして複数のスレッドをより適切に処理しますか?シングルコアの場合、一度に実行できるスレッドは1つだけです。プロセッサが前後することに同意します。あなたは本当にあなたがそれをもっとうまく行うことができないのですか?
committedandroider

これは、一部のユースケースでより良いパフォーマンスを提供する最適化です。ここでハイパースレッディングについて読むことができます: en.wikipedia.org/wiki/Hyper-threading
Jeremy Friesner

5

答えはシステムや実装によって大きく異なりますが、最も重要な部分は次のとおりです。

  1. スレッドには独立した実行スレッドがあります(つまり、スレッドからコンテキストスイッチを切り替えてから戻ることができ、元の場所から実行を再開します)。
  2. スレッドには有効期間があります(別のスレッドによって作成され、別のスレッドが終了するのを待つことができます)。
  3. おそらく「プロセス」よりも手荷物が少なくなっています。

それを超えて:スレッドは、言語ランタイムによって単一のプロセス内に実装でき、スレッドはコルーチン、スレッドライブラリによって単一のプロセス内に実装でき、またはスレッドはカーネル構造になります。

私が最もよく知っているLinuxを含むいくつかの最新のUnixシステムでは、すべてがスレッドです-プロセスは、親と比較的少数のことを共有するタイプのスレッドにすぎません(つまり、独自のメモリマッピング、独自のファイルテーブルを取得します)と権限など)を読むことman 2 clone、特にフラグのリストは、ここで非常に有益です。


コンテキストの切り替えは、プロセッサが1つのスレッドから別のスレッドに移動したとき(同じプロセスか別のスレッドか)ですか?
committedandroider

-1

私はそれらの答えのどれにも本当に満足していないので、ここに自分で追加します:)スレッドは、プロセッサでの作業をスケジュールするためのカーネル抽象化です。スレッドは、カーネルがプロセッサ時間を管理するために提供するものです仕事を他の人と共有する


1
-1スレッドはカーネルによって作成される必要はありません。カーネルレベルのサポートを備えたスレッドは、実際にカーネルによってスケジュールされます(ある種のsyscallが発行されます)。ただし、ユーザーライブラリレベルのサポートを備えたスレッドもあり、スレッドテーブルはユーザー空間にあります。
AleksandrH

-1

まず、プロセスとスレッドの違いについて説明しましょう。

プロセスは、{1..N}個のスレッドを持つことができます。仮想メモリと仮想プロセッサに関する簡単な説明。

仮想メモリ

プロセスが実行のためにプライマリメモリ上にあるとプロセスが考えるように、スワップスペースとして使用されます。

仮想プロセッサ

これがプロセッサの場合を除いて、仮想メモリと同じ概念。プロセスにとって、それはプロセッサを使用している唯一のものであるように見えます。

OSは、仮想メモリと仮想プロセッサをプロセスに割り当て、プロセス間のスワップを実行して実行します。

プロセス内のすべてのスレッドは、同じ仮想メモリを共有します。ただし、各スレッドには個別の仮想プロセッサが割り当てられているため、個別に実行できます。

したがって、メモリを節約し、CPUを最大限に活用します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.