プロセスとスレッドの技術的な違いは何ですか?
私は、「プロセス」のような言葉が酷使され、ハードウェアとソフトウェアのスレッドもあると感じます。以下のような言語での軽量プロセスはどうでしょうか。アーラン?ある用語を他の用語に対して使用する明確な理由はありますか?
プロセスとスレッドはどちらも独立した実行シーケンスです。一般的な違いは、(同じプロセスの)スレッドは共有メモリ空間で実行されるのに対し、プロセスは別々のメモリ空間で実行されることです。
「ハードウェア」スレッドと「ソフトウェア」スレッドのどちらを参照しているのかわかりません。スレッドは、CPU機能ではなく、オペレーティング環境の機能です(CPUには通常、スレッドを効率的にする操作があります)。
Erlangは共有メモリマルチプログラミングモデルを公開していないため、「プロセス」という用語を使用します。それらを「スレッド」と呼ぶことは、それらが共有メモリを持っていることを意味します。
プロセス
各プロセスは、プログラムの実行に必要なリソースを提供します。プロセスには、仮想アドレス空間、実行可能コード、システムオブジェクトへのオープンハンドル、セキュリティコンテキスト、一意のプロセス識別子、環境変数、優先度クラス、最小および最大作業セットサイズ、および少なくとも1つの実行スレッドがあります。各プロセスは、プライマリスレッドと呼ばれることが多い単一のスレッドで開始されますが、その任意のスレッドから追加のスレッドを作成できます。
糸
スレッドは、実行をスケジュールできるプロセス内のエンティティです。プロセスのすべてのスレッドは、その仮想アドレス空間とシステムリソースを共有します。さらに、各スレッドは、例外ハンドラ、スケジューリング優先順位、スレッドローカルストレージ、一意のスレッド識別子、およびスケジュールされるまでスレッドコンテキストを保存するためにシステムが使用する一連の構造を管理します。スレッドコンテキストは、スレッドのプロセスのアドレス空間内に、スレッドのマシンレジスタのセット、カーネルスタック、スレッド環境ブロック、およびユーザースタックを含みます。スレッドは独自のセキュリティコンテキストを持つこともでき、これはクライアントを偽装するために使用できます。
ここMSDNでこれを見つけた:
プロセスとスレッドについて
Microsoft Windowsはプリエンプティブマルチタスクをサポートしています。これは、複数のプロセスからの複数のスレッドの同時実行の効果を生み出します。マルチプロセッサコンピュータでは、システムはコンピュータ上のプロセッサと同じ数のスレッドを同時に実行できます。
プロセス:
糸:
私はから上記の情報を借りましたナレッジクエスト!ブログ。
まず、理論的側面を見てみましょう。プロセスとスレッドの違い、およびそれらの間で共有されていることを理解するには、プロセスが概念的にどのようなものであるかを理解する必要があります。
課から以下があります2.2.2古典的スレッドモデルに現代のオペレーティングシステム3eTanenbaum著:
プロセスモデルは、2つの独立した概念に基づいています。 グループ化と実行時にはそれらを分離するのが便利です。 これはスレッドが入るところです....
彼は続けます:
プロセスを見る一つの方法は、それが 関連するリソースをまとめてください。プロセスにアドレス空間があります プログラムのテキストとデータ、およびその他のリソースを含みます。これら リソースには、開いているファイル、子プロセス、保留中のアラーム、 シグナルハンドラ、アカウンティング情報など入れて プロセスの形で一緒にすれば、それらはより簡単に管理できます。 プロセスが持っている他の概念は実行のスレッドです、通常 ただスレッドに短縮されました。スレッドは、プログラムカウンタを保持しています。 次に実行する命令を追跡します。それはレジスタを持っています、 現在の作業変数を保持します。それはスタックを持っています。 実行履歴。各プロシージャに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やHyperThreadingなど、この概念には複数の名前と実装があります。同時マルチスレッド(略してSMT)。
それではソフトウェア側を見てみましょう。ソフトウェア側でスレッドを実装する方法は、基本的に3つあります。
スレッドを実装するために必要なのは、CPU状態を保存し、複数のスタックを維持する機能だけです。これは、多くの場合、ユーザー空間で実行できます。ユーザー空間スレッドの利点は、カーネルに囚われたり、自分のスレッドを好きなようにスケジュールすることができないので、超高速のスレッド切り替えです。最大の欠点は、I / Oをブロックできないことです(これがプロセス全体とそのすべてのユーザースレッドをブロックすることになります)。これは、最初にスレッドを使用する大きな理由の1つです。スレッドを使用してI / Oをブロックすると、多くの場合、プログラム設計が非常に簡単になります。
カーネルスレッドには、スケジューリングの問題をすべてOSに任せることに加えて、ブロッキングI / Oを使用できるという利点があります。しかし、各スレッドの切り替えにはカーネルへのトラップが必要ですが、これは比較的遅い可能性があります。しかし、I / Oがブロックされているためにスレッドを切り替えているのであれば、I / O操作によってすでにカーネルに閉じ込められている可能性があるため、これは実際には問題になりません。
もう1つの方法は、2つを組み合わせて、それぞれが複数のユーザースレッドを持つ複数のカーネルスレッドを使用することです。
用語の問題に戻って、プロセスと実行のスレッドは2つの異なる概念であり、どの用語を使用するかはあなたが話している内容によって異なります。 「軽量プロセス」という用語に関しては、「実行のスレッド」という用語だけでなく現在行われていることを実際には伝えていないので、その点を個人的には見ていません。
並行プログラミングに関してさらに説明する
プロセスは自己完結型の実行環境を持ちます。プロセスは一般に、基本的なランタイムリソースの完全なプライベートセットを持っています。特に、各プロセスには独自のメモリスペースがあります。
スレッドはプロセス内に存在します - すべてのプロセスは少なくとも1つを持っています。スレッドは、メモリや開いているファイルなど、プロセスのリソースを共有します。これは、効率的ではあるが潜在的に問題のあるコミュニケーションになります。
平均的な人を心に留めて、
コンピュータで、Microsoft WordとWebブラウザを開きます。これら二つを呼ぶプロセス。
Microsoftの言葉では、何かを入力すると自動的に保存されます。これで、編集と保存が並行して行われていることがわかりました。一方のスレッドで編集し、もう一方のスレッドで保存します。
アプリケーションは1つ以上のプロセスで構成されています。プロセスは、最も簡単に言えば、実行中のプログラムです。 1つ以上のスレッドがプロセスのコンテキストで実行されます。スレッドは、オペレーティングシステムがプロセッサ時間を割り当てる基本単位です。スレッドは、現在別のスレッドによって実行されている部分を含め、プロセスコードの任意の部分を実行できます。ファイバーは、アプリケーションによって手動でスケジュールされる必要がある実行単位です。ファイバーは、それらをスケジュールするスレッドのコンテキストで実行されます。
から盗まれたここに。
プロセスは、コード、メモリ、データ、およびその他のリソースの集まりです。スレッドは、プロセスの範囲内で実行される一連のコードです。 (通常は)同じプロセス内で複数のスレッドを同時に実行することができます。
プロセスはアプリケーションの実行インスタンスです。どういう意味ですか?たとえば、Microsoft Wordのアイコンをダブルクリックすると、Wordを実行するプロセスが開始されます。スレッドはプロセス内の実行パスです。また、プロセスは複数のスレッドを含むことができます。 Wordを起動すると、オペレーティングシステムがプロセスを作成し、そのプロセスのプライマリスレッドの実行を開始します。
スレッドはプロセスができることなら何でもできることに注意することが重要です。しかし、プロセスは複数のスレッドで構成されることがあるので、スレッドは「軽量」プロセスと見なすことができます。したがって、スレッドとプロセスの本質的な違いは、それぞれが達成するために使用される作業です。スレッドは小さなタスクに使用されますが、プロセスはより重いタスク、基本的にはアプリケーションの実行に使用されます。
スレッドとプロセスのもう1つの違いは、同じプロセス内のスレッドは同じアドレス空間を共有するのに対し、異なるプロセスは共有しないという点です。これにより、スレッドは同じデータ構造および変数から読み書きでき、またスレッド間の通信も容易になります。プロセス間の通信 - IPC、またはプロセス間通信としても知られている - は、非常に困難でリソース集約的です。
プロセス:
例:
たとえば、任意のブラウザ(mozilla、Chrome、IE)を開いてください。この時点で、新しいプロセスが実行を開始します。
スレッド:
例:
ブラウザで複数のタブを開く
プロセスとスレッドはどちらも独立した実行シーケンスです。一般的な違いは、(同じプロセスの)スレッドは共有メモリ空間で実行されるのに対し、プロセスは別々のメモリ空間で実行されることです。
プロセス
実行中のプログラムです。テキストセクション、つまりプログラムコード、プログラムカウンタの値で表される現在のアクティビティ、プロセッサレジスタの内容。また、一時データ(関数パラメータ、リターンアドレス変数、ローカル変数など)を含むプロセススタック、およびグローバル変数を含むデータセクションも含まれます。プロセスには、プロセス実行時に動的に割り当てられるメモリであるヒープも含まれます。
糸
スレッドはCPU使用率の基本単位です。スレッドID、プログラムカウンタ、レジスタセット、およびスタックで構成されています。それは、同じプロセスに属する他のスレッドと、そのコードセクション、データセクション、およびオープンファイルやシグナルなどの他のオペレーティングシステムリソースと共有していました。
- Galvinによるオペレーティングシステムからの引用
スレッドとプロセスはどちらもOSリソース割り当てのアトミック単位です(つまり、CPU時間がそれらの間でどのように分割されるかを記述する並行性モデルと、他のOSリソースを所有するモデルです)。違いがあります:
上記のGreg Hewgillは、「プロセス」という単語のアーラン語の意味については正しかった。ここにErlangがなぜプロセスを軽量にできるのかという議論があります。
Javaの世界に関するこの質問に答えようとしています。
プロセスはプログラムの実行ですが、スレッドはプロセス内の単一の実行シーケンスです。プロセスは複数のスレッドを含むことができます。スレッドは時々呼ばれます軽量プロセス。
例えば:
例1 JVMは単一のプロセスで実行され、JVM内のスレッドはそのプロセスに属するヒープを共有します。そのため、複数のスレッドが同じオブジェクトにアクセスすることがあります。スレッドはヒープを共有し、独自のスタックスペースを持ちます。これが、あるスレッドがメソッドとそのローカル変数を呼び出すことを他のスレッドから安全に守る方法です。しかし、ヒープはスレッドセーフではなく、スレッドセーフのために同期させる必要があります。
例2 プログラムはキーストロークを読んで絵を描くことができないかもしれません。プログラムはキーボード入力に十分注意を払う必要があり、一度に複数のイベントを処理する機能が欠けているとトラブルにつながります。この問題に対する理想的な解決策は、プログラムの2つ以上のセクションを同時にシームレスに実行することです。スレッドはこれを可能にします。ここでの描画画像は処理で、キー入力の読み取りはサブ処理(スレッド)です。
プロセスはアプリケーションの実行インスタンスであり、スレッドはプロセス内の実行パスです。また、プロセスには複数のスレッドを含めることができます。スレッドがプロセスでできることなら何でもできることに注意することが重要です。しかし、プロセスは複数のスレッドで構成されることがあるので、スレッドは「軽量」プロセスと見なすことができます。したがって、スレッドとプロセスの本質的な違いは、それぞれが達成するために使用される作業です。スレッドは小さなタスクに使用されますが、プロセスはより重いタスク、基本的にはアプリケーションの実行に使用されます。
スレッドとプロセスのもう1つの違いは、同じプロセス内のスレッドは同じアドレス空間を共有するのに対し、異なるプロセスは共有しないという点です。これにより、スレッドは同じデータ構造および変数から読み書きでき、またスレッド間の通信も容易になります。プロセス間の通信 - IPC、またはプロセス間通信としても知られている - は、非常に困難でリソース集約的です。
スレッドとプロセスの違いの概要は次のとおりです。
スレッドはプロセスよりも作成が簡単です。 別のアドレススペースを必要としないでください。
マルチスレッドはスレッドから慎重なプログラミングを必要とします 1つのスレッドによってのみ変更されるべきデータ構造を共有する 一度に。スレッドとは異なり、プロセスは同じものを共有しません アドレス空間
彼らは遠くを使用するため、スレッドは軽量と見なされます プロセスより少ないリソース。
プロセスは互いに独立しています。それ以来、スレッド
同じアドレス空間を共有することは相互依存しているので注意してください。
異なるスレッドが互いに踏み込まないようにする必要があります。
これは、上記の#2を述べる別の方法です。
プロセスは複数のスレッドで構成できます。
インタビュアーの観点からすると、プロセスには複数のスレッドが存在する可能性があること以外に、基本的に3つだけ聞きたいことがあります。
あなたがもっと欲しいならば、スコットランガムの反応はほとんどすべてをカバーします。 これらはすべてオペレーティングシステムの観点からのものです。タスク、軽量スレッドなど、さまざまな言語でさまざまな概念を実装できますが、それらはスレッド(Windowsではファイバー)を使用するための単なる方法です。 ハードウェアとソフトウェアのスレッドはありません。ハードウェアとソフトウェアがあります例外そして割り込みまたはユーザーモードとカーネルスレッド。
以下は私が上の記事の一つから得たものですコードプロジェクト。私はそれが必要なすべてを明確に説明していると思います。
スレッドは、ワークロードを別々のものに分割するためのもう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(夏時間を食べる)
メッセージのソート順:[日付] [スレッド] [件名] [作者]
次のメッセージ:Bernd P. Ziller: "Re:おっとget_hash_tableにおっと"
前のメッセージ:Linus Torvalds: "Re:I / Oリクエストの順序付け"
1996年8月5日月曜日、Peter P. Eiserlohは次のように書いています。
スレッドの概念を明確にしておく必要があります。あまりにも多くの人々 スレッドとプロセスを混同しているようです。以下の議論 Linuxの現状を反映しているのではなく、むしろ ハイレベルの議論を続けるように努める。
いいえ!
「スレッド」と「プロセス」があると考える理由はありません。 別々のエンティティ。それが伝統的なやり方ですが、私は 個人的にそのように考えるのは大きな間違いだと思います。唯一の そのように考える理由は歴史的な手荷物です。
スレッドもプロセスも本当に1つのことです。 人工的に異なる事件を区別しようとすることはちょうど 自己制限的です。
COEと呼ばれる「実行の文脈」はまさにコングロマリットです。 そのCOEのすべての状態の。その状態はCPUのようなものを含みます 状態(レジスタなど)、MMU状態(ページマッピング)、許可状態 (uid、gid)とさまざまな「通信状態」(オープンファイル、シグナル ハンドラなど)伝統的には、 "スレッド"と "スレッド"の違い 「プロセス」は主にスレッドがCPU状態を持っていることです(+おそらく 他の最小限の状態)、その他の文脈はすべて プロセス。しかし、それだけです1COEの全体的な状態を分割する方法であり、それが正しい方法であると言うことは何もありません。自分を制限する そのようなイメージには単なるバカです。
Linuxがこれについて考える方法(そして私が物事を動かしたい方法)は あのです「プロセス」や「スレッド」などはありません。がある COEの全体のみ(Linuxでは「タスク」と呼ばれています)。異なるCOE 文脈の一部を互いに共有することができます。サブセットの 共有は伝統的な "スレッド" / "プロセス"設定ですが、 実際にはサブセットのみと見なされるべきです(これは重要なサブセットですが、 その重要性はデザインからではなく、標準から来ています。 標準準拠のスレッドプログラムをLinux上で実行したい も)。
一言で言えば:スレッド/プロセスの考え方を中心に設計しないでください。の カーネルはCOEの考え方を中心に設計されるべきです。 pthreadsとしょうかん制限付きpthreadインターフェースをユーザーにエクスポートできます COEの見方をそのまま使いたいのです。
COEを次のように考えたときに可能になることの一例として スレッド/プロセスとは反対に:
- あなたは外部の "cd"プログラムを行うことができます。これはUNIXやプロセス/スレッドでは伝統的に不可能なことです(愚かな例ですが あなたはこれらの種類の "モジュール"に制限されないことができるということです。 伝統的なUNIX / threadsの設定)を実行します。
クローン(CLONE_VM | CLONE_FS);
子:execve( "external-cd");
/ * "execve()"はVMとの関連付けを解除します。 使用されたCLONE_VMはクローン作成の動作をより速くするためでした* /
- あなたは自然に "vfork()"をすることができます(それは最小限のカーネルサポートを混ぜ合わせますが、そのサポートはCUAの考え方の考え方に完全に合っています):
クローン(CLONE_VM);
子:実行し続け、最終的にexecve()
母親:execveを待つ
- あなたは外部の "IOデーモン"をすることができます:
クローン(CLONE_FILES);
子:オープンファイルディスクリプタなど
母親:子供が開いたvdのfdを使う。
あなたはスレッド/プロセスに縛られていないので、上記の作業のすべて 考え方。たとえばWebサーバを考えてみましょう。 スクリプトは「実行スレッド」として実行されます。あなたはそれをすることはできません 従来のスレッドは常に共有する必要があるため、従来のスレッド アドレス空間全体なので、これまでのすべてのものをリンクする必要があります。 Webサーバー自体でやりたかった(「スレッド」は別のスレッドを実行することはできません) 実行可能ファイル)
これを「実行のコンテキスト」問題として考えるのではなく、 タスクは外部プログラムを実行することを選択できるようになりました。 彼らがしたい、または彼らがすることができる場合は、親からのアドレス空間など) 例すべてを親と共有するを除くファイル用 ディスクリプタ(サブ "スレッド"がたくさんのファイルを開くことなく開くことができるように) 親は心配する必要があります。 サブ「スレッド」は終了し、それは親でfdを使い果たしません)。
たとえば、スレッド化された "inetd"を考えてください。あなたは低いオーバーヘッドが欲しい fork + execなので、Linuxの方法では "fork()"の代わりに使用できます。 各スレッドが作成されるマルチスレッドinetdを書く CLONE_VM(アドレス空間を共有しますが、ファイル記述子は共有しません) 等)。それから子はそれが外部サービスであるなら実行することができます(rlogind、 例えば)、あるいはそれは内部inetdサービスの1つでした。 (echo、timeofday)その場合それはただそれが事をして終了します。
"thread" / "process"ではそれができません。
ライナス
組み込みの世界から来て、私はプロセスの概念が「大きな」プロセッサにのみ存在することを付け加えたいと思います。デスクトップCPU、ARM Cortex A-9MMU(メモリ管理ユニット)、およびMMUの使用をサポートするオペレーティングシステム(Linux)小型/昔のプロセッサやマイクロコントローラと小型RTOSオペレーティングシステム(リアルタイムオペレーティングシステムfreeRTOSのような)、MMUサポートはなく、プロセスもスレッドもありません。
スレッド互いのメモリにアクセスすることができ、それらはOSによってインターリーブ方式でスケジュールされているので、それらは並列に実行されるように見えます(あるいはマルチコアではそれらは実際に並列に実行されます)。
プロセス一方、MMUによって提供および保護されている仮想メモリのプライベートサンドボックスに住んでいます。次のことが可能になるので便利です。
マルチスレッドを組み込んだPython(インタプリタ言語)でアルゴリズムを構築している間、以前に構築したシーケンシャルアルゴリズムと比較した場合、実行時間がそれほど良くないことに驚いた。この結果の理由を理解するために、私はいくつかの読書をしました、そして私が学んだことがマルチスレッドとマルチプロセスの違いをよりよく理解するためにそこから興味深い文脈を提供すると信じます。
マルチコアシステムは複数の実行スレッドを実行することがあるので、Pythonはマルチスレッドをサポートするべきです。しかし、Pythonはコンパイル言語ではなく、インタプリタ言語です。1。つまり、プログラムは実行するために解釈される必要があり、インタプリタはプログラムが実行を開始する前にそのプログラムを認識しません。しかし、それが知っているのはPythonの規則であり、それからそれらの規則を動的に適用します。その場合、Pythonでの最適化は、主にインタプリタ自体の最適化であり、実行されるコードではありません。これはC ++などのコンパイルされた言語とは対照的であり、Pythonでのマルチスレッドに影響します。具体的には、Pythonはマルチスレッドを管理するためにGlobal Interpreter Lockを使用します。
一方、コンパイルされた言語は、よくコンパイルされています。プログラムは「完全に」処理されます。最初に構文定義に従って解釈され、次に言語にとらわれない中間表現にマッピングされ、最後に実行可能コードにリンクされます。このプロセスにより、コンパイル時にすべてのコードが利用可能になるため、コードを高度に最適化することができます。実行可能プログラムが作成された時点でさまざまなプログラムの相互作用および関係が定義され、最適化についての堅固な決定を下すことができます。
現代の環境では、Pythonのインタプリタはマルチスレッドを許可しなければなりません、そしてこれは安全で効率的でなければなりません。これこそが、インタプリタ言語とコンパイル言語との違いが現れているところです。インタプリタは、同時に計算のためにプロセッサの使用を最適化しながら、異なるスレッドからの内部共有データを乱すべきではありません。
前の記事で述べたように、プロセスとスレッドは独立した順次実行です。主な違いは、プロセスの複数のスレッド間でメモリが共有されるのに対し、プロセスはそれらのメモリ空間を分離することです。
Pythonでは、データはGlobal Interpreter Lockによって異なるスレッドによる同時アクセスから保護されています。どのPythonプログラムでも、一度に実行できるスレッドは1つだけである必要があります。一方、各プロセスのメモリは他のプロセスから分離されており、プロセスは複数のコアで実行できるため、複数のプロセスを実行することが可能です。
1Donald Knuthは、「The Art of Computer Programming:基本的なアルゴリズム」の中の解釈ルーチンについてよく説明しています。
Linux KernelのOS Viewから答えようとしている
プログラムは、メモリに起動されるとプロセスになります。プロセスには、コンパイル済みコードを格納するための.text segement、初期化されていない静的変数またはグローバル変数を格納するための.bssなど、さまざまなセグメントをメモリ内に持つことを意味する独自のアドレス空間があります。スタック。カーネル内部では、各プロセスは独自のカーネルスタック(セキュリティ問題のためにユーザースペーススタックと分離されています)と、task_struct
これは一般的にプロセス制御ブロックとして抽象化されており、プロセスの優先順位、状態などのプロセスに関するすべての情報(およびその他の大量のチャンク)をすべて格納しています。プロセスは複数の実行スレッドを持つことができます。
スレッドになると、それらはプロセス内に存在し、ファイルシステムリソース、保留中のシグナルの共有、データ(変数と命令)の共有などのスレッド作成中に渡すことができる他のリソースと共に親プロセスのアドレス空間を共有します。したがって、より速いコンテキスト切り替えが可能になります。カーネル内部では、各スレッドは独自のカーネルスタックを持っています。task_struct
スレッドを定義する構造体したがって、カーネルは同じプロセスのスレッドを異なるエンティティと見なし、それ自体でスケジュールを組むことができます。同じプロセス内のスレッドは、スレッドグループIDと呼ばれる共通のIDを共有します。tgid
)、プロセスIDと呼ばれる一意のIDもあります。pid
)
視覚化による学習に慣れている人のために、プロセスとスレッドを説明するために私が作成した便利な図を示します。
私はMSDNからの情報を使用しました - プロセスとスレッドについて
同じプロセス内のスレッドはメモリを共有しますが、各スレッドは独自のスタックとレジスタを持ち、スレッド固有のデータをヒープに格納します。スレッドは独立して実行されることはないので、スレッド間通信はプロセス間通信に比べてはるかに高速です。
プロセスが同じメモリを共有することはありません。子プロセスが作成されると、親プロセスのメモリ位置が複製されます。プロセス通信は、パイプ、共有メモリ、およびメッセージ解析を使用して行われます。スレッド間のコンテキスト切り替えは非常に遅いです。
ほとんど同じですが、コンテキストの切り替えや作業負荷などの観点から、スレッドが軽量でプロセスが重いという点が主な違いです。
私がこれまでに見た中で最高の短い定義は、Michael Kerriskの「The Linux Programming Interface」から来ています。
最近のUNIXの実装では、各プロセスは複数のスレッドを持つことができます。 実行のスレッドを想定する1つの方法は、一連のプロセスとしてです。 同じ仮想メモリを共有している 属性各スレッドは同じプログラムコードと共有を実行しています。 同じデータ域とヒープ。ただし、各スレッドには独自のスタックがあります ローカル変数と関数呼び出しリンケージ情報を含みます。 [LPI 2.12]
例1:JVMは単一プロセス内で実行され、JVM内のスレッドはそのプロセスに属するヒープを共有します。そのため、複数のスレッドが同じオブジェクトにアクセスすることがあります。スレッドはヒープを共有し、独自のスタックスペースを持ちます。これが、あるスレッドがメソッドとそのローカル変数を呼び出すことを他のスレッドから安全に守る方法です。しかし、ヒープはスレッドセーフではなく、スレッドセーフのために同期させる必要があります。
所有単位やタスクに必要なリソースなどのプロセスを検討します。プロセスは、メモリ空間、特定の入出力、特定のファイル、優先順位などのリソースを持つことができます。
スレッドとは、ディスパッチ可能な実行単位、つまり簡単な言葉で言えば、一連の命令による進行のことです。