2016-02-10 46 views
0

我有一個巨大的應用程序,需要在某個時刻自行分叉。該應用程序是多線程的,有大約200MB的分配內存。我現在要做的事情是確保進程分配的數據不會被重複,以便在此線程內啓動一個新的線程和分支。從我讀過的內容來看,只有調用fork的線程纔會被複制,但分配的內存會發生什麼情況?那還會在那裏嗎?這樣做的目的是用其他啓動參數重新啓動應用程序,當它分叉時,它將用我的新參數調用main,從而有希望獲得同一程序的新進程。現在,在你問:我不能保證該進程的二進制文件與我開始進程時的位置保持一致,否則我只能在/proc/self/exe中使用forkexec什麼。分叉時分配給其他線程的內存會發生什麼

+0

相關:http://stackoverflow.com/questions/27161412/how-does-copy-on-write-work-in-fork – zneak

回答

0

線程是執行單元內的一大進程資源。一個進程是您可以從進程中的任何線程訪問的全部內容:所有線程,所有文件描述符以及所有其他資源。所以內存絕對不是綁定到一個線程,並從一個線程分叉沒有有用的影響。 由於分叉點正在創建一個新進程,因此仍然需要複製一切

也就是說,Linux有一些技巧可以讓它更快。複製2千兆字節的內存既不快也不高效。因此,當你分叉時,Linux實際上給予新進程相同的內存(起初),但它使用虛擬內存系統將其標記爲寫時複製:一旦一個進程需要寫入該內存,內核攔截它並分配不同的內存,以便其他進程不受影響。

相關問題