共享內存 mmap shmget 區別


請參考apache對於共享內存的scoreboard的初始化,ap_init_scoreboard()

得有一個內存變量ap_scoreboard_image來索引對應的共享內存

 

By firework2@foxmail.com

 http://www.linuxgraphics.cn/gui/ipc_shrmem.html

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

 

http://www.ibm.com/developerworks/cn/linux/l-ipc/part5/index1.html

http://www.ibm.com/developerworks/cn/linux/l-ipc/part5/index2.html

 

http://blog.csdn.net/nellson/archive/2010/03/20/5398436.aspx  (里面的時間性能測量不全面)

 

 

初學的同學多半都會想橫向對比一下,到底用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://www.ibm.com/developerworks/cn/aix/library/au-cn-sharemem/index.html

 

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

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()返回的地址,這樣,父子進程就可以通過映射區域進行通信了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM