在linux中(1>新進程)和(2>新線程)創建什麼(1>資源共享)和什麼(2>資源創建新的)? 我搜索,但沒有一處提及什麼資源都創造了新的,哪些是共享什麼資源共享,什麼是在linux中創建新進程和創建新線程?
2
A
回答
2
當你調用fork(),並創建一個孩子,在調用fork前母公司所有打開的描述符共享父母和孩子之間。例如,在父級中的套接字,並說父級調用accept,然後調用fork。父母和孩子之間共享連接的套接字。通常,孩子讀寫連接的套接字,然後父節點關閉連接的套接字。
在傳統的UNIX模型中,當父進程需要由另一個實體執行的某些操作時,它會分叉一個子進程並讓子進程執行處理。在這一模式曾好多年也有問題,以及:
叉昂貴。內存從父項複製到子項,所有描述符在子項中重複,等等。最近幾天進行了一些優化,其中複製寫入,其避免了複製直到孩子需要它自己的副本。
雖然從父母到孩子傳遞信息很容易,但相反需要一些工作。並且爲了實現傳遞信息IPC(相互過程通信)是必需的。
所以LINUX引入了clone()。 clone()允許子進程與調用進程共享部分執行上下文,如內存空間,文件描述符表和信號處理程序表。
然後是線程。他們也被稱爲輕量級工藝。根據您的猜測,創建線程比創建進程快10-100倍。進程內的所有線程共享相同的全局內存。這使線程之間的信息共享變得容易,但隨之而來的是同步訪問的要求。
綜上所述,所有線程共享如下:
- 進程信息
- 大多數數據
- 打開文件(如描述符)
- 信號處理函數
- 當前工作目錄
- 用戶和組IDs
但是每個線程都有自己:
- 線程ID
- 組寄存器
- 堆棧的局部變量和返回地址
- 錯誤號
- 信號屏蔽
- 優先
相關問題
- 1. 線程之間共享什麼資源?
- 2. 什麼父進程的東西在Linux中新創建的子進程中共享
- 3. 爲什麼用startAsync創建新線程而不是在servlet線程中工作?
- 4. 爲什麼sql連接在新線程中創建?
- 5. 創建和新建有什麼區別?
- 6. 使用共享資源創建多個線程
- 7. 我是否需要重新創建Direct2D可共享資源?
- 8. 爲什麼線程被多次創建?
- 9. QApplication exec()創建新的線程/進程?
- 10. 爲什麼創建快照還會創建新的基線?
- 11. 爲什麼創建一個新線程昂貴?
- 12. 從創建UI的相同線程更新VCL。爲什麼?
- 13. 什麼會導致進程停止重新創建?
- 14. 爲什麼System.Net.HttpListener創建一個新的進程?
- 15. 與線程共享數據庫連接,而不是創建新的線程
- 16. 進程創建時的Linux進程內核堆棧狀態是什麼?
- 17. 線程創建和子進程創建中系統調用的區別是什麼
- 18. 共享類實例(創建和共享單例)的最佳方式是什麼?
- 19. 爲什麼我們創建新線程並使用join()使父線程等待?
- 20. 多線程共享資源
- 21. 爲什麼在RTC源代碼控制中創建新快照時檢查「創建新基線」
- 22. 什麼是Android以及他們爲什麼創建新的VM?
- 23. 爲什麼我無法在Python中的新線程中創建COM對象?
- 24. Javascript創建新的「線程」
- 25. 爲什麼重新啓動線程時需要重新創建實例?
- 26. 什麼是線程自己創建和主線程運行序列
- 27. 爲什麼在創建新實例時創建DUP
- 28. 什麼是最輕的溶液到創建與狀態的多進程架構跨越所有進程共享
- 29. 爲什麼我的servlet不會在請求中創建新的線程?
- 30. 爲什麼Quartz.NET使用相同的線程ID創建線程?