fork复制进程
1.fork方法的定義
pid_t fork(void) ;
函數返回類型 pid_t 實質是 int 類型,Linux 內核 2.4.0 版本的定義是:
fork 函數會新生成一個進程,調用 fork 函數的進程為父進程,新生成的進程為子進程。
在父進程中返回子進程的 pid,在子進程中返回 0,失敗返回-1。
2.父子進程并發運行
入下為fork.c代碼:
如下圖為運行結果:
/bin/bash的pid = 33977,main的ppid = 33977,可見main父進程是/bin/bash。
我們會發現父子進程會交換打印,并不是先打印完父子進=進程中的一個,很顯然,父子進程在并發運行。
3.父子進程邏輯地址與物理地址和寫時拷貝
在上圖中我們打印了n的地址,發現父進程的n的地址與子進程的n的地址是同一個值,難道父子進程用的是同一個n?答案并非如此。代碼中我們也注意父進程的n值我們賦值為7,子進程中的n我們負值為4,父子進程n值不同,顯然不是 同一個n。那為什么n的地址值會相同呢?
在計算機基礎中我們說了頁表的問題。這里n值是邏輯地址,并非我們真實的物理地址。以下內容請先移步到計算機基礎,看完再看以下內容。
當我們fork()一個進程的時候,系統會增加一個PCB(進程控制塊),將父進程完全復制一份,包括頁表(頁表包含邏輯頁,物理頁。這也是為什么父進程的變量值和子進程的變量值的邏輯地址相同的原因),構成現在的子進程。一開始父進程的頁表和子進程的頁表一樣,所有變量的邏輯地址和物理地址都一樣,這也意味著真正意義上的共享物理空間。當子進程或者父進程單獨對變量進行修改的時候,這時候才會進行真實物理空間的拷貝,再修改,父子進程對這一變量不再實行共享。這就是寫時拷貝。
總結
- 上一篇: printf函数与主函数问题
- 下一篇: fork练习、从进程角度考虑堆区内存申请