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