2010-11-12 134 views
11

我正在尋找通過boost::interprocessmanaged_shared_memory創建靜態塊共享內存應分配多少內存的權威答案(如果確實存在)。即使official examples似乎分配了arbitrarily large大塊的內存。'managed_shared_memory'應該分配多少內存? (boost)

考慮以下結構:

// Example: simple struct with two 4-byte fields 
struct Point2D { 
    int x, y; 
}; 

我最初的反應是必要的大小將是8個字節,或sizeof(Point2D)。當我試圖構造一個對象時,這會失敗,給我在運行時產生seg-fault。

// BAD: 8 bytes is nowhere near enough memory allocated. 
managed_shared_memory segment(create_only, "My shared memory", sizeof(Point2D)); 

什麼讀/寫操作導致seg-faults?堆棧操作?在segment.construct()內臨時分配?分配共享內存時需要多少開銷?

通過試錯我發現乘以4的大小可以適用於上述結構,但當我開始向我的struct添加更多字段時會分崩離析。那麼,這是一個糟糕的黑客攻擊。

有些人可能會爭辯說,現代個人電腦中的「記憶便宜」,但我不同意這種理念,並且如果我可以避免的話,不喜歡分配比我需要的更多。我昨天在Boost文檔中搜索,找不到任何建議。這是今天學習新事物!

+1

人們可能會不同意我這裏,但我從來沒有在我的生活編碼沿着「記憶便宜」的線。與過去的購買方式相比,購買內存不一定很昂貴,但它非常像金錢。你擁有的越多,花費越多。我爲我的電腦購買的每一次內存升級,現在我可以「跑得更多」了。我一直試圖在這方面進行保守編碼,因爲它對我的應用程序來說不一定便宜*。無論如何,只是我的2c :) – 2010-11-12 16:28:30

+0

我同意100%!這就是我正在問這個問題的**整個**原因。我只是在那裏發表這個評論,勸阻任何人說「誰在乎,只分配1k並完成它」。我會盡量在帖子中更加清楚。 – 2010-11-12 16:37:08

+0

啊好的:)「有些人可能會爭辯」要好得多! – 2010-11-12 16:56:55

回答

8

從文檔的this paragraph

存儲器算法是 置於 共享存儲器/內存映射文件 段的第一字節的對象。

佈局的內存段:

____________ __________ ____________________________________________ 
|   |   |           | 
| memory | reserved | The memory algorithm will return portions | 
| algorithm |   | of the rest of the segment.    | 
|____________|__________|____________________________________________| 

圖書館有一個額外的內存開銷坐在段的開始,從而佔領你的請求大小的幾個字節。據this postthis post,不能確定的額外字節這個確切的數字:

你不能計算它,因爲有 的內存分配bookeeping並在 運行時根據您的 分配改變 碎片問題/取消分配模式。而 共享內存由 由OS(4K上 窗口的Linux 64K)頁面分配的,所以任何分配將在分配舍入到 頁面實踐 :

managed_shared_memory segment(create_only, "name", 20); 

就會浪費相同內存:

managed_shared_memory segment(create_only, "name", 4096); 
+0

找到那個舊帖子的好工作;我搜索了一會兒,然後幹了起來。所以,通過「確實」,你的意思是**沒有具體的答案嗎?**這就是我從IonGaztañaga的迴應中得到的結果......此外,感謝與Boost文檔的鏈接。內存映射ASCII藝術幫助出來,雖然我沒有在程序上確定'內存算法'+'保留'運氣。但最終,這是一個有爭議的問題,因爲我的實際實現存儲了5-10個結構實例(也由Gaztañaga提及)。儘管如此,這似乎是一個有效的問題,即使它主要是「學術」。 – 2010-11-12 21:23:13

+0

啊,*我們走了。我知道OS頁面大小必須是相關的細節;上面的報價證實了我的懷疑。它看起來像「最佳猜測」分配將不得不做。再次感謝。 – 2010-11-12 22:30:23

2

喜歡的東西使用OS'es內存頁大小的作品。在我的情況下,這工作..

off_t size = sizeof(class1) + (sizeof(class2) * 3); 
// round up to the OS page size. 
long page_size = sysconf(_SC_PAGE_SIZE); 
size = ((size/page_size) + (size % page_size ? 1 : 0)) * page_size; 

使用boost :: managed_shared_memory允許您在結果空間中構造對象。就像......

shared_memory_object::remove(m_name.c_str()); 
m_shared.reset(new managed_shared_memory(create_only, "myspace", size)); 
m_class1 = m_shared->construct<class1>("class1")(); 
m_class2 = m_shared->construct<class2>("class2")[3](); 
+0

+1我喜歡四捨五入到系統頁面大小的想法。但是,它仍然看起來像我們正在創建**任意數量的填充**。在這種情況下,「3」 - sizeof(class2)的三倍。我對麼?自從我轉向其他項目之後,我仍然對利用最少浪費分配共享內存的最佳方式感興趣。 – 2011-01-12 19:35:56

+0

反正我看不到使用共享內存區域的頁面大小。 (修正了第二位代碼中的錯誤。) 但是,您可以在共享內存區域的第二位代碼中執行我正在使用的子分配類型。 看看http://en.highscore.de/cpp/boost/interprocesscommunication.html#interprocesscommunication_managed_shared_memory可以很好地瞭解子分配的許多方法。 我最好學習這個編輯器,這樣我可以更乾淨地鏈接*嘆* – lprent 2011-01-12 23:07:16

相關問題