我有一個巨大的應用程序,需要在某個時刻自行分叉。該應用程序是多線程的,有大約200MB的分配內存。我現在要做的事情是確保進程分配的數據不會被重複,以便在此線程內啓動一個新的線程和分支。從我讀過的內容來看,只有調用fork
的線程纔會被複制,但分配的內存會發生什麼情況?那還會在那裏嗎?這樣做的目的是用其他啓動參數重新啓動應用程序,當它分叉時,它將用我的新參數調用main
,從而有希望獲得同一程序的新進程。現在,在你問:我不能保證該進程的二進制文件與我開始進程時的位置保持一致,否則我只能在/proc/self/exe
中使用fork
和exec
什麼。分叉時分配給其他線程的內存會發生什麼
0
A
回答
0
線程是執行單元內的一大進程資源。一個進程是您可以從進程中的任何線程訪問的全部內容:所有線程,所有文件描述符以及所有其他資源。所以內存絕對不是綁定到一個線程,並從一個線程分叉沒有有用的影響。 由於分叉點正在創建一個新進程,因此仍然需要複製一切。
也就是說,Linux有一些技巧可以讓它更快。複製2千兆字節的內存既不快也不高效。因此,當你分叉時,Linux實際上給予新進程相同的內存(起初),但它使用虛擬內存系統將其標記爲寫時複製:一旦一個進程需要寫入該內存,內核攔截它並分配不同的內存,以便其他進程不受影響。
相關問題
- 1. 線程分配內存,主進程死亡,會發生什麼?
- 2. 分叉後運行線程會發生什麼?
- 3. 先前分配對象的內存會發生什麼?
- 4. 在函數中分配的內存會發生什麼?
- 5. 如果kmem_cache沒有可用內存分配會發生什麼?
- 6. 取消時線程的內存會發生什麼變化?
- 7. 分叉過程的stdout和stdin會發生什麼?
- 8. ,當您分配多個虛擬內核時會發生什麼?
- 9. 當運行時JVM內存不足以分配時會發生什麼?
- 10. 當主線程調用sys.exit()時,其他線程會發生什麼?
- 11. 當一個線程被阻塞時,其他線程會發生什麼?
- 12. 刪除時雙向鏈表中動態分配的內存會發生什麼?
- 13. 鎖定傳遞給其他線程的對象會發生什麼?
- 14. 我在Ruby中分配給$ stdout的對象會發生什麼?
- 15. 爲什麼BitmapData.copyPixels會分配內存?
- 16. 在C#中重新分配數組時,內存會發生什麼變化?
- 17. 將內存分配函數用作條件語句時會發生什麼
- 18. 內存分配與線程
- 19. 如果您將值分配給$ _REQUEST,會發生什麼情況?
- 20. 生成器函數分配時會發生什麼?
- 21. 將會話變量分配給視圖狀態時會發生什麼?
- 22. 如果您未將其分配給變量,會發生什麼情況?
- 23. 進程啓動時分頁(虛擬內存)系統中會發生什麼?
- 24. 當包含lambda的類型被分配時會發生什麼?
- 25. 如果構造函數拋出`new`分配的內存會發生什麼?
- 26. 內存分配使用新的非類指針會發生什麼
- 27. 爲什麼程序分配的內存不會減少?
- 28. 當進程訪問剛分配給brk/sbrk的地址時,內核會發生什麼?
- 29. 將零分配給指針會銷燬分配的內存嗎?
- 30. 以調試模式啓動CQ。分叉會發生什麼
相關:http://stackoverflow.com/questions/27161412/how-does-copy-on-write-work-in-fork – zneak