web-dev-qa-db-ja.com

「実際の」「スレッド」とは何ですか?

私は、threadが実際に何であるかについて、適切な定義を見つけて理解しようと試みてきました。

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

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

実際に何かであるプロセスとは異なり、それはリソースの集合などです。

定義の例として、本当に私をあまり助けませんでした。 。 。

From Wikipedia

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

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

Edit:どうやらスレッドには独自の呼び出しスタックも与えられているので、それはある程度具体的なthing

201
richard

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

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

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

130
Ben Voigt

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

あなたが本を読んでいて、今すぐ休憩したいが、戻ってきて、停止した正確なポイントから読書を再開できるようにしたいとします。これを実現する1つの方法は、ページ番号、行番号、およびワード番号を書き留めることです。したがって、本を読むための実行コンテキストはこれらの3つの数字です。

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

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

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

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

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

171
pwnall

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

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

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

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

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

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

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

threadは、他のコードから独立して実行できるプログラム内のこのような命令のシーケンスです。図は概念を示しています: enter image description here

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

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

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

Here, graphically, the concept is rapresented.

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

36
Leos313

ABRAHAM SILBERSCHATZ、Peter BAER GALVIN、GREG GAGNEの著書 『Operating Systems Concepts』の多くのテキストを、物事の理解とともに使用します。

プロセス

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

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

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

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

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

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

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

スレッド

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

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

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

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

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

したがって、ChromeアプリケーションからのRendererプロセスが数値の配列をソートする場合、ソートは実行スレッド/スレッドで行われます。 (スレッドに関する文法は私を混乱させるようです)

物事の私の解釈

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

編集:より多くのコンテキストを提供するのに役立つとわかったその他の情報

現代のすべてのコンピューターには、複数のスレッドがあります。コンピューターのスレッドの数は、コンピューターのコアの数に依存します。

コンカレントコンピューティング

ウィキペディアから:

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

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

(1 + 3) + (4 + 5)

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

24
chatuur

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

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

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

5
Orbit

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

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

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

私が最もよく知っているLinuxを含むいくつかの最新のUnixシステムでは、everythingはスレッドです-プロセスは単にtypeのスレッドであり、比較的少ないものを共有しています親(つまり、独自のメモリマッピング、独自のファイルテーブル、アクセス許可などを取得します)man 2 clone、特にフラグのリストを読み取ることは、ここで本当に有益です。

4
hobbs

これはヤフー回答から取られました:

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

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

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

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

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

3
Flipper

スレッドは、実行ルールを備えたメモリコンテキスト(またはTanenbaumによるリソースグルーピング)にすぎません。これはソフトウェア構造です。 CPUはスレッドが何であるかわかりません(ここでの例外、一部のプロセッサにはハードウェアスレッドがあります)。命令を実行するだけです。

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

2
Valentin Radu

Thread

ここでスレッドに関する簡単なアイデア

  • スレッドは、プロセス内の単一のシーケンスストリームです
  • 簡単に言えば、スレッドは軽量プロセスです
  • 各スレッドは、プログラムカウンター、スタック、レジスタセット、およびスレッドIDを所有します。
  • 各スレッドは厳密に1つのプロセスに属し、プロセスの外側にスレッドは存在できません
  • 従来のヘビーウェイトプロセスには、単一の制御スレッドがあります-1つのプログラムカウンターと、任意の時点で実行できる1つの命令シーケンス–シングルスレッドプロセス
  • マルチスレッドアプリケーションは、単一のプロセス内に複数のスレッドを持ち、それぞれが独自のプログラムカウンター、スタック、レジスタセットを持ちますが、共通のコード、データ、オープンファイルなどの特定の構造を共有します–マルチスレッドプロセス
0