2016-01-01 45 views
1

現狀:POSIX共享內存 - 內存的多少副本有

如果過程& B分別使用mmap()創建共享內存映射,使用相同的共享內存對象/shm-a爲已備份文件。

我的猜測:

我本來以爲只有1個拷貝的內存,它處理的寫入/讀取。

但後來我想其實有3個副本,對吧?每個進程有一個由mmap()創建的副本,第三個副本是共享內存對象,用於在進程之間同步,但我不確定。

的問題是:

  • 那麼如何的記憶很多副本有? 或N + 1(其中ñ是進程計數)
  • 如果是N + 1,會不會這是內存的一種浪費?進程是否正確地通過其fd直接讀/寫共享內存對象?
+1

嗯,我想知道爲什麼這將被稱爲**共享**內存,如果有多個內存區域... – Olaf

+0

當我分享一本書,我的自然本能是使用影印機! –

回答

4

然後有多少內存副本? 1或n + 1(其中n是進程計數)

共享內存只有一個副本。

將相同的物理內存映射到不同的進程。但它可能會映射到不同的地址。

這是正確的進程讀/寫共享內存對象通過它的FD直接?

是的。實際上就是共享內存的目的。一個進程寫入共享內存的內容可以被另一個進程讀取。這是一個非常快速的IPC形式。但是你必須小心使用它。特別是,您需要擔心併發訪問,並在共享內存中共享指針。

+0

因此,當創建帶有磁盤文件作爲備份文件的'mmap()'時,進程需要爲磁盤文件自己分配內存;但是當使用共享內存對象作爲後備文件時,項目只是將其映射到進程的虛擬地址中,而不在中間創建另一個內存副本,是這樣嗎? –

+0

你調用的是在一個支持磁盤的'mmap()'中分配內存的東西 - 實際上只是調整磁盤上的文件大小以匹配映射內存的大小。把它看作一個包含三個元素的系統 - 每個進程中的虛擬地址空間,虛擬內存映射到的物理內存以及後備存儲對象(可以是磁盤文件或共享內存段)。對於共享內存,所有相關進程只有一個實際物理內存副本。 – Ziffusion

+0

我知道共享內存只有一個副本,我不確定每個進程是否在共享內存中分配另一個內存,就像它支持的文件是常規磁盤文件和匿名映射時的情況一樣沒有備份文件。 –