2011-11-07 55 views
8

當我在學習有關共享庫我宣讀了一份聲明共享庫的地址空間

雖然共享庫的代碼多個 進程間共享,它的變量都沒有。使用庫 的每個進程都有其自己的全局和靜態變量副本,這些副本在庫中定義爲 。

我只是有一點懷疑。

  1. 無論每個過程的代碼部分是在單獨的地址空間?
  2. 共享庫代碼部分是否在某些全局(唯一)地址空間中。

我只是一個初學者,所以請幫助我理解。

謝謝!

+0

這是 「過程」,而不是 「進步」。 –

+2

選中此鏈接:http://duartes.org/gustavo/blog/post/anatomy-of-a-program-in-memory。它很好地解釋了關於程序的內容。你可以看到,共享庫通常內存映射到進程的虛擬地址空間 –

回答

17

共享庫由存儲器映射的文件到進程的地址空間的某些部分加載到進程。當多個進程加載同一個庫時,操作系統只是讓它們共享相同的物理RAM。

可以修改的部分庫(如靜態全局變量)通常以寫入時複製模式加載,以便在嘗試寫入時發生頁面錯誤,內核通過複製受影響的頁面到RAM的另一個物理頁面(僅用於該過程),映射重定向到新頁面,最後寫入操作完成。

要回答你的具體問題:

  1. 所有進程都有自己的地址空間。進程之間的物理內存共享對每個進程都是不可見的(除非他們通過共享內存API故意這樣做)。
  2. 所有數據和代碼都在物理RAM中,這是一種地址空間。你最有可能看到的地址,卻是屬於一個程序或其他的地址空間的虛擬內存地址,即使這個「過程」是內核。