1873

プロセスとスレッドの技術的な違いは何ですか?

「プロセス」という言葉が乱用されているように感じます。また、ハードウェア スレッドとソフトウェア スレッドもあります。Erlangのような言語の軽量プロセスはどうですか? ある用語を他の用語よりも優先して使用する決定的な理由はありますか?

4

37 に答える 37

1642

プロセスとスレッドはどちらも独立した実行シーケンスです。典型的な違いは、(同じプロセスの) スレッドは共有メモリ空間で実行され、プロセスは別のメモリ空間で実行されることです。

あなたが言及している「ハードウェア」スレッドと「ソフトウェア」スレッドのどちらを指しているのかわかりません。スレッドは、CPU の機能ではなく、オペレーティング環境の機能です (ただし、CPU には通常、スレッドを効率化する操作があります)。

Erlang が「プロセス」という用語を使用するのは、共有メモリ マルチプログラミング モデルを公開していないためです。それらを「スレッド」と呼ぶことは、それらが共有メモリを持っていることを意味します。

于 2008-10-14T09:15:58.967 に答える
912

プロセス
各プロセスは、プログラムの実行に必要なリソースを提供します。プロセスには、仮想アドレス空間、実行可能コード、システム オブジェクトへのオープン ハンドル、セキュリティ コンテキスト、一意のプロセス識別子、環境変数、優先順位クラス、ワーキング セットの最小サイズと最大サイズ、および少なくとも 1 つの実行スレッドがあります。各プロセスは、多くの場合プライマリ スレッドと呼ばれる 1 つのスレッドで開始されますが、そのスレッドのいずれかから追加のスレッドを作成できます。

スレッド
スレッドは、実行をスケジュールできるプロセス内のエンティティです。プロセスのすべてのスレッドは、その仮想アドレス空間とシステム リソースを共有します。さらに、各スレッドは、例外ハンドラー、スケジューリング優先度、スレッド ローカル ストレージ、一意のスレッド識別子、およびシステムがスケジュールされるまでスレッド コンテキストを保存するために使用する一連の構造を維持します。スレッド コンテキストには、スレッドの一連のマシン レジスタ、カーネル スタック、スレッド環境ブロック、およびスレッドのプロセスのアドレス空間にあるユーザー スタックが含まれます。スレッドは、クライアントの偽装に使用できる独自のセキュリティ コンテキストを持つこともできます。


この情報は、Microsoft Docs の次の場所にあります:プロセスとスレッドについて

Microsoft Windows は、複数のプロセスから複数のスレッドを同時に実行する効果を生み出すプリエンプティブ マルチタスクをサポートしています。マルチプロセッサ コンピュータでは、システムはコンピュータ上のプロセッサと同じ数のスレッドを同時に実行できます。

于 2008-10-14T09:43:50.423 に答える
333

プロセス:

  • プログラムの実行中のインスタンスはプロセスと呼ばれます。
  • 一部のオペレーティング システムでは、「タスク」という用語を使用して、実行中のプログラムを指します。
  • プロセスは、プライマリ メモリまたはランダム アクセス メモリとも呼ばれるメイン メモリに常に格納されます。
  • したがって、プロセスはアクティブエンティティと呼ばれます。マシンを再起動すると消えます。
  • 複数のプロセスが同じプログラムに関連付けられている場合があります。
  • マルチプロセッサ システムでは、複数のプロセスを並行して実行できます。
  • ユニプロセッサ システムでは、真の並列処理は達成されませんが、プロセス スケジューリング アルゴリズムが適用され、プロセッサは各プロセスを一度に 1 つずつ実行するようにスケジュールされ、並行性の錯覚が生まれます。
  • 例:「電卓」プログラムの複数のインスタンスを実行します。各インスタンスはプロセスと呼ばれます。

スレッド:

  • スレッドはプロセスのサブセットです。
  • これは、実際のプロセスに似ていますが、プロセスのコンテキスト内で実行され、カーネルによってプロセスに割り当てられた同じリソースを共有するため、「軽量プロセス」と呼ばれます。
  • 通常、プロセスには 1 つの制御スレッド (一度に実行される一連のマシン命令) しかありません。
  • プロセスは、命令を同時に実行する複数の実行スレッドで構成されている場合もあります。
  • 複数の制御スレッドにより、マルチプロセッサ システムで可能な真の並列処理を利用できます。
  • ユニプロセッサ システムでは、スレッド スケジューリング アルゴリズムが適用され、プロセッサは各スレッドを一度に 1 つずつ実行するようにスケジュールされます。
  • プロセス内で実行されるすべてのスレッドは、同じアドレス空間、ファイル記述子、スタック、およびその他のプロセス関連の属性を共有します。
  • プロセスのスレッドは同じメモリを共有するため、プロセス内の共有データへのアクセスを同期することは、かつてないほど重要になります。

上記の情報は、ナレッジ クエストからお借りしました。ブログ.

于 2010-03-19T14:17:23.617 に答える
169

まず、理論的な側面を見てみましょう。プロセスとスレッドの違い、およびそれらの間で共有されるものを理解するには、プロセスとは何かを概念的に理解する必要があります。

セクション2.2.2 The Classical Thread Model of Modern Operating Systems 3e by Tanenbaum には次の記述があります。

プロセス モデルは、リソースのグループ化と実行という 2 つの独立した概念に基づいています。それらを分離すると便利な場合があります。これがスレッドの出番です....

彼は続けます:

プロセスを見る 1 つの方法は、関連するリソースをグループ化する方法であるということです。プロセスには、プログラム テキストとデータ、およびその他のリソースを含むアドレス空間があります。これらのリソースには、開いているファイル、子プロセス、保留中のアラーム、シグナル ハンドラ、アカウンティング情報などが含まれる場合があります。プロセスとしてまとめることで、より管理しやすくなります。プロセスが持つもう 1 つの概念は、実行のスレッドであり、通常は単なるスレッドに短縮されます。スレッドには、次に実行する命令を追跡するプログラム カウンターがあります。現在の作業変数を保持するレジスタがあります。実行履歴を含むスタックがあり、呼び出されたがまだ返されていないプロシージャごとに 1 つのフレームがあります。スレッドは何らかのプロセスで実行する必要がありますが、スレッドとそのプロセスは異なる概念であり、別々に扱うことができます。プロセスは、リソースをグループ化するために使用されます。スレッドは、CPU での実行がスケジュールされているエンティティです。

さらに下に、彼は次の表を提供します。

Per process items             | Per thread items
------------------------------|-----------------
Address space                 | Program counter
Global variables              | Registers
Open files                    | Stack
Child processes               | State
Pending alarms                |
Signals and signal handlers   |
Accounting information        |

ハードウェアのマルチスレッドの問題に対処しましょう。従来、CPU は単一の実行スレッドをサポートし、単一のプログラム カウンター(PC) と一連のレジスタを介してスレッドの状態を維持していました。しかし、キャッシュ ミスが発生するとどうなるでしょうか。メイン メモリからデータを取得するには長い時間がかかります。その間、CPU はアイドル状態になっています。そのため、別のスレッド (おそらく同じプロセス内、おそらく別のプロセス内) がメインメモリで待機している間に別のスレッドが作業を完了できるように、基本的に 2 セットのスレッド状態 (PC + レジスタ) を用意するというアイデアがありました。この概念には、ハイパースレッディング同時マルチスレッディング(略して SMT) など、複数の名前と実装があります。

次に、ソフトウェア側を見てみましょう。ソフトウェア側でスレッドを実装するには、基本的に 3 つの方法があります。

  1. ユーザー空間スレッド
  2. カーネルスレッド
  3. 2つの組み合わせ

スレッドを実装するために必要なのは、CPU の状態を保存し、複数のスタックを維持する機能だけです。これは多くの場合、ユーザー空間で実行できます。ユーザー空間スレッドの利点は、カーネルにトラップする必要がないため、超高速のスレッド切り替えと、スレッドを好きなようにスケジュールできることです。最大の欠点は、ブロッキング I/O (プロセス全体とそのすべてのユーザー スレッドをブロックする) を実行できないことです。これが、そもそもスレッドを使用する大きな理由の 1 つです。多くの場合、スレッドを使用して I/O をブロックすると、プログラムの設計が大幅に簡素化されます。

カーネル スレッドには、すべてのスケジューリングの問題を OS に任せるだけでなく、ブロッキング I/O を使用できるという利点があります。ただし、各スレッド切り替えにはカーネルへのトラップが必要であり、これは比較的遅い可能性があります。ただし、I/O がブロックされているためにスレッドを切り替えている場合は、I/O 操作によってすでにカーネルに閉じ込められている可能性があるため、これは実際には問題になりません。

もう 1 つの方法は、それぞれが複数のユーザー スレッドを持つ複数のカーネル スレッドを使用して、この 2 つを組み合わせることです。

用語の問題に戻ると、プロセスと実行のスレッドは 2 つの異なる概念であり、どちらの用語を使用するかは、話している内容によって異なります。「軽量プロセス」という用語に関しては、「実行のスレッド」という用語と同様に何が起こっているのかを実際に伝えていないため、個人的にはその意味がわかりません。

于 2013-10-22T12:42:55.327 に答える
140

並行プログラミングに関してさらに説明するには

  1. プロセスには自己完結型の実行環境があります。通常、プロセスには、基本的なランタイム リソースの完全なプライベート セットがあります。特に、各プロセスには独自のメモリ空間があります。

  2. スレッドはプロセス内に存在します — すべてのプロセスには少なくとも 1 つのスレッドがあります。スレッドは、メモリや開いているファイルなど、プロセスのリソースを共有します。これにより、効率的ですが、潜在的に問題のあるコミュニケーションが可能になります。

平均的な人を念頭に置いた例:

コンピューターで、Microsoft Word と Web ブラウザーを開きます。これら 2 つのプロセスを と呼びます。

Microsoft Word では、何かを入力すると、自動的に保存されます。これで、編集と保存が並行して行われることを確認できました。一方のスレッドで編集し、もう一方のスレッドで保存します。

于 2012-12-24T07:04:28.750 に答える
57

アプリケーションは、1 つ以上のプロセスで構成されます。プロセスは、簡単に言えば、実行中のプログラムです。1 つ以上のスレッドがプロセスのコンテキストで実行されます。スレッドは、オペレーティング システムがプロセッサ時間を割り当てる基本単位です。スレッドは、現在別のスレッドによって実行されている部分を含め、プロセス コードの任意の部分を実行できます。ファイバーは、アプリケーションによって手動でスケジュールする必要がある実行単位です。ファイバーは、それらをスケジュールするスレッドのコンテキストで実行されます。

ここから盗まれました。

于 2008-10-14T09:16:13.600 に答える
43

プロセスは、コード、メモリ、データ、およびその他のリソースの集合です。スレッドは、プロセスのスコープ内で実行される一連のコードです。(通常) 同じプロセス内で複数のスレッドを同時に実行できます。

于 2008-10-14T09:30:19.873 に答える
31

プロセスとスレッドの実世界の例 これにより、スレッドとプロセスに関する基本的な考え方が得られます ここに画像の説明を入力

Scott Langham's Answer から上記の情報を借りました- ありがとう

于 2016-12-06T23:24:18.923 に答える
27
  • すべてのプロセスはスレッド (プライマリ スレッド) です。
  • しかし、すべてのスレッドはプロセスではありません。プロセスの一部(実体)です。
于 2013-08-09T20:28:24.247 に答える
20

スレッドとプロセスはどちらも、OS リソース割り当ての原子単位です (つまり、CPU 時間がそれらの間でどのように分割されるかを記述する同時実行モデルと、他の OS リソースを所有するモデルがあります)。次の点で違いがあります。

  • 共有リソース (スレッドは定義上メモリを共有しています。スレッドはスタック変数とローカル変数以外は何も所有していません。プロセスもメモリを共有できますが、そのための別のメカニズムがあり、OS によって管理されています)
  • 割り当てスペース (プロセスのカーネルスペースとスレッドのユーザースペース)

上記の Greg Hewgill は、Erlang の「プロセス」という言葉の意味については正しかったです。ここでは、Erlang が軽量なプロセスを実行できる理由について説明します。

于 2008-10-14T09:29:05.977 に答える
14

プロセスとスレッドはどちらも独立した実行シーケンスです。典型的な違いは、(同じプロセスの) スレッドは共有メモリ空間で実行され、プロセスは別のメモリ空間で実行されることです。

プロセス

実行中のプログラムです。テキストセクション、つまりプログラムコード、プログラムカウンターの値とプロセッサレジスタの内容で表される現在のアクティビティがあります。また、一時データ (関数パラメーター、リターン アドレス、ローカル変数など) を含むプロセス スタックと、グローバル変数を含むデータ セクションも含まれます。プロセスには、プロセスの実行時に動的に割り当てられるメモリであるヒープも含まれる場合があります。

スレッド

スレッドは、CPU 使用率の基本単位です。これは、スレッド ID、プログラム カウンター、レジスタ セット、およびスタックで構成されます。同じプロセスに属する他のスレッドと、そのコード セクション、データ セクション、および開いているファイルやシグナルなどの他のオペレーティング システム リソースを共有していました。

-- Galvin によるオペレーティング システムから取得

于 2015-05-10T08:43:18.327 に答える
11

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

プロセスはアプリケーションの実行インスタンスであり、スレッドはプロセス内の実行パスです。また、プロセスには複数のスレッドを含めることができます。スレッドは、プロセスが実行できることは何でも実行できることに注意してください。ただし、プロセスは複数のスレッドで構成される場合があるため、スレッドは「軽量」プロセスと見なすことができます。したがって、スレッドとプロセスの本質的な違いは、それぞれが達成するために使用される作業です。スレッドは小さなタスクに使用されますが、プロセスはより「重い」タスク (基本的にはアプリケーションの実行) に使用されます。

スレッドとプロセスのもう 1 つの違いは、同じプロセス内のスレッドは同じアドレス空間を共有しますが、別のプロセスは共有しないことです。これにより、スレッドは同じデータ構造と変数を読み書きできるようになり、スレッド間の通信も容易になります。プロセス間の通信 (IPC、またはプロセス間通信とも呼ばれます) は、非常に困難でリソースを大量に消費します。

スレッドとプロセスの違いの概要を次に示します。

  1. スレッドは別のアドレス空間を必要としないため、プロセスよりも簡単に作成できます。

  2. スレッドは、一度に 1 つのスレッドによってのみ変更されるデータ構造を共有するため、マルチスレッドには注意深いプログラミングが必要です。スレッドとは異なり、プロセスは同じアドレス空間を共有しません。

  3. スレッドは、プロセスよりもはるかに少ないリソースを使用するため、軽量と見なされます。

  4. プロセスは互いに独立しています。スレッドは同じアドレス空間を共有するため相互に依存しているため、異なるスレッドが互いに踏み込まないように注意する必要があります。
    これは、上記の #2 の別の言い方です。

  5. プロセスは、複数のスレッドで構成できます。

于 2013-11-21T09:45:59.710 に答える
11
  1. スレッドは共有メモリ空間で実行されますが、プロセスは別のメモリ空間で実行されます
  2. スレッドは軽量プロセスですが、プロセスは重量プロセスです。
  3. スレッドはプロセスのサブタイプです。
于 2012-12-21T04:22:39.757 に答える
10

以下は、 TheCodeProjectの記事の1つから得たものです。私はそれが必要なすべてを明確に説明していると思います。

スレッドは、ワークロードを個別の実行ストリームに分割するためのもう1つのメカニズムです。スレッドはプロセスよりも軽量です。つまり、本格的なプロセスよりも柔軟性は低くなりますが、オペレーティングシステムのセットアップが少ないため、より迅速に開始できます。プログラムが2つ以上のスレッドで構成されている場合、すべてのスレッドが1つのメモリスペースを共有します。プロセスには個別のアドレス空間が与えられます。すべてのスレッドが単一のヒープを共有します。ただし、各スレッドには独自のスタックが与えられます。

于 2013-02-21T17:03:34.300 に答える
9

インタビュアーの観点から、プロセスが複数のスレッドを持つことができるなどの明白なことに加えて、私が聞きたい主なことは基本的に3つだけです。

  1. スレッドは同じメモリ空間を共有します。つまり、スレッドは他のスレッド メモリからメモリにアクセスできます。プロセスは通常できません。
  2. 資力。リソース (メモリ、ハンドル、ソケットなど) は、スレッドの終了ではなく、プロセスの終了時に解放されます。
  3. 安全。プロセスには固定のセキュリティ トークンがあります。一方、スレッドは、さまざまなユーザー/トークンになりすますことができます。

さらに詳しく知りたい場合は、Scott Langham の回答がほぼすべてをカバーしています。これらはすべて、オペレーティング システムの観点からのものです。言語が異なれば、タスクや軽量スレッドなどのさまざまな概念を実装できますが、それらは (Windows 上のファイバーの) スレッドを使用する方法にすぎません。ハードウェア スレッドとソフトウェア スレッドはありません。ハードウェアとソフトウェアの例外割り込み、またはユーザー モードとカーネルスレッドがあります。

于 2015-02-13T09:24:15.230 に答える
5

これまでに見つけた最良の答えは、Michael Kerrisk の「The Linux Programming Interface」です。

最新の UNIX 実装では、各プロセスが複数の実行スレッドを持つことができます。スレッドを想定する 1 つの方法は、同じ仮想メモリを共有する一連のプロセスと、他のさまざまな属性を共有することです。各スレッドは同じプログラム コードを実行し、同じデータ領域とヒープを共有します。ただし、各スレッドには、ローカル変数と関数呼び出しのリンケージ情報を含む独自のスタックがあります。[LPI 2.12]

この本は非常に明確な情報源です。Julia Evans は、この記事で、Linux グループが実際にどのように機能するかを明確にするのに役立つと述べました。

于 2017-12-15T00:44:21.470 に答える
4

同じプロセス内のスレッドはメモリを共有しますが、各スレッドには独自のスタックとレジスタがあり、スレッドはスレッド固有のデータをヒープに格納します。スレッドは独立して実行されることはないため、スレッド間通信はプロセス間通信と比較してはるかに高速です。

プロセスが同じメモリを共有することはありません。子プロセスが作成されると、親プロセスのメモリ ロケーションが複製されます。プロセス通信は、パイプ、共有メモリ、およびメッセージ解析を使用して行われます。スレッド間のコンテキスト切り替えは非常に遅いです。

于 2016-04-19T02:01:33.233 に答える
3

例 1: JVM は単一のプロセスで実行され、JVM 内のスレッドはそのプロセスに属するヒープを共有します。そのため、複数のスレッドが同じオブジェクトにアクセスする場合があります。スレッドはヒープを共有し、独自のスタック スペースを持ちます。これにより、1 つのスレッドによるメソッドの呼び出しとそのローカル変数が、他のスレッドからスレッド セーフに保たれます。ただし、ヒープはスレッド セーフではないため、スレッド セーフのために同期する必要があります。

于 2014-05-13T16:34:55.000 に答える
2

所有権の単位のようなプロセスや、タスクに必要なリソースを検討してください。プロセスは、メモリ空間、特定の入出力、特定のファイル、優先度などのリソースを持つことができます。

スレッドは、ディスパッチ可能な実行単位、または簡単に言えば、一連の命令の進行です。

于 2016-06-06T14:57:49.133 に答える
0

Erlang Programming (2009) より: Erlang の同時実行は高速でスケーラブルです。そのプロセスは、Erlang 仮想マシンが作成されたプロセスごとに OS スレッドを作成しないという点で軽量です。これらは、基盤となるオペレーティング システムに関係なく、VM で作成、スケジュール、および処理されます。

Erlang はプリエンプティブ スケジューラを実装しています。これにより、システム スレッドを長時間ブロックすることなく、各プロセスを一定時間実行できるようになり、各プロセスに CPU 実行時間を与えることができます。システムスレッドの数は、私の間違いでなければコアの数に依存し、負荷が不均一になった場合、プロセスはあるスレッドから削除され、別のスレッドに移動されます。これはすべて Erlang スケジューラによって処理されます。

于 2018-10-01T02:31:53.600 に答える