フォークシステムコールコードはどのように記述されますか。関数が2つの異なる値を返す方法と2つの異なるプロセスを返す方法の詳細を知りたい。要するに、forkシステムコールがどのように実装されているか知りたいですか?フォーク実装
フォーク実装
答えて
あなたはシステムコールであると言ってかなり説明しました。それはすべての作業を行うオペレーティングシステムの仕事であり、オペレーティングシステムは、プログラムのコンテキスト外で、あるいは実装している言語のルールの外で、何でも望みどおりに行うことができます。起こる:
- プログラムが
- カーネルforkシステムコールは、プログラム
- を実行しているプロセスを複製カーネルは元のプログラムのために、重複のためのシステムコール(PIDのための戻り値を設定します
fork()
システムコールを呼び出します複製と0、それぞれ) - カーネルは、両方のプロセスをスケジューラキュー
- 各プロセスがスケジュールされると、カーネルは2つのプログラムのそれぞれに「戻る」。例えば、プロセスのための簡単な方法で
は、のように見えることができます機能にいくつかの命令をスキップしIP/EIP/RIPにレジスタを移動するとfork()
機能でクローン化されています
return pid;
return 0;
最初のプロセスが最初に実行されます命令とポップ機能がスタックから始まるが、2番目の命令は0を返す2番目の命令から開始する。
Carlさんの答えは素晴らしかったです。私は多くのオペレーティングシステムで戻り値がレジスタの1つに渡されることを付け加えたいと思います。 x86アーキテクチャでは、このレジスタはeaxかもしれませんが、ARMアーキテクチャではこのレジスタはR0などである可能性があります。
各プロセスには、プロセス制御ブロック(PCB)があり、割り込み、システムコール、例外が発生し、制御がOSに渡されました。次にスケジュールされたプロセスでは、レジスタの値がPCBから復元されます。今
、フォーク()が発生したときに、OSが行うことができます:プロセスが再スケジュールされている場合
child_process->PCB[return_value_register] = 0;
parrent_process->PCB[return_value_register] = child_pid;
をので、それらのそれぞれは、異なる戻り値を参照してください。
例として、xv6's implementation of forkが表示されます。そこで、親プロセスはまだ実行状態にあるので、単純なreturn文を使用して親の戻り値を返します。しかし、それは子プロセスが予定されているときに、それは戻り値として0を見て、0に子プロセスのためのEAXレジスタの値を設定します。
// Clear %eax so that fork returns 0 in the child.
np->tf->eax = 0;
0を返す注意も「MOVのEAX、0」のようなものにコンパイルされます。
更新:私は趣味のOSでfork()を実装しています。ソースコードはhereです。
- 1. Haskellでどのようにフォークのtry-catchを実装できますか?
- 2. forkmanagerフォーク()関数は、このマシン上で実装されていません
- 3. リストのアレイベースの実装(カーソルの実装)
- 4. XMLドキュメントインターフェイスの実装とクラスの実装
- 5. 実装()
- 6. 実装
- 7. 実装
- 8. 実装
- 9. 実装
- 10. 実装
- 11. 春のStatemachineフォーク
- 12. Windowsのmongodbフォーク
- 13. 差分フォーク
- 14. フォーク/マルチスレッドプロセス| Bash
- 15. フォーク - 親子プログラム
- 16. フォークとexecveセグメンテーションフォールト
- 17. フォークWEBrickにスタート
- 18. フォーク()プロセス挙動
- 19. Cフォークは
- 20. パイプ、フォーク、ノンブロッキングIPC
- 21. フォーク "フリー" sshd?
- 22. Perl - 担当フォーク
- 23. JMHフォーク、スレッド、デバッグ
- 24. Tomcat:java.security.Principalの実装
- 25. アンドロイドカメラ実装
- 26. 実装スレッドキュー
- 27. llvm.pow.f64の実装
- 28. ログウォッチャーの実装
- 29. パーシャルビューの実装
- 30. パーサーの実装
Linuxカーネルのソースコードを試してみることができます... – fge
OSはプロセスを作成できるという考えに慣れており、各プロセスのアドレス空間にマップするメモリ領域を選択できますか? –
これにはどのような点がありますか? – Svisstack