web-dev-qa-db-ja.com

forkとthreadの違いは何ですか?

フォークとスレッドの違いを誰でも説明できますか?

86
Pavunkumar

フォークは、同じコードセグメントで、現在のプロセスのコピーであるまったく新しいプロセスを提供します。メモリイメージが変更されると(通常、これは2つのプロセスの動作が異なるため)、メモリイメージが分離されます(コピーオンライト)が、実行可能コードは変わりません。タスクは、いくつかの プロセス間通信(IPC) プリミティブを使用しない限り、メモリを共有しません。

1つのプロセスが複数のスレッドを持つことができ、それぞれがプロセスの同じコンテキスト内で並列に実行されます。メモリおよびその他のリソースはスレッド間で共有されるため、一部のプリミティブオブジェクトおよび同期オブジェクト( mutexescondition variables および semaphores など)を介して共有データにアクセスする必要があります)データ破損を回避できます。

83
Dacav

フォーク:

フォークは、古いプロセスまたは親プロセスとまったく同じように見える新しいプロセスに他なりませんが、それでもプロセスIDが異なり、独自のメモリを持つ別のプロセスです。親プロセスは、子用に個別のアドレススペースを作成します。親プロセスと子プロセスの両方が同じコードセグメントを所有していますが、互いに独立して実行されます。

フォークの最も簡単な例は、unix/linuxのシェルでコマンドを実行する場合です。ユーザーがコマンドを発行するたびに、シェルは子プロセスをフォークし、タスクが完了します。

Forkシステムコールが発行されると、親プロセスに対応するすべてのページのコピーが作成され、子プロセス用にOSによって別のメモリ位置にロードされますが、場合によってはこれは必要ありません。 「exec」システムコールのように、execvは親プロセス自体のアドレス空間を置き換えるため、親プロセスページをコピーする必要はありません。

フォークについて注意すべき点は次のとおりです。

  • 子プロセスは、独自の一意のプロセスIDを持ちます。
  • 子プロセスには、親のファイル記述子の独自のコピーが必要です。
  • 親プロセスによって設定されたファイルロックは、子プロセスによって継承されません。
  • 親プロセスで開いているセマフォは、子プロセスでも開いている必要があります。
  • 子プロセスには、親のメッセージキュー記述子の独自のコピーが必要です。
  • 子供には、独自のアドレススペースとメモリがあります。

スレッド:

スレッドは軽量プロセス(LWP)です。従来、スレッドはCPU(およびその他の最小状態)状態であり、プロセスには残り(データ、スタック、I/O、信号)が含まれています。システムはプロセスの新しいシステム仮想メモリ空​​間と環境を初期化しないため、スレッドは「フォーク」または新しいプロセスの生成よりもオーバーヘッドが少なくて済みます。プロセスフローを別のプロセッサで実行するようにスケジュールできるマルチプロセッサシステムで最も効果的であるため、並列処理または分散処理によって速度が向上しますが、I/Oおよびプロセスを停止する可能性のある他のシステム機能のレイテンシを活用するユニプロセッサシステムでも向上が見られます実行。

同じプロセス共有のスレッド:

  • プロセス指示
  • ほとんどのデータ
  • ファイルを開く(記述子)
  • シグナルとシグナルハンドラー
  • 現在の作業ディレクトリ
  • ユーザーIDとグループID

詳細は こちら をご覧ください。

69
GeekRide

Dacavの答えは素晴らしいです。すべてのスレッドモデルが真のマルチプロセッシングを提供するとは限りません。

たとえば、Rubyのデフォルトのスレッド実装は、真のOS /カーネルスレッドを使用しません。代わりに、単一のカーネルスレッド/プロセス内のThreadオブジェクトを切り替えることにより、複数のスレッドを模倣します。

これは、マルチプロセッサ/マルチコアシステムでは重要です。これらのタイプの軽量スレッドはシングルコアでしか実行できないためです。複数のスレッドを使用してもパフォーマンスが大幅に向上することはありません。

これが違いを生むもう1つの場所は、1つのスレッドが(I/Oで待機するか、ドライバーのIOCTLを呼び出す)ブロックし、すべてのスレッドがブロックする場合です。

これは最近ではあまり一般的ではありません-ほとんどのスレッド実装はこれらの問題に悩まされないカーネルスレッドを使用しますが、完全性のためにメンティングする価値があります。

対照的に、forkは、元のプロセスの実行中に別の物理CPUで同時に実行可能な別のプロセスを提供します。 IPC=アプリに適している人もいれば、スレッドを好む人もいます。

頑張って楽しんでね!マルチスレッドはやりがいがあり、やりがいがあります。

29
Sam Post
  1. スレッドは、スレッドを作成したプロセスのアドレス空間を共有します。プロセスには独自のアドレス空間があります。
  2. スレッドは、プロセスのデータセグメントに直接アクセスできます。プロセスには、親プロセスのデータセグメントの独自のコピーがあります。
  3. スレッドは、そのプロセスの他のスレッドと直接通信できます。プロセスは、兄弟プロセスと通信するためにプロセス間通信を使用する必要があります。
  4. スレッドにはオーバーヘッドがほとんどありません。プロセスにはかなりのオーバーヘッドがあります。
  5. 新しいスレッドは簡単に作成できます。新しいプロセスでは、親プロセスの複製が必要です。
  6. スレッドは、同じプロセスのスレッドをかなり制御できます。プロセスは、子プロセスのみを制御できます。
  7. メインスレッドの変更(キャンセル、優先度の変更など)は、プロセスの他のスレッドの動作に影響する場合があります。親プロセスへの変更は子プロセスに影響しません
6
Varun Chhangani

スレッドは並行して実行される関数であり、forkは親継承を持つ新しいプロセスです。スレッドはタスクを並行して実行するのに適していますが、フォークは独立したプロセスであり、同時に実行されています。スレッドには競合状態があり、セマフォとロックまたはミューテックスを制御します。パイプはフォークとスレッドの両方で使用できます。

5
sergio