私が知る限り、vfork
呼び出されると、子プロセスは親プロセスと同じアドレス空間を使用し、親プロセスのss変数で子プロセスが変更したものは親プロセスに反映されます。私の質問は次のとおりです
- 子プロセスが作成されると、親プロセスは一時停止されますか?
- では、なぜそうなのでしょうか?
- スレッドのように並列に実行できますか?結局のところ、スレッドとプロセスは両方とも同じ
clone()
関数を呼び出します。
ちょっとした調査やインターネット検索の最後に、親プロセスが実際に中断されるのではなく、呼び出しスレッドが中断されることを知りました。それにもかかわらず、子プロセスが実行されたとき、exit()
またはexec()
親プロセスは子プロセスが終了したことをどのように知ることができますか?子プロセスから戻るとどうなりますか?
ベストアンサー1
あなたの問題は部分的に間違った命名規則に基づいています。カーネルの「制御スレッド」はユーザーのプロセスです。したがって、vforkの「呼び出しスレッドが中断されました」を読むときは、「マルチスレッドプロセス」の「スレッド」ではなく「プロセス」(または必要に応じて「重いスレッド」)を考えてください。
- はい、親プロセスが中断されました。
vfork
意味スキームは、あるプロセス(最も一般的にはシェル)が分岐し、一部のファイル記述子を混乱させ、exec
他のプロセスがその場所に代わる非常に一般的な状況に対して定義されます。カーネルの人々はexec
コピーされたページだけを捨てるので、コピーをスキップするとページのコピーオーバーヘッドを大幅に減らすことができることに気づきました。 vforked 子プロセスにはカーネルに独自のファイル記述子テーブルがあるため、その操作は親プロセスに影響を与えず、セマンティクスは変更されませfork
ん。
- なぜ?フォーク/実行は一般的で費用がかかり、無駄です。
「カーネル制御スレッド」のより正確な定義を考慮すると、並列に実行できるかどうかに対する答えは次のとおりです。
- いいえ。親プロセスは、子プロセスが終了または実行されるまでカーネルによってブロックされます。
両親は、子どもが自退したことをどのように知ることができますか?
- これは事実ではなく、カーネルは、子プロセスが離れるまで親プロセスがCPUを取得するのを知り、防止します。
最後の質問については、カーネルがリターンに関連する子スタック操作を検出し、キャッチできないシグナルで子プロセスにシグナルを送信したり直接終了したりすると疑われますが、詳細はわかりません。