2010-12-11 73 views

回答

4

操作系統將共享庫的代碼複製(或更準確地說,映射)到內存中。

然後操作系統給每個進程訪問內存中的那一個副本。

有可能每個進程都將「看到」副本在另一個內存地址上。這由CPU的內存管理單元解決。

它可以得到比這更復雜,但是這基本上是東西Linux和其他Unix相關的操作系統,如Mac OS X中是如何工作的

29

在基於Unix的系統(包括Linux)上,該code segment (.text)可能在多個進程之間共享,因爲它是不可變的。你提到的這個重疊嗎?

基本上,每個包含靜態數據(如全局變量)的共享庫都有Global Offset Table (GOT)。在共享庫上,所有對靜態數據的引用(想到全局變量)都是通過GOT(它們是間接的)發生的。因此,即使代碼段在多個進程之間共享,每個進程都會獨佔映射共享庫的其他段,包括相應的GOT,其條目將相應地重新定位。

總之,只有代碼在進程間共享,而不是數據。但是,根據編譯標誌,我認爲常量可能是一個例外。

我還推薦以下文章:Dynamic Linking and Loading

+4

爲了強調這一點,unixy系統可以共享或不共享動態庫,但從應用程序的角度來看,兩種實現之間都存在*沒有明顯差異*。幾乎所有類Unix系統都會在進程之間共享代碼,因爲它很容易實現,並且幾乎不需要任何費用就可以很好地保存ram。罕見的例外情況是硬件上帶有弱(或無)MMU的偏執操作系統,因此共享的「文本」可能會導致一個進程破壞另一個進程。 – SingleNegationElimination 2010-12-11 05:26:05

相關問題