fork之後,父子進程的先後執行順序如何反映?

我知道父子線程的先後執行關係取決於調度演算法,但又沒有什麼方法可以顯示出這種先後關係呢?

我試過time輸出,但時間太短,反應不出來差別。

也想過使用大量內存空間,可能會使fork更慢,但由於寫時複製,也可能反應不出來差別。

謝各位大牛。


父進程子進程誰先運行?未規定。Unspecified。Make no assumption。如果你希望你的代碼是可移植的,而不是可能暗中與某個架構某個OS的某個版本耦合,對這類問題你恰恰不應該去「看源碼」或者「做實驗」得出一個看似牛逼的結論並依賴它。標準沒規定,就不要做任何假設。

fork完以後父進程子進程誰先運行?未規定。不知道。各種可能都有,各種可能都要考慮。以上。Don"t go further.

更新:之前用詞不準,已經更正。多謝陳碩和暮無井見鈴二位指正!


你有沒有想過,在多核機器上,父子進程可以同時執行,沒有先後之分,你問的「先後順序」這個問題可能是無意義的。

Does the Linux scheduler prefer to run child process after fork()?

Does /proc/sys/kernel/sched_child_runs_first work?


你先把「先後關係」的定義寫出來,你這個問題就不存在了。


隨便輸出點東西(帶換行)來判斷就好了,先輸出的先執行

也可以用消息和信號,先收到信號的後執行:多核的話這個可能不太靠譜

可以用共享內存,不過……


上面的結論一般來說是正確的,但原因是做exec而不是cow,補幾句。從策略角度說為什麼讓子進程先執行好呢?

設想下面情況,當前進程有大量的內存佔用,此時進行fork,所有的父進程頁面由於cow會進入保護狀態。

1,由於父進程有傾向於寫它自己的頁面,因此每一次寫頁面都會導致潛在的頁中斷來為父子進程進行頁拷貝分離。

2,但是對於子進程呢?它未必需要父進程的的頁面,甚至可以說立刻執行了exec放棄所有內存資源。

於是,如果先執行父進程,而讓子進程休眠,就會出現1)裡面一些無用的工作。

如果先執行子進程,做exec,那麼顯然可以節省由於cow導致的頁面拷貝問題。

在子進程不做exec情況下,誰先誰後都沒有太大區別。

在我個人實踐中,甚至可以說做fork都要經過一些代碼設計來保證子進程優先運行。也設計過代理執行的方法,尤其在嵌入式系統中。

Linux內核bug還是不少的。


這個問題首先沒意義

其次沒定義


fork有兩個返回值,一個是子進程的pid返回給父進程,一個為0返回子進程,根據這個關係,寫個分支測一測應該可以吧。

如果想保證父子進程的順序,可以來考慮用vfork函數。


調用fork()後,無法確定父、子進程間誰將率先訪問CPU。

  • 多處理器系統中,它們可能會同時各自訪問一個CPU。
  • 單處理器系統中,fork()之後很可能總是先調度父進程(優化性能),但如果恰好父進程的CPU時間片到期了,則執行子進程。

要想保證按一特定順序執行,必須採用相應的同步機制。

參考:Linux/UNIX系統編程手冊

24.4 fork()之後的競爭條件(Rece Condittion)


我記得通常是子進程先執行的,大概是因為子進程通常要做COW,具體原因我回去看了代碼再來補充。


不知道這段代碼有沒有解決題主的問題。

#include &
#include &
int main() {
puts(fork()?"parent":"child");
return 0;
}

我測試下來都是parent先執行。


一般來說,子進程先運行。

父進程 fork 出來子進程一般會回歸到Ready隊列。

父子進程間存在寫時複製技術,即共享一份物理空間,當兩個進程其中一個對變數更改時複製一份給子進程,假如父進程先調用的話那有很大概率去更改共享的變數,那此項技術變得完全沒意義。通常的做法就是fork出的子進程執行exec清空堆棧區重新執行一段代碼。

個人見解,寫的不對的話請各位大佬批評


想了一下,如果只是想得到先後順序,用CAS應該就可以

fork之後,父子進程都去cas某個共享的內存地址,並列印cas是否成功

*p = 0;

cas(p,0,pid);

1. 假設兩個cas都成功,那麼是p保存的是後執行的pid

2. 假設只有一個cas成功,那麼p保存的是先執行的pid


沒有


我記得優先執行子進程,防止過多的cow ,因為一般情況下fork 之後,子進程即執行exec ,如果先執行父進程,此時存在cow 。


Linux有意讓子進程先執行,但是不保證


父進程先執行cow


看源碼


推薦閱讀:

php fpm 進程數和並發數是什麼關係?
驅動程序是不是進程?
我一個朋友竟然告訴我計算機處理多進程是排隊處理,計算機無法同時處理多個進程。我應該怎麼說服他?
線程和進程的區別是什麼?
操作系統的系統開銷比率怎麼計算?

TAG:程序員 | 操作系統 | Linux | 計算機科學 | 進程 |