Slide 1

Slide 1 text

プロセスの生成 fork&exec編 Dec. 29th, 2024 Satoru Takeuchi X: satoru_takeuchi 1

Slide 2

Slide 2 text

はなすこと ● あるプログラムを実行しているプロセスから別のプログラムを別プロセスとして実行 する方法 ○ 要するに「bashからechoコマンドを実行するコードはどうなっているのか?」ということ ● forkの後にexecを呼ぶことで実現する 2

Slide 3

Slide 3 text

fork&exec: CPU上で動作する処理の観点 1. CPU0上で動く親プロセスがfork()を呼ぶ 2. fork()後にCPU0上で親プロセスが、CPU1上で子プロセスが動く 3. 子プロセスがexec()を呼びプログラムBを実行 3 CPU0 CPU1 fork()呼び出し fork()から復帰 fork()から復帰 親プロセス (プログラムA) カーネル 親プロセス (プログラムA) 子プロセス (プログラムA) 処理が分岐(fork) カーネル 子プロセス (プログラムB) exec()呼び出し exec()から復帰

Slide 4

Slide 4 text

fork&exec: 物理メモリの観点 4 親プロセスの メモリ (プログラムA) (1) fork呼び出し時 カーネルの メモリ 親プロセスの メモリ (プログラムA) カーネルの メモリ 子プロセスの メモリ (プログラムA) CPU0上で 実行中のコード (2) fork()復帰後 (3) exec()復帰後 CPU0上で 実行中のコード CPU1上で 実行中のコード 親プロセスの メモリ (プログラムA) カーネルの メモリ 子プロセスの メモリ (プログラムB) CPU1上で 実行中のコード CPU0上で 実行中のコード

Slide 5

Slide 5 text

コード: fork-and-exec.py #!/usr/bin/python3 import os, sys ret = os.fork() if ret == 0: print("子プロセス: pid={}, 親プロセスのpid={}".format(os.getpid(), os.getppid())) os.execve("/bin/echo", ["echo", "pid={} からこんにちは ".format(os.getpid())], {}) exit() elif ret > 0: print("親プロセス: pid={}, 子プロセスのpid={}".format(os.getpid(), ret)) exit() sys.exit(1) 5

Slide 6

Slide 6 text

実行結果 $ ./fork-and-exec.py 親プロセス: pid=137998, 子プロセスのpid=137999 子プロセス: pid=137999, 親プロセスのpid=137998 pid=137999 からこんにちは 6

Slide 7

Slide 7 text

まとめ ● あるプログラムを実行しているプロセスから別のプログラムを別プロセスとして実行 するにはforkとexecを併用する ○ まわりくどいうようだが本当にこうなっている ○ こういうことをするposix_spawnという関数もあるが、内部的には fork,execを順番に呼び出している だけ ● 過去動画で説明した「CoWを使った実際のfork」の挙動がわかればうれしさがわ かってくる。これについては後日紹介 7