fork創建進程的步驟

fork創建進程的步驟

我們都知道,在Linux中調用fork()函數,會創建一個子進程,那麼在創建這個子進程的過程中,發生了些什麼事情?

首先,我們要知道,fork()函數其實是調用發起_fork()系統調用,控制權由用戶態轉爲內核態,

內核會分配新的內存塊和內核數據結構給子進程(也就是PCB task_struct結構體),

然後內核會將父進程的部分數據內容以二進制形式拷貝到子進程,

下來再將所謂的子進程PCB加入到管理鏈表中(操作系統管理進程就是將程序用PCB描述,用鏈式結構進行管理),

然後從內核態返回用戶態(父進程fork返回進程pid,子進程返回0),

後開始調度器調度。

但是我們要注意一點,fork之前父進程獨立執行,fork之後父子進程分別執行自己的執行流,但是誰先執行由調度器調度。

這裏還有一點需要注意,當子進程剛被創建出來,父子進程不再寫入的時候,父子進程是數據共享一份,代碼獨有,但是當有任意一方試圖寫入數據的時候,便已寫時拷貝的方式各自擁有一份數據

這就是所謂的寫時拷貝。

當然當然,fork()也有可能調用失敗,fork()調用失敗的理由也就這兩種?

系統中有太多的進程,資源不夠

實際用戶的進程超過了限制

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章