关于fork
關于fork
之前和同學討論了一個關于fork的問題,之前自己也是稍微看過一點,但是具體的也不是太了解,這樣還是很不好的。
具體的問題來源于一個面試題,大概是問 fork||fork操作會生成幾個新的進程
類似的面試題,也有,比如更復雜一點的情況,參考這個:
http://blog.csdn.net/hs794502825/article/details/10242091
###再簡單回顧一下fork
fork主要的功能就是說,把已有的一個進程復制一個出來,這兩個新的進程幾乎完全是一樣的。
執行fork之后,生成的兩個進程每個都會啟動一個從同一位置開始執行的線程,執行到fork函數中的時候,子進程就會復制父進程的堆棧段,所以兩個進程實際上都陷入在fork中,還沒有執行完,這樣的話,fork其實可能有兩種不同的返回值,一個是原先的父進程的fork執行完之后的返回值,另一個是新生成的子進程的fork得到的返回值。
當然兩種返回值是不同的:
父進程中,fork函數的返回值是子進程的ID
子進程中,fork函數的返回值是0
如果出錯,則返回最值是-1
可以這樣理解,父進程實質上沒變,多出來的子進程復制了父進程的堆棧,父進程要對其有一個引用,就像一個鏈表一樣,因此就返回了子進程的id,而子進程沒有新生成的進程可以引用,就返回了0。系統就是根據返回值來區別到底是父進程還是子進程的。
實際上在調度的時候也無法知道當前到底是父進程還是子進程,這個需要探討更底層的實現,因此,通常用fork函數的返回值來判斷到底當前是父進程還是子進程,之后再執行對應的操作。
再回顧下那個題目
就是先前列出的博客里的
第一次fork 生成了一個新的進程,此時有兩個進程
第二次 fork && fork || fork 按照博客里的圖,每一個最上端的父進程會生成了四個新的進程(中間有好幾次是新生成的子進程又充當了父進程),開始的時候有,經過第一次的操作,有兩個進程,它們分別作為最頂端的父進程,這樣就生成了4+4=8個新的進程
第三次 又fork 經過了前兩步的操作 已經有10個進程了 每個進程執行一次fork會新生成一個新的進程 這樣就又生成了10個新的進程 于是整個過程就一共產生了 10+8+1=19 個新的進程
再這個基礎上,單純的 fork || fork 操作應該是新生成了兩個進程
相關參考資料
(這個來龍去脈講的比較透徹)http://www.cnblogs.com/hicjiajia/archive/2011/01/20/1940154.html
總結
- 上一篇: Asp.Net_文件操作基类
- 下一篇: yii1.1分页不起作用怎么办