フォークとスレッドの違いを誰でも説明できますか?
フォークは、同じコードセグメントで、現在のプロセスのコピーであるまったく新しいプロセスを提供します。メモリイメージが変更されると(通常、これは2つのプロセスの動作が異なるため)、メモリイメージが分離されます(コピーオンライト)が、実行可能コードは変わりません。タスクは、いくつかの プロセス間通信(IPC) プリミティブを使用しない限り、メモリを共有しません。
1つのプロセスが複数のスレッドを持つことができ、それぞれがプロセスの同じコンテキスト内で並列に実行されます。メモリおよびその他のリソースはスレッド間で共有されるため、一部のプリミティブオブジェクトおよび同期オブジェクト( mutexes 、 condition variables および semaphores など)を介して共有データにアクセスする必要があります)データ破損を回避できます。
フォークは、古いプロセスまたは親プロセスとまったく同じように見える新しいプロセスに他なりませんが、それでもプロセスIDが異なり、独自のメモリを持つ別のプロセスです。親プロセスは、子用に個別のアドレススペースを作成します。親プロセスと子プロセスの両方が同じコードセグメントを所有していますが、互いに独立して実行されます。
フォークの最も簡単な例は、unix/linuxのシェルでコマンドを実行する場合です。ユーザーがコマンドを発行するたびに、シェルは子プロセスをフォークし、タスクが完了します。
Forkシステムコールが発行されると、親プロセスに対応するすべてのページのコピーが作成され、子プロセス用にOSによって別のメモリ位置にロードされますが、場合によってはこれは必要ありません。 「exec」システムコールのように、execvは親プロセス自体のアドレス空間を置き換えるため、親プロセスページをコピーする必要はありません。
フォークについて注意すべき点は次のとおりです。
スレッドは軽量プロセス(LWP)です。従来、スレッドはCPU(およびその他の最小状態)状態であり、プロセスには残り(データ、スタック、I/O、信号)が含まれています。システムはプロセスの新しいシステム仮想メモリ空間と環境を初期化しないため、スレッドは「フォーク」または新しいプロセスの生成よりもオーバーヘッドが少なくて済みます。プロセスフローを別のプロセッサで実行するようにスケジュールできるマルチプロセッサシステムで最も効果的であるため、並列処理または分散処理によって速度が向上しますが、I/Oおよびプロセスを停止する可能性のある他のシステム機能のレイテンシを活用するユニプロセッサシステムでも向上が見られます実行。
同じプロセス共有のスレッド:
詳細は こちら をご覧ください。
Dacavの答えは素晴らしいです。すべてのスレッドモデルが真のマルチプロセッシングを提供するとは限りません。
たとえば、Rubyのデフォルトのスレッド実装は、真のOS /カーネルスレッドを使用しません。代わりに、単一のカーネルスレッド/プロセス内のThreadオブジェクトを切り替えることにより、複数のスレッドを模倣します。
これは、マルチプロセッサ/マルチコアシステムでは重要です。これらのタイプの軽量スレッドはシングルコアでしか実行できないためです。複数のスレッドを使用してもパフォーマンスが大幅に向上することはありません。
これが違いを生むもう1つの場所は、1つのスレッドが(I/Oで待機するか、ドライバーのIOCTLを呼び出す)ブロックし、すべてのスレッドがブロックする場合です。
これは最近ではあまり一般的ではありません-ほとんどのスレッド実装はこれらの問題に悩まされないカーネルスレッドを使用しますが、完全性のためにメンティングする価値があります。
対照的に、forkは、元のプロセスの実行中に別の物理CPUで同時に実行可能な別のプロセスを提供します。 IPC=アプリに適している人もいれば、スレッドを好む人もいます。
頑張って楽しんでね!マルチスレッドはやりがいがあり、やりがいがあります。
スレッドは並行して実行される関数であり、forkは親継承を持つ新しいプロセスです。スレッドはタスクを並行して実行するのに適していますが、フォークは独立したプロセスであり、同時に実行されています。スレッドには競合状態があり、セマフォとロックまたはミューテックスを制御します。パイプはフォークとスレッドの両方で使用できます。