2016-06-14 408 views

回答

0

進程實際上是在OS中運行多個線程的孤立程序。一般來說操作系統策略說,所有進程都是相互隔離的內存。

代碼段[不共享]
BSS和靜態字段[不共享]
原因很簡單,爲什麼一個操作系統允許進程A訪問進程B的二進制?這是違反安全和內存保護的。進程A可能會損壞(如果有寫入權限)進程B的內存。

外部定義
這裏有趣的部分,外部定義可以靜態或動態鏈接。
靜態鏈接庫意味着定義在編譯時和程序鏈接包含它的機器代碼。
動態鏈接意味着定義在用戶命令之後連接,以在內存中加載任何程序。 OS通過提供共享對象的路徑來調用動態庫加載器來解析程序的外部依賴關係。
這個共享對象被操作系統緩存在不同的頁面框架中,並且每當程序需要這個庫時,它只是將它的頁框複製到進程的虛擬內存;並做需要的動態鏈接。這種方式多個進程具有相同的單個庫的二進制文件。
它節省了從磁盤加載庫中的RAM內存和時間,而且動態鏈接減少了程序的二進制大小。
操作系統也可能選擇從磁盤再次加載庫,從而製作同一庫的兩個副本。這是動態鏈接操作的一部分。我不深入,但如果你真的有興趣https://en.wikipedia.org/wiki/Dynamic_linker或只是在評論部分ping我。
但是關於BSS和靜態字段,它又不是共享的;每當在這樣的區域上執行寫入操作時(這是共享的)。操作系統爲其他進程創建該區域的新副本。這確保了這兩個進程都有自己的BSS副本和靜態字段。

相關問題