1. ホーム
  2. linux

フォークとスレッディング

2023-07-14 02:35:29

質問

私は以前、私のアプリケーションでスレッドを使用し、その概念をよく知っています。これはスレッディングに似ているものです。

私は両者の違いをグーグル検索し、それを知ることになりました。

  1. フォークは、古いプロセスまたは親プロセスとまったく同じに見える新しいプロセスにすぎませんが、それでも異なるプロセス ID とそれ自身のメモリを持っている別のプロセスです。
  2. スレッドは、より少ないオーバーヘッドを持つ軽量なプロセスです。

しかし、私の頭の中にはまだいくつかの疑問が残っています。

  1. いつスレッドよりもfork()を優先すべきなのか、またその逆は?
  2. 外部アプリケーションを子として呼び出したい場合、fork()とスレッドのどちらを使用すべきでしょうか?
  3. Google検索をしているとき、私は人々がスレッド内でfork()を呼び出すことは悪いことだと言っていることを見つけました。
  4. 親プロセスと子プロセスが同時に実行されないので、fork() はマルチプロセッサシステムを利用できないというのは本当ですか?

どのように解決するのですか?

フォークとスレッドのアプローチの主な違いは、オペレーティング システムのアーキテクチャの 1 つです。Unix が設計された当時、フォーク処理はメインフレームやサーバー タイプの要件に最もよく応える簡単で単純なシステムであり、そのため Unix システムで普及しました。MicrosoftがNTカーネルをゼロから再設計した際、よりスレッドモデルに焦点を当てました。そのため、今日でも、Unixシステムはフォークで効率的に、Windowsはスレッドでより効率的に、という顕著な違いがあります。最も顕著に見られるのは、Unix で prefork 戦略を使用する Apache と、Windows でスレッドプールを使用する Apache でしょう。

あなたの質問に具体的に答えます。

どのような場合にスレッドよりもfork()を優先すべきでしょうか、またその逆も同様でしょうか?

Unixシステムで、Workerのインスタンス化よりもはるかに複雑なタスクを行っている場合、または、個別のプロセスの暗黙のセキュリティサンドボックス化が必要な場合です。

<ブロッククオート

子プロセスとして外部アプリケーションを呼び出したい場合、fork()やスレッドを使用すべきでしょうか?

もし子プロセスが親プロセスと同じタスクを同じコードで実行するのであれば、forkを使用します。より小さなサブタスクにはスレッドを使用します。個別の外部プロセスにはどちらも使用せず、適切なAPIコールで呼び出すだけです。

Google検索をしていると、スレッド内でfork()を呼び出すことは悪いことだと言っている人たちを見つけました。

完全にはわかりませんが、プロセスや多くのサブスレッドを複製するのは計算上かなり高くつくと思います。

<ブロッククオート

親プロセスと子プロセスが同時に実行されないので、fork()はマルチプロセッサシステムを利用できないって本当ですか?

forkは新しいプロセスを作成し、OSのタスクスケジューラでプロセスに利用可能なすべての機能を利用します。