79

以前にアプリケーションでスレッドを使用したことがあり、その概念をよく知っていますが、最近、オペレーティング システムの講義で fork() に出会いました。これは、スレッド化に似たものです。

私はグーグルでそれらの違いを検索し、次のことを知りました:

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

しかし、私の心にはまだいくつかの疑問があります。

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

3 に答える 3

19

fork()あなたが指摘したように、プロセスの新しいコピーを生成します。上記で言及されていないのは、exec()よく続く呼び出しです。これにより、既存のプロセスが新しいプロセス (新しい実行可能ファイル) に置き換えられます。そのため、fork()/exec()は古いプロセスから新しいプロセスを生成する標準的な手段です。

たとえば、シェルがコマンドラインからプロセスを呼び出す方法です。プロセス (lsなど) を指定し、シェルのフォークを指定してから execs を指定しますls

これは、スレッド化とはまったく異なるレベルで動作することに注意してください。スレッド化は、プロセス内で複数行の実行を実行します。フォークは、新しいプロセスを作成する手段です。

于 2013-05-03T08:26:31.040 に答える