Introduction
What is fork()?
fork 這個 system call 會創造一個和 parent process 完全相同的複製體並且擁有自己的 PCB 及 virtual memory
Function Prototype
#include <sys/types.h>
#include <unistd.h>
pid_t fork(void)Example
if ((pid = fork()) < 0) {
err_sys("fork error");
}
else if (pid == 0) {
... // child process
}
else {
... // parent process
}Detail
Feature
- 除了 boot program 以外唯一創造新 process 的方法
- 回傳值,我們可以依此來分辨 parent process 和 child process
- 如果是 parent process,則回傳 child pid
- 如果是 child process,則回傳 0
- 我們沒辦法知道 parent 還是 child process 會先跑(這是 CPU scheduling 決定的)
- PCB 和 virtual memory 都是複製而非共用(除了 text segment,因為 program 的程式碼不變)
- 使用 Copy-on-Write (CoW) 節省記憶體
File Sharing
因為 fork 複製了 file descriptor table,所以他們連到了相同的 open file table objects
Inheritance
parent 和 child process 的多數的特性都是被繼承的,而沒被繼承的有
- return value of fork()
- process id
- parent id
- cpu time
- file locks (因為跟著 process)
Why fork()
- 讓不同 process 去跑程式碼的不同部分
- 想要跑不同的 program (用
exec()改 virtual memory 的 text segment 部分)
vfork
- 大部分地方和
fork相同,但和 parent process 共享 virtual memory - child process 在跑的時候會 suspend parent process