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