2012-06-26 27 views

回答

2

分叉創建整個過程的獨立副本 - 代碼和數據 - 除I/O句柄之外的所有內容。因此,增加程序內存佔用量的任何事情(在邊緣)都會使fork操作花費更長時間。

對於處理大量數據和多個子進程的程序,需要考慮的一件事是使父進程的佔用空間儘可能小,並在子進程啓動後加載數據。

+0

在fork()之後,I/O句柄由兩個進程保持打開狀態。 –

5

不是Perl的問題,因爲fork是系統調用。這個過程是否是Perl並不重要,它總是做同樣的事情。它並不關心進程的內部部分,只有總內存大小有效。

現代操作系統如Linux實現COW,所以fork通常返回非常快,對於每個進程幾乎相同。

+1

Perl中的'fork'是函數,它反過來會調用'fork'系統調用。沒有任何東西可以阻止Perl在其周圍進行一些預處理/後處理,例如,它可以處理其他系統設施,例如信號。 –

+0

而前/後處理是...... [沒有什麼相關的,真的](http://perl5.git.perl.org/perl.git/blob/HEAD:/pp_sys.c#l4026)。 – daxim

1

fork本身不使用存儲器。父進程的內存頁面與子進程共享,直到子進程嘗試寫入共享頁面爲止,此時創建頁面的副本,以便每個進程都擁有自己的頁面副本。

如果代碼和只讀數據與可寫數據分離,則會導致許多頁面始終被共享。

但是,在Perl中沒有代碼和數據的分離。操作碼不僅與數據在同一個內存池中創建,操作碼具有可寫組件!這意味着一個分岔的孩子通常最終最終會被分享,我想。

要知道,當你的進程正在運行時,你必須挖掘出ps

3

正如其他人所說的那樣,簡短的回答是,代碼/數據量對性能的影響超出了系統實現所普遍暗示的性能。

但是,在調用fork,per the documentation之前,perl本身會刷新打開的文件句柄。所以,是的,打開的perl文件句柄的數量對fork()性能有一定的影響。

(螺紋perl的建立也將我的系統上拋出內部互斥鎖保護的內存分配,至少在5.16小,像內部同步可能會有所不同,從系統到系統,並從Perl的版本Perl版本。)