2013-05-07 82 views
11

我有一個C++應用程序,通過shmget(2)在Linux系統上分配共享內存。我在共享內存中存儲的數據會週期性地增長,我想以類似於realloc()增長常規內存的方式調整共享內存的大小。有沒有辦法做到這一點?我在IBM的網站上發現了一個提到SHM_SIZE命令的文檔,但是Linux和BSD手冊頁沒有,即使在Linux特定部分也是如此。我可以使用shmctl調整Linux共享內存嗎?

+0

作爲一個靈感,看看:http://www.boost.org/doc/libs/1_61_0/doc/html/interprocess/quick_guide.html - 特別是'managed_shared_memory',可以用來保存' vector' in shared memory ... – Nim 2016-09-19 13:28:24

回答

5

簡單的答案:沒有簡單的方法。

原因很合理。共享內存正逐個附加到每個進程的虛擬空間。每個進程都有自己的虛擬地址空間。每個進程都可以自由地附加在任何段(並非字面上,對齊設置一些限制)任意地址。系統如何保證,比如說,通過擴大面積4MiB,這個細分市場的每個'用戶'都能夠適合bigget塊在相同的起始地址那裏較小的細分市場以前是?

但你不應該放棄!您可以富有創意。你可以想出一個頭段段的概念,在那裏存儲有關真實有效載荷段的信息。您可以使每個進程遵守一些規則,例如:重新附加有效負載段,當其ID爲標頭段,與已知不匹配時。

建議:我懷疑你知道這一點,但絕不保持指向數據共享區域內,只有偏移

我希望你能有一些用我的胡言亂語。

+0

謝謝,這非常有幫助! – 2016-09-20 19:33:45

0

在我看來,你可以爲自己的目的編寫自己的內存管理器。這個概念很簡單:

  1. 您有一個共享內存塊,其大小爲N字節;
  2. 2*N大小分配新的共享內存塊;
  3. 將存儲器從一個塊複製到另一個塊;
  4. 釋放舊的共享內存塊;
  5. 把#2-4換成一些程序並使用它;

恐怕我們沒有更多的事情要做。這是如何實現std::vector。在大多數情況下,void *realloc()會返回指向新內存塊的指針(但不包括擴展的舊塊)。

+0

我相信這樣做會使這種內存的'共享'屬性不存在。 – GreenScape 2014-05-28 06:51:18