vforkが呼び出されると、親プロセスは実際に一時停止しますか?

vforkが呼び出されると、親プロセスは実際に一時停止しますか?

私が知る限り、vfork呼び出されると、子プロセスは親プロセスと同じアドレス空間を使用し、親プロセスのss変数で子プロセスが変更したものは親プロセスに反映されます。私の質問は次のとおりです

  • 子プロセスが作成されると、親プロセスは一時停止されますか?
  • では、なぜそうなのでしょうか?
  • スレッドのように並列に実行できますか?結局のところ、スレッドとプロセスは両方とも同じclone()関数を呼び出します。

ちょっとした調査やインターネット検索の最後に、親プロセスが実際に中断されるのではなく、呼び出しスレッドが中断されることを知りました。それにもかかわらず、子プロセスが実行されたとき、exit()またはexec()親プロセスは子プロセスが終了したことをどのように知ることができますか?子プロセスから戻るとどうなりますか?

ベストアンサー1

あなたの問題は部分的に間違った命名規則に基づいています。カーネルの「制御スレッド」はユーザーのプロセスです。したがって、vforkの「呼び出しスレッドが中断されました」を読むときは、「マルチスレッドプロセス」の「スレッド」ではなく「プロセス」(または必要に応じて「重いスレッド」)を考えてください。

  • はい、親プロセスが中断されました。

vfork意味スキームは、あるプロセス(最も一般的にはシェル)が分岐し、一部のファイル記述子を混乱させ、exec他のプロセスがその場所に代わる非常に一般的な状況に対して定義されます。カーネルの人々はexecコピーされたページだけを捨てるので、コピーをスキップするとページのコピーオーバーヘッドを大幅に減らすことができることに気づきました。 vforked 子プロセスにはカーネルに独自のファイル記述子テーブルがあるため、その操作は親プロセスに影響を与えず、セマンティクスは変更されませforkん。

  • なぜ?フォーク/実行は一般的で費用がかかり、無駄です。

「カーネル制御スレッド」のより正確な定義を考慮すると、並列に実行できるかどうかに対する答えは次のとおりです。

  • いいえ。親プロセスは、子プロセスが終了または実行されるまでカーネルによってブロックされます。

両親は、子どもが自退したことをどのように知ることができますか?

  • これは事実ではなく、カーネルは、子プロセスが離れるまで親プロセスがCPUを取得するのを知り、防止します。

最後の質問については、カーネルがリターンに関連する子スタック操作を検出し、キャッチできないシグナルで子プロセスにシグナルを送信したり直接終了したりすると疑われますが、詳細はわかりません。

おすすめ記事