私はマルチスレッドプログラミングを学んでいますが、ここでの質問は、まず最初に明確にする必要がある非常に基本的な概念です。
私がインターネットから検索したように、私が理解しているのは、ヘビーウェイトが「プロセス」に関するものであり、ライトウェイトが「スレッド」にマップされていることです。しかし、なぜプロセスが重いのでしょうか。非共有メモリまたは他の何かのためですか?
私はマルチスレッドプログラミングを学んでいますが、ここでの質問は、まず最初に明確にする必要がある非常に基本的な概念です。
私がインターネットから検索したように、私が理解しているのは、ヘビーウェイトが「プロセス」に関するものであり、ライトウェイトが「スレッド」にマップされていることです。しかし、なぜプロセスが重いのでしょうか。非共有メモリまたは他の何かのためですか?
「重い」同時実行性は、各同時実行エグゼキューターの開始に費用がかかるか、オーバーヘッドが大きい場合です。
「軽量」な同時実行性は、各同時実行エグゼキューターの開始コストが低く、オーバーヘッドが小さい場合です。
各プロセスには独立したアドレス空間とさまざまな管理構造が必要ですが、プロセス内のスレッドはこれらの構造を共有するため、プロセスは一般にスレッドよりも OS の管理にコストがかかります。
したがって、スレッドは軽量であるのに対し、プロセスは重量級と見なされます。
ただし、一部のコンテキストでは、スレッドは重量物と見なされ、「軽量」の同時実行機能はある種の「タスク」です。これらのコンテキストでは、ランタイムは通常、スレッドのプールでこれらのタスクを実行し、ブロックされたときにそれらを一時停止し、スレッドを他のタスクに再利用します。
今日、「重い」分類は以前と同じ重みを持たなくなりましたが、プロセス分離の利点はその効力をまったく失っていません;-)
これはすべて、コピーオンライトのセマンティクスのおかげです。の間にfork()
、親からのページが子プロセスのために盲目的にコピーされることはもうありません。子プロセスが共有メモリページの1つに書き込みを開始するまで、両方のプロセスは共有メモリを使用して動作できます。
もちろん、プロセスIDはスレッドよりも制限されたリソースであるため、より多くのプロセスを作成すると、オペレーティングシステムによって制限される傾向が高くなります。