天天看點

shmget實體記憶體_共享記憶體 mmap shmget 差別

請參考apache對于共享記憶體的scoreboard的初始化,ap_init_scoreboard()

得有一個記憶體變量ap_scoreboard_image來索引對應的共享記憶體

By [email protected]

類Unix系統的共享記憶體有好幾種機制,網上一搜就一大堆了,下面是幾個我認為介紹的還不錯的 : )

初學的同學多半都會想橫向對比一下,到底用mmap實作共享記憶體好呢,還是用shmget好啊?

下面是我個人的一些了解:

1. 二者本質上是類似的,mmap可以看到檔案的實體,而 shmget 對應的檔案在交換分區上的 shm 檔案系統内,無法直接 cat 檢視

2. 安全性:mmap 方式對應的真實檔案,如果使用者有權限即可檢視,甚至删除

shmget 方式其實也一樣,好了一層皮罷了(ipcrm -m ...)

3. 一緻性:mmap 方式下各程序映射檔案的相同部分可以共享記憶體

shmget 時各個程序共享同一片記憶體區

不建議使用交疊的方式使用 mmap

4. 持續性:程序挂了重新開機不丢失内容,二者都可以做到

機器挂了重新開機,mmap 可以不丢失内容(檔案内儲存了OS同步過的映像),而 shmget 會丢失

5. 易用性:mmap 的接口會簡單一些

6. 通用性:posix 的 mmap 會相對廣泛一些

7. 其他:mmap在某些核心版本下會頻繁讀寫磁盤,需要注意一下

如果你擔心會因誤删檔案導緻 mmap 出錯,那就用 shmget 吧,否則的話直接mmap就可以了,用起來簡單一些 : )

更多的細節,需要大量的實踐 + 閱讀核心實作來确認,暫時沒考慮

另外要注意在有必要的時候捕獲信号,還有就是要注意檢查這些系統函數的傳回值

============================================================================

http://blog.chinaunix.net/uid-26335251-id-3493125.html

1. 共享記憶體允許兩個或多個程序共享一給定的存儲區,因為資料不需要來回複制,是以是最快的一種程序間通信機制。共享記憶體可以通過mmap()映射普通檔案(特殊情況下還可以采用匿名映射)機制實作,也可以通過系統V(shm)共享記憶體機制實作。應用接口和原理很簡單,内部機制複雜。為了實作更安全通信,往往還與信号燈等同步機制共同使用。

結論:

1、mmap儲存到實際硬碟,實際存儲并沒有反映到主存上。優點:儲存量可以很大(多于主存)(這裡一個問題,需要高手解答,會不會太多拷貝到主存裡面???);缺點:程序間讀取和寫入速度要比主存的要慢。

2、shm儲存到實體存儲器(主存),實際的儲存量直接反映到主存上。優點,程序間通路速度(讀寫)比磁盤要快;缺點,儲存量不能非常大(多于主存)

使用上看:如果配置設定的存儲量不大,那麼使用shm;如果存儲量大,那麼使用mmap。

mmap系統調用并不是完全為了用于共享記憶體而設計的。它本身提供了不同于一般對普通檔案的通路方式,程序可以像讀寫記憶體一樣對普通檔案的操作。而Posix或系統V的共享記憶體IPC則純粹用于共享目的,當然mmap()實作共享記憶體也是其主要應用之一。

2)使用特殊檔案提供匿名記憶體映射:适用于具有親緣關系的程序之間;由于父子程序特殊的親緣關系,在父程序中先調用mmap(),然後調用fork()。那麼在調用fork()之後,子程序繼承父程序匿名映射後的位址空間,同樣也繼承mmap()傳回的位址,這樣,父子程序就可以通過映射區域進行通信了。