Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

はじめに ● Linuxで新しいプロセスを生成する関数, forkについて説明 ● 備考 ○ forkは難しい。初見でわからなくても問題ない ○ Linuxの実際のforkの挙動ではなく、その簡略版の説明をしている ■ ここで説明するコピーオンライトの仕組みを使わないもの ■ コピーオンライトも一気に説明するのは消化不良になりそうなので、そっちは後日説明 2

Slide 3

Slide 3 text

fork()とは ● プロセスを生成する関数 ● プロセスの生成といえば「bashがechoプログラムを新規作成」というようなイメージ を持つと思うが、forkがやることは異なる ● forkがやるのは「実行中のプログラムの複製」 ○ 実行の流れを分岐させるので forkという名前が付いている ● 「bashがechoプログラムを新規作成」ということをしたければfork()の後にexec()を 呼び出す ○ exec()については後日説明 3

Slide 4

Slide 4 text

fork(): CPU上で動作する処理の観点 ● CPU0上で動く親プロセスがfork()を呼ぶ ● fork()後にCPU0上で親プロセスが、CPU1上で子プロセスが動く 4 CPU0 CPU1 fork()呼び出し fork()から復帰 fork()から復帰 親プロセス カーネル 親プロセス 子プロセス 処理が分岐(fork)

Slide 5

Slide 5 text

fork: 物理メモリの観点 5 親プロセスの メモリ (1) fork呼び出し時 カーネルの メモリ 親プロセスの メモリ カーネルの メモリ 親プロセスの メモリ カーネルの メモリ コピー 子プロセスの メモリ 子プロセスの メモリ CPU0上で 実行中のコード (2) カーネルによるfork()の処理 (3) fork()復帰後 CPU0上で 実行中のコード CPU0上で 実行中のコード CPU1上で 実行中のコード

Slide 6

Slide 6 text

コード: fork.py #!/usr/bin/python3 import os, sys ret = os.fork() if ret == 0: print("子プロセス: pid={}, 親プロセスのpid={}".format(os.getpid(), os.getppid())) exit() elif ret > 0: print("親プロセス: pid={}, 子プロセスのpid={}".format(os.getpid(), ret)) exit() sys.exit(1) 6

Slide 7

Slide 7 text

まとめ ● Linuxではfork()関数でプロセスを生成する ● 全く別のプログラムからプロセスを生み出すのではなく、同じプロセスを複製する ○ 別プログラムの実行には exec()を使う 7