2011-05-30 51 views
2

我有一個類,它使用shm_open打開posix共享內存。現在我不得不多次創建這個類的對象(總共5-10個對象),這意味着相同的共享內存將被多次打開。是否以任何方式多次打開共享內存?

共享內存的大小可變,可以從1k到500k。

有關這方面的問題是:
1.這是否會導致增加的內存使用量? (我沒有看到發生這種情況,所以我的猜測是否定的)
2.這會在訪問共享內存時導致性能不佳嗎?
3.其他可能出錯的東西?

回答

4

答案是你鏈接的shm_open在頁面上:

的shm_open()創建並打開一個新的,或者打開一個現有,POSIX共享內存對象。一個POSIX共享內存對象實際上是一個句柄,它可以被不相關的進程用於mmap(2)共享內存的相同區域。

要訪問共享內存對象,您需要一個句柄。 shm_open()可以用來打開(創建)新的,並重新打開現有的共享內存對象。重新打開現有對象時,不會增加內存,也不會出現性能不佳的情況。

+1

對,謝謝。我想我需要更好地閱讀手冊頁。 – 2011-05-30 09:21:47

3

它不會增加內存使用量,但是每次打開共享內存時都會佔用處理器,並且可能會用完。 (每個進程對打開的句柄的數量都有限制。)

您需要使用同步對象(如信號量)來管理對共享內存的訪問。

Mmap每次映射到一個不同的基地址,因此存儲指向共享內存的指針是一個壞主意。

+0

我距離手柄數量還有很遠的距離。關於其他兩個問題 - 好吧,通過在構造函數中初始化並在析構函數中正確地進行初始化,在C++中處理它們非常容易。 – 2011-05-30 09:44:43

+0

如果您從不同進程訪問共享內存,我看不到在構造函數和析構函數中如何解決同步問題。每次讀取和寫入共享內存時,都需要使用互斥鎖控制訪問。關於最後的問題,我怎麼也不明白如何通過構造函數/析構函數來緩解它。需要某種形式的相對尋址。 – sep 2011-05-30 11:16:36

+0

ops我的意思是說最後一個問題(關於mmap的那個區域)。對於同步問題,我使用消息隊列通知進程何時寫入共享內存 - 只有那個進程正在讀取該內存區域。 – 2011-05-30 11:32:23