在Linux中, 我有一個名爲foo.so的共享庫文件 當我執行兩個使用foo.so的2個不同進程p1,p2時。 這foo.so是否被這兩個過程重疊?Linux中兩個不同的進程如何調用共享庫文件?
15
A
回答
4
操作系統將共享庫的代碼複製(或更準確地說,映射)到內存中。
然後操作系統給每個進程訪問內存中的那一個副本。
有可能每個進程都將「看到」副本在另一個內存地址上。這由CPU的內存管理單元解決。
它可以得到比這更復雜,但是這基本上是東西Linux和其他Unix相關的操作系統,如Mac OS X中是如何工作的
29
在基於Unix的系統(包括Linux)上,該code segment (.text)可能在多個進程之間共享,因爲它是不可變的。你提到的這個重疊嗎?
基本上,每個包含靜態數據(如全局變量)的共享庫都有Global Offset Table (GOT)。在共享庫上,所有對靜態數據的引用(想到全局變量)都是通過GOT(它們是間接的)發生的。因此,即使代碼段在多個進程之間共享,每個進程都會獨佔映射共享庫的其他段,包括相應的GOT,其條目將相應地重新定位。
總之,只有代碼在進程間共享,而不是數據。但是,根據編譯標誌,我認爲常量可能是一個例外。
我還推薦以下文章:Dynamic Linking and Loading。
相關問題
- 1. 兩個進程共享相同的堆
- 2. 爲什麼2個相同文件的linux進程不能共享文本段?
- 3. 進程VS線程:兩個進程可以共享相同的共享內存嗎?可以兩個線程?
- 4. 調試Linux中的共享庫
- 5. 如何在兩個進程之間協調共享內存
- 6. Linux共享庫
- 7. 兩個project.json文件可以共享相同的代碼庫嗎?
- 8. 兩個不同的類庫共享一個靜態類庫
- 9. Linux - 找不到共享庫
- 10. 如何在共享庫(.so)中的共享庫中使用共享庫的相同進程的實例共享全局變量?
- 11. 進程共享內存不共享(c,linux)
- 12. C中調用一個二進制文件(同時共享文件描述符)
- 13. 兩個不同的Java應用程序共享相同的數據庫
- 14. Linux:鏈接到共享庫時如何使用.pc文件?
- 15. 如何讓Symfony中的兩個應用程序共享組件?
- 16. 如何將共享庫與其他共享庫鏈接到Linux?
- 17. 兩個iPhone應用程序如何共享相同的設置?
- 18. 在linux中的不同共享庫中的數據可見性
- 19. Linux共享庫C++
- 20. 兩個ASP.NET網站共享應用程序文件,但具有不同的web.config
- 21. 兩個不同的進程可以共享相同的DLL數據嗎?
- 22. 如何保護Linux中進程之間共享的內存
- 23. 如何讓兩個django項目共享相同的數據庫
- 24. 兩個進程可以共享相同的類名嗎?
- 25. 可以兩個進程共享相同的GPU內存嗎? (CUDA)
- 26. 使用共享庫的Linux共享庫未定義符號
- 27. 如何共享多個進程的SQL Server CE數據庫文件(.sdf)?
- 28. 如何在一個郵件編輯器中共享兩個不同的內容?
- 29. 如何在共享同一數據庫的兩個不同應用程序之間同步持久性對象?
- 30. Linux:如何將版本信息嵌入共享庫和二進制文件?
爲了強調這一點,unixy系統可以共享或不共享動態庫,但從應用程序的角度來看,兩種實現之間都存在*沒有明顯差異*。幾乎所有類Unix系統都會在進程之間共享代碼,因爲它很容易實現,並且幾乎不需要任何費用就可以很好地保存ram。罕見的例外情況是硬件上帶有弱(或無)MMU的偏執操作系統,因此共享的「文本」可能會導致一個進程破壞另一個進程。 – SingleNegationElimination 2010-12-11 05:26:05