質問
プロセスとスレッドの技術的な違いは何ですか?
「プロセス」のような言葉は使いすぎで、ハードウェアとソフトウェアのスレッドもあると感じています。 Erlang のような言語の軽量プロセスはどうですか。ある用語を他の用語よりも使用する決定的な理由はありますか?
解決
プロセスとスレッドの両方は、独立した実行シーケンスです。典型的な違いは、(同じプロセスの)スレッドは共有メモリ空間で実行されるのに対し、プロセスは別々のメモリ空間で実行されることです。
"ハードウェア"がわからないvs" software"あなたが参照しているかもしれないスレッド。スレッドは、CPU機能ではなく、オペレーティング環境の機能です(ただし、CPUには通常、スレッドを効率的にする操作があります)。
Erlangでは、「プロセス」という用語を使用しています。共有メモリマルチプログラミングモデルを公開しないためです。それらを「スレッド」と呼ぶ共有メモリがあることを意味します。
他のヒント
プロセス
各プロセスは、プログラムの実行に必要なリソースを提供します。プロセスには、仮想アドレススペース、実行可能コード、システムオブジェクトへのオープンハンドル、セキュリティコンテキスト、一意のプロセス識別子、環境変数、優先度クラス、最小および最大ワーキングセットサイズ、および少なくとも1つの実行スレッドがあります。各プロセスは、プライマリスレッドとも呼ばれる単一のスレッドで開始されますが、任意のスレッドから追加のスレッドを作成できます。
スレッド
スレッドは、実行をスケジュールできるプロセス内のエンティティです。プロセスのすべてのスレッドは、その仮想アドレス空間とシステムリソースを共有します。さらに、各スレッドは、例外ハンドラ、スケジューリング優先度、スレッドローカルストレージ、一意のスレッド識別子、およびシステムがスケジュールされるまでスレッドコンテキストを保存するために使用する一連の構造を保持します。スレッドコンテキストには、スレッドの一連のマシンレジスタ、カーネルスタック、スレッド環境ブロック、およびスレッドのプロセスのアドレス空間内のユーザースタックが含まれます。スレッドは、クライアントになりすますために使用できる独自のセキュリティコンテキストを持つこともできます。
MSDNでこれを見つけてください:
プロセスとスレッドについて
Microsoft Windowsは、複数のプロセスからの複数のスレッドの同時実行の効果を作成するプリエンプティブマルチタスクをサポートしています。マルチプロセッサコンピュータでは、システムはコンピュータ上のプロセッサと同じ数のスレッドを同時に実行できます。
プロセス:
- プログラムの実行インスタンスはプロセスと呼ばれます。
- 一部のオペレーティングシステムでは、‘タスク‘という用語を使用しています。実行中のプログラムを参照します。
- プロセスは常にプライマリメモリまたはランダムアクセスメモリとも呼ばれるメインメモリに格納されます。
- したがって、プロセスはアクティブなエンティティと呼ばれます。マシンを再起動すると消えます。
- 複数のプロセスが同じプログラムに関連付けられている場合があります。
- マルチプロセッサシステムでは、複数のプロセスを並行して実行できます。
- ユニプロセッサシステムでは、真の並列処理は実現されませんが、プロセススケジューリングアルゴリズムが適用され、プロセッサが各プロセスを1つずつ実行するようにスケジュールされ、並行性の錯覚が生じます。
- 例:‘ Calculator’の複数のインスタンスを実行するプログラム。各インスタンスはプロセスと呼ばれます。
スレッド:
- スレッドはプロセスのサブセットです。
- 実際のプロセスに似ていますが、プロセスのコンテキスト内で実行され、カーネルによってプロセスに割り当てられた同じリソースを共有するため、「#8216;軽量プロセス」と呼ばれます。
- 通常、プロセスには1つの制御スレッドのみがあります–一度に実行される機械語命令のセット。
- プロセスは、命令を同時に実行する複数の実行スレッドで構成されることもあります。
- 複数の制御スレッドは、マルチプロセッサシステムで可能な真の並列処理を活用できます。
- ユニプロセッサシステムでは、スレッドスケジューリングアルゴリズムが適用され、プロセッサは各スレッドを1つずつ実行するようにスケジュールされます。
- プロセス内で実行されるすべてのスレッドは、同じアドレス空間、ファイル記述子、スタック、およびプロセスに関連するその他の属性を共有します。
- プロセスのスレッドは同じメモリを共有するため、プロセス内の共有データへのアクセスの同期は、これまでにない重要性を獲得します。
最初に、理論的な側面を見てみましょう。プロセスとスレッドの違いとそれらの間で共有されるものを理解するには、プロセスが概念的に何であるかを理解する必要があります。
プロセスモデルは、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は単一の実行スレッドをサポートし、単一のプログラムカウンターとレジスタセットを介してスレッドの状態を維持していました。しかし、キャッシュミスがあるとどうなりますか?メインメモリからデータを取得するには長い時間がかかりますが、その間、CPUはアイドル状態になっています。だから誰かが基本的に2セットのスレッド状態(PC +レジスタ)を持ち、他のスレッドがメインメモリで待機している間に別のスレッド(おそらく同じプロセスにあるかもしれないし、異なるプロセスにあるかもしれない)が仕事をするという考えを持っていました。 HyperThreadingや同時マルチスレッド(略してSMT)など、この概念には複数の名前と実装があります。 。
次に、ソフトウェア側を見てみましょう。ソフトウェア側でスレッドを実装するには、基本的に3つの方法があります。
- ユーザースペーススレッド
- カーネルスレッド
- 2つの組み合わせ
スレッドを実装するために必要なのは、CPU状態を保存し、複数のスタックを維持する機能だけです。これは多くの場合、ユーザー空間で実行できます。ユーザー空間のスレッドの利点は、カーネルにトラップする必要がないため、スレッドの切り替えが非常に高速であり、スレッドを好きなようにスケジュールできることです。最大の欠点は、I / Oをブロックできない(プロセス全体とすべてのユーザースレッドをブロックする)ことです。これは、最初にスレッドを使用する大きな理由の1つです。スレッドを使用してI / Oをブロックすると、多くの場合、プログラム設計が大幅に簡素化されます。
カーネルスレッドには、スケジューリングの問題をすべてOSに任せることに加えて、ブロッキングI / Oを使用できるという利点があります。ただし、各スレッドの切り替えにはカーネルへのトラップが必要であり、潜在的に比較的低速です。ただし、ブロックされたI / Oのためにスレッドを切り替える場合、I / O操作はおそらくtraであるため、これは実際には問題ではありません。
並行プログラミングに関してさらに説明するには
-
プロセスには、自己完結型の実行環境があります。通常、プロセスには、完全なプライベートな基本実行時リソースのセットがあります。特に、各プロセスには独自のメモリ空間があります。
-
プロセス内にスレッドが存在します—すべてのプロセスには少なくとも1つがあります。スレッドは、メモリや開いているファイルなど、プロセスのリソースを共有します。これにより、効率的ですが潜在的に問題のある通信が可能になります。
平均的な人を念頭に置いて、
コンピューターで、Microsoft WordとWebブラウザーを開きます。これら2つのプロセスをプロセスと呼びます。
Microsoftの言葉では、何かを入力すると自動的に保存されます。これで、編集と保存が並行して行われることに気付くはずです。1つのスレッドで編集し、他のスレッドで保存します。
アプリケーションは、1つ以上のプロセスで構成されます。プロセスは、最も簡単に言えば、実行中のプログラムです。 1つ以上のスレッドがプロセスのコンテキストで実行されます。スレッドは、オペレーティングシステムがプロセッサ時間を割り当てる基本単位です。スレッドは、現在別のスレッドによって実行されている部分を含め、プロセスコードの任意の部分を実行できます。ファイバーは、アプリケーションによって手動でスケジュールする必要がある実行単位です。ファイバーは、ファイバーをスケジュールするスレッドのコンテキストで実行されます。
こちらから盗まれました。
>プロセスは、コード、メモリ、データ、その他のリソースの集合です。スレッドは、プロセスのスコープ内で実行される一連のコードです。 (通常)同じプロセス内で複数のスレッドを同時に実行できます。
- すべてのプロセスはスレッド(プライマリスレッド)です。
- ただし、すべてのスレッドはプロセスではありません。プロセスの一部(エンティティ)です。
プロセス:
- プロセスは重いプロセスです。
- プロセスは、個別のメモリ、データ、リソースなどを持つ個別のプログラムです。
- プロセスはfork()メソッドを使用して作成されます。
- プロセス間のコンテキスト切り替えには時間がかかります。
例:
たとえば、任意のブラウザー(Mozilla、Chrome、IE)を開きます。この時点で、新しいプロセスの実行が開始されます。
スレッド:
- スレッドは軽量プロセスです。スレッドはプロセス内にバンドルされています。
- スレッドには共有メモリ、データ、リソース、ファイルなどがあります。
- スレッドはclone()メソッドを使用して作成されます。
- スレッド間のコンテキスト切り替えは、Processほど時間がかかりません。
例:
ブラウザで複数のタブを開きます。
スレッドとプロセスはどちらもOSリソース割り当ての原子単位です(つまり、CPU時間をそれらの間で分割する方法を記述する同時実行モデルと、他のOSリソースを所有するモデルがあります)。違いがあります:
- 共有リソース(スレッドは定義によりメモリを共有しています。スレッドはスタック変数とローカル変数以外のものを所有していません。プロセスもメモリを共有できますが、OSによって維持される別のメカニズムがあります)
- 割り当てスペース(プロセスのカーネルスペースとスレッドのユーザースペース)
上記のグレッグヒューギルは、「プロセス」という単語のアーランの意味については正しいです。また、こちらでは、Erlangがプロセスを軽量化できる理由について説明しています。
プロセスとスレッドの両方は、独立した実行シーケンスです。典型的な違いは、(同じプロセスの)スレッドは共有メモリ空間で実行されるのに対し、プロセスは個別のメモリ空間で実行されることです。
プロセス
実行中のプログラムです。テキストセクション、つまりプログラムコード、プログラムカウンターの値によって表される現在のアクティビティ&プロセッサの内容が登録されます。また、一時データ(関数パラメーター、リターンアドレス、ローカル変数など)を含むプロセススタック、およびグローバル変数を含むデータセクションも含まれます。プロセスには、プロセス実行時に動的に割り当てられるメモリであるヒープも含まれる場合があります。
スレッド
スレッドはCPU使用率の基本単位です。スレッドID、プログラムカウンター、レジスタセット、およびスタックで構成されます。同じプロセスに属する他のスレッド、コードセクション、データセクション、その他のオペレーティングシステムリソース(開いているファイルやシグナルなど)と共有しています。
-Galvinがオペレーティングシステムから取得
Javaの世界に関するこの質問に答えようとしています。
プロセスはプログラムの実行ですが、スレッドはプロセス内の単一の実行シーケンスです。プロセスには複数のスレッドを含めることができます。スレッドは、軽量プロセスと呼ばれることもあります。
例:
例1: JVMは単一のプロセスで実行され、JVMのスレッドはそのプロセスに属するヒープを共有します。これが、複数のスレッドが同じオブジェクトにアクセスする理由です。スレッドはヒープを共有し、独自のスタックスペースを持ちます。これは、あるスレッドのメソッド呼び出しとそのローカル変数が他のスレッドからスレッドセーフに保たれる方法です。ただし、ヒープはスレッドセーフではないため、スレッドセーフのために同期する必要があります。
例2: プログラムは、キーストロークを読み取って絵を描くことができない場合があります。プログラムはキーボード入力に十分な注意を払う必要があり、一度に複数のイベントを処理する能力がないとトラブルにつながります。この問題の理想的な解決策は、プログラムの2つ以上のセクションを同時にシームレスに実行することです。スレッドはこれを可能にします。ここで、絵の描画はプロセスであり、キーストロークの読み取りはサブプロセス(スレッド)です。
プロセスはアプリケーションの実行インスタンスであり、スレッドはプロセス内の実行パスです。また、プロセスには複数のスレッドを含めることができます。プロセスが実行できるすべての処理をスレッドが実行できることに注意することが重要です。しかし、プロセスは複数のスレッドで構成できるため、スレッドは「軽量」と見なすことができます。プロセス。したがって、スレッドとプロセスの本質的な違いは、それぞれが達成するために使用される作業です。スレッドは小さなタスクに使用され、プロセスはより多くの‘ヘビーウェイト’に使用されます。タスク–基本的にアプリケーションの実行。
スレッドとプロセスのもう1つの違いは、同じプロセス内のスレッドが同じアドレス空間を共有するのに対して、異なるプロセスは共有しないことです。これにより、スレッドは同じデータ構造と変数の読み取りと書き込みができ、スレッド間の通信も容易になります。プロセス間の通信– IPC、またはプロセス間通信とも呼ばれます–非常に難しく、リソースを大量に消費します。
ここでは、スレッドとプロセスの違いの概要を示します。
-
スレッドはプロセスよりも作成が簡単です。 別のアドレススペースは必要ありません。
-
マルチスレッド化はスレッドなので慎重なプログラミングが必要です 1つのスレッドによってのみ変更されるべきデータ構造を共有する 一度に。スレッドとは異なり、プロセスは同じものを共有しません アドレス空間。
-
スレッドははるかに使用するため、軽量と見なされます プロセスよりも少ないリソース。
-
プロセスは互いに独立しています。スレッド、なぜなら 同じアドレス空間を共有することは相互に依存しているため、注意してください 異なるスレッドが互いに踏まないようにする必要があります。
これは、上記の#2を示す別の方法です。 -
プロセスは複数のスレッドで構成できます。
http://lkml.iu.edu/hypermail/linux/ kernel / 9608 / 0191.html
Linus Torvalds(torvalds@cs.helsinki.fi)
火、1996年8月6日12:47:31 +0300(EET DST)
メッセージのソート順:[日付] [スレッド] [件名] [著者]
次のメッセージ:Bernd P. Ziller:" Re:Oops in get_hash_table"
前のメッセージ:Linus Torvalds:" Re:I / Oリクエストの順序付け"
1996年8月5日の月曜日、Peter P. Eiserlohは次のように書いています。
スレッドの概念を明確にする必要があります。あまりにも多くの人々 スレッドとプロセスを混同しているようです。次の議論 Linuxの現在の状態を反映するのではなく、 高レベルの議論にとどまるようにしてください。
いいえ!
"スレッド"と考える理由はありません。および「プロセス」は 個別のエンティティ。それが伝統的に行われている方法ですが、私は 個人的にはそのように考えることは大きな間違いだと思います。唯一の そのように考える理由は歴史的な荷物です。
スレッドとプロセスの両方は、実際にはただ1つのことです。 実行」。異なるケースを人為的に区別しようとするのはただ 自己制限。
ここで「COE」と呼ばれる「実行のコンテキスト」は単なるコングロマリットです そのCOEのすべての状態の。その状態にはCPUなどが含まれます 状態(レジスタなど)、MMU状態(ページマッピング)、許可状態 (uid、gid)およびさまざまな「通信状態」 (ファイルを開く、シグナル ハンドラーなど)。従来、「スレッド」の違いはと "プロセス"主に、スレッドのCPU状態が(+ 他の最小限の状態)、他のすべてのコンテキストは プロセス。しかし、それはただ COEの状態全体を分割する 1つの方法であり、それが正しい方法であると言うものは何もありません。自分を制限する その種のイメージにとっては単なる愚かです。
Linuxがこれについて考える方法(および私が物事を機能させたい方法)は 「プロセス」のようなものは ないことまたは「スレッド」。がある COEの全体のみ(Linuxでは「タスク」と呼ばれます)。異なるCOE コンテキストの一部を相互に共有できます。また、サブセット その共有は、従来の「スレッド」/「プロセス」です。セットアップ、しかしそれ 実際にはサブセットのみと見なされる必要があります(重要なサブセットですが、 その重要性は設計からではなく、標準から来ています。 Linux上で標準に準拠したスレッドプログラムを実行したい も))。
要するに、スレッド/プロセスの考え方を中心に設計しないでください。の カーネルはCOEの考え方に基づいて設計する必要があります。 pthreads library は、制限されたpthreadsインターフェースをユーザーにエクスポートできます COEをそのように見たい人。
COEを次のように考えると可能になることの例として スレッド/プロセスとは対照的:
- 外部" cd"を実行できます。プログラム、UNIXおよび/またはプロセス/スレッドでは伝統的に不可能なこと(ばかげた例ですが、 これらの種類の「モジュール」を持つことができるということです。それに限らない 従来のUNIX /スレッドセットアップ)。する:
clone(CLONE_VM | CLONE_FS);
child:execve(" external-cd");
/ *" execve()" VMの関連付けを解除するため、唯一の理由は 使用されたCLONE_VMは、クローン作成の動作を高速化するために* /
- " vfork()"を実行できます当然(最小限のカーネルサポートを考慮していますが、そのサポートはCUAの考え方に完全に適合しています):
clone(CLONE_VM);
child:継続
インタビュアーの観点から見ると、基本的に3つの主なものがあります。プロセスには複数のスレッドが含まれる可能性があることなど、明らかなものがあります。
- スレッドは同じメモリ空間を共有します。つまり、スレッドは他のスレッドメモリからメモリにアクセスできます。通常、プロセスはできません。
- リソース。リソース(メモリ、ハンドル、ソケットなど)は、スレッドの終了ではなく、プロセスの終了時に解放されます。
- セキュリティ。プロセスには、固定セキュリティトークンがあります。一方、スレッドは異なるユーザー/トークンになりすますことができます。
さらに必要な場合は、スコットランガムの回答がほぼすべてを網羅しています。 これらはすべて、オペレーティングシステムの観点からのものです。タスク、軽量スレッドなど、さまざまな言語でさまざまな概念を実装できますが、それらは(Windowsのファイバーの)スレッドを使用する方法にすぎません。 ハードウェアとソフトウェアのスレッドはありません。ハードウェアとソフトウェアには、例外と割り込み、またはユーザーモードとカーネルのスレッドがあります。
- スレッドは共有メモリ空間で実行されますが、プロセスは別のメモリ空間で実行されます
- スレッドは軽量プロセスですが、プロセスは重量プロセスです。
- スレッドはプロセスのサブタイプです。
以下は、コードプロジェクトの記事の1つから得たものです。必要なものがすべて明確に説明されていると思います。
スレッドは、ワークロードを個別に分割する別のメカニズムです 実行ストリーム。スレッドはプロセスよりも軽量です。この つまり、本格的なプロセスよりも柔軟性が低くなりますが、 オペレーティングシステムが実行することが少ないため、より早く開始できます。 セットアップ。プログラムが2つ以上のスレッドで構成される場合、すべての スレッドは単一のメモリ空間を共有します。プロセスには個別のアドレススペースが与えられます。 すべてのスレッドが単一のヒープを共有します。ただし、各スレッドには独自のスタックが与えられます。
- 基本的に、スレッドは、プロセススレッドが機能しないプロセスの一部です。
- スレッドは軽量ですが、プロセスは重いです。
- プロセス間の通信には時間がかかりますが、スレッドには時間がかかりません。
- プロセスは個別に存在しますが、スレッドは同じメモリ領域を共有できます。
プロセス:実行中のプログラムはプロセスと呼ばれます
スレッド:スレッドは、「他の1つと」という概念に基づいてプログラムの他の部分で実行される機能であるため、スレッドはプロセスの一部です。
組み込みの世界から来た私は、プロセスの概念は「ビッグ」にのみ存在することを付け加えたいと思います。 MMU(メモリ管理ユニット)を搭載したプロセッサ(デスクトップCPU、ARM Cortex A-9 )、およびMMUの使用をサポートするオペレーティングシステム( Linux など)。 freeRTOSなどの小型/旧式のプロセッサとマイクロコントローラ、および小型のRTOSオペレーティングシステム(リアルタイムオペレーティングシステム)では、MMUがサポートされていないため、プロセスはなく、スレッドのみがあります。
スレッドは互いにメモリにアクセスでき、OSによってインターリーブされた方法でスケジュールされるため、並列で実行されるように見えます(またはマルチコアで実際に並列で実行されます)。
一方、プロセスは、MMUによって提供および保護されている仮想メモリのプライベートサンドボックスに住んでいます。これは以下を可能にするので便利です:
- バグのあるプロセスがシステム全体をクラッシュさせないようにします。
- 他のプロセスのデータを非表示にしてセキュリティを維持する 到達不能。 プロセス内の実際の作業は、1つ以上のスレッドによって処理されます。
マルチスレッドを組み込んだPython(解釈言語)でアルゴリズムを構築している間、以前に構築したシーケンシャルアルゴリズムと比較して実行時間が改善されないことに驚きました。この結果の理由を理解するために、私はいくつかの読書を行い、学んだことがマルチスレッドとマルチプロセスの違いをよりよく理解する興味深いコンテキストを提供すると信じています。
マルチコアシステムは複数の実行スレッドを実行する可能性があるため、Pythonはマルチスレッドをサポートする必要があります。しかし、Pythonはコンパイルされた言語ではなく、インタープリター言語です 1 。つまり、プログラムを実行するには解釈する必要があり、インタープリターは実行を開始する前にプログラムを認識しません。ただし、Pythonのルールを知っているので、それらのルールを動的に適用します。 Pythonでの最適化は、実行されるコードではなく、主にインタープリター自体の最適化でなければなりません。これは、C ++などのコンパイル言語とは対照的であり、Pythonのマルチスレッド化に影響を及ぼします。具体的には、Pythonはグローバルインタープリターロックを使用してマルチスレッドを管理します。
一方、コンパイルされた言語はコンパイルされます。プログラムは「完全に」処理され、最初に構文定義に従って解釈され、次に言語に依存しない中間表現にマッピングされ、最後に実行可能コードにリンクされます。このプロセスにより、コンパイル時にすべてのコードを使用できるため、コードを高度に最適化できます。さまざまなプログラムの相互作用と関係は、実行可能ファイルが作成されるときに定義され、最適化に関する堅牢な決定を下すことができます。
現代の環境では、Pythonのインタープリターはマルチスレッドを許可する必要があり、これは安全かつ効率的でなければなりません。ここで、インタープリター言語とコンパイル言語の違いが明らかになります。インタープリターは、異なるスレッドからの内部共有データを乱すことなく、同時に計算のためのプロセッサーの使用を最適化する必要があります。
前の投稿で述べたように、プロセスとスレッドの両方は独立した順次実行であり、主な違いはプロセスの複数のスレッド間でメモリが共有されるのに対し、プロセスはメモリ空間を分離することです。
Pythonでは、グローバルインタープリターロックにより、異なるスレッドによる同時アクセスからデータが保護されます。 Pythonプログラムでは、常に1つのスレッドしか実行できないことが必要です。一方、各プロセスのメモリは他のプロセスから分離されており、プロセスは複数のコアで実行できるため、複数のプロセスを実行できます。
1 Donald Knuthが、The Art of Computer Programming:Fundamental Algorithmsで解釈ルーチンについてよく説明しています。
LinuxカーネルのOSビューから回答しようとしています
プログラムは、メモリに起動されるとプロセスになります。プロセスは、コンパイル済みコードを保存するための.textセグメント、初期化されていない静的変数またはグローバル変数を保存するための.bssなど、メモリ内にさまざまなセグメントを持つ独自のアドレス空間を持っています。スタック。カーネル内部では、各プロセスは独自のカーネルスタック(セキュリティ上の問題のためにユーザースペーススタックから分離されます)と、一般にプロセス制御ブロックとして抽象化され、関連するすべての情報を格納する task_struct
優先度、状態などのプロセス(およびその他多くのチャンク)。プロセスは複数の実行スレッドを持つことができます。
スレッドに来ると、それらはプロセス内に存在し、ファイルシステムリソース、保留中の信号の共有、データ(変数と命令)の共有など、スレッド作成中に渡すことができる他のリソースと親プロセスのアドレススペースを共有します。スレッドが軽量であるため、コンテキストの切り替えが高速になります。カーネル内では、各スレッドは、スレッドを定義する task_struct
構造とともに、独自のカーネルスタックを持っています。したがって、カーネルは同じプロセスのスレッドを異なるエンティティとみなし、それ自体でスケジュールを設定できます。同じプロセス内のスレッドは、スレッドグループid( tgid
)と呼ばれる共通のIDを共有し、プロセスID( pid
)と呼ばれる一意のIDも持っています。
視覚化により学習に慣れている方のために、プロセスとスレッドを説明するために作成した便利な図を次に示します。
MSDNの情報を使用しました-プロセスとスレッドについて
同じプロセス内のスレッドはメモリを共有しますが、各スレッドには独自のスタックとレジスタがあり、スレッド固有のデータをヒープに保存します。スレッドが独立して実行されることはないため、プロセス間通信に比べてスレッド間通信ははるかに高速です。
プロセスが同じメモリを共有することはありません。子プロセスが作成されると、親プロセスのメモリの場所が複製されます。プロセス通信は、パイプ、共有メモリ、およびメッセージ解析を使用して行われます。スレッド間のコンテキスト切り替えは非常に遅いです。
ベストアンサー
プロセス:
プロセスは基本的に実行中のプログラムです。アクティブなエンティティです。 一部のオペレーティングシステムでは、‘タスク‘という用語を使用しています。実行中のプログラムを参照します。 プロセスは、常にプライマリメモリまたはランダムアクセスメモリとも呼ばれるメインメモリに格納されます。 したがって、プロセスはアクティブなエンティティと呼ばれます。マシンを再起動すると消えます。 複数のプロセスが同じプログラムに関連付けられている場合があります。 マルチプロセッサシステムでは、複数のプロセスを並行して実行できます。 ユニプロセッサシステムでは、真の並列処理は実現されませんが、プロセススケジューリングアルゴリズムが適用され、プロセッサは各プロセスを一度に1つずつ実行するようにスケジュールされ、同時実行の錯覚を引き起こします。 例:‘ Calculator’の複数のインスタンスを実行するプログラム。各インスタンスはプロセスと呼ばれます。
スレッド:
スレッドはプロセスのサブセットです。 それは実際のプロセスに似ていますが、プロセスのコンテキスト内で実行され、カーネルによってプロセスに割り当てられた同じリソースを共有するため、「軽量プロセス」と呼ばれます。 通常、プロセスには1つの制御スレッドのみがあります–一度に実行されるマシン命令のセット。 プロセスは、命令を同時に実行する複数の実行スレッドで構成することもできます。 複数の制御スレッドは、マルチプロセッサシステムで可能な真の並列処理を活用できます。 ユニプロセッサシステムでは、スレッドスケジューリングアルゴリズムが適用され、プロセッサは各スレッドを1つずつ実行するようにスケジュールされます。 プロセス内で実行されているすべてのスレッドは、同じアドレス空間、ファイル記述子、スタック、および他のプロセス関連の属性を共有します。 プロセスのスレッドは同じメモリを共有するため、共有データへのアクセスをプロセスと同期させることにより、前例のない重要性が得られます。
ref- https://practice.geeksforgeeks.org/problems / difference-between-process-and-thread
これまでに見つけた最良の答えは、 Michael Kerriskの 'The Linux Programming Interface ':
最近のUNIX実装では、各プロセスに複数のスレッドを含めることができます 実行の。スレッドを想定する1つの方法は、一連のプロセスとして 同じ仮想メモリと他の範囲を共有する 属性。各スレッドは同じプログラムコードを実行して共有しています 同じデータ領域とヒープ。ただし、各スレッドには独自のスタックがあります ローカル変数と関数呼び出しリンケージ情報が含まれています。 [LPI 2.12]
この本は、非常に明確な情報源です。ジュリア・エヴァンスは、この記事。
これらはほとんど同じです...しかし、重要な違いは、スレッドが軽量であり、プロセスがコンテキスト切り替え、作業負荷などの点で重いことです。
例1:JVMは単一のプロセスで実行され、JVMのスレッドはそのプロセスに属するヒープを共有します。これが、複数のスレッドが同じオブジェクトにアクセスする理由です。スレッドはヒープを共有し、独自のスタックスペースを持ちます。これは、あるスレッドのメソッド呼び出しとそのローカル変数が他のスレッドからスレッドセーフに保たれる方法です。ただし、ヒープはスレッドセーフではないため、スレッドセーフのために同期する必要があります。
所有権の単位やタスクに必要なリソースなどのプロセスを検討します。プロセスは、メモリ空間、特定の入出力、特定のファイル、優先度などのリソースを持つことができます。
スレッドは、ディスパッチ可能な実行単位、または簡単な言葉で言うと、一連の命令の進行状況です