2013-04-26 39 views
3

我需要使用一箇舊的C++項目,其中每個進程都將相同的數據加載到內存中。這是隻讀的,每個進程都有完全相同的數據副本。最近服務已經開始顛簸它運行的系統。如何創建可隨時間擴展的共享內存區域?

我正在評估可以對此進行更改的方式,我認爲boost interprocess庫非常適合我的用例。我考慮的另一件事是使用外部數據存儲,但由於延遲,我不太願意使用它。

我看了一下boost apis,他們似乎要求我們指定共享內存區域的大小。在我的情況下,隨着時間的推移,需要加載的數據量不斷增加。這個共享內存是否可調整大小?

也可以在類似的情況下自由地對該問題或boost interprocess提出替代建議。

+0

不是說你不能這樣做,但是如何使用共享內存的進程知道它已經增長了?當您需要更多空間時,是否可以使用多個區域並添加更多區域?我完全不熟悉這個「增強」庫,所以我不能說。 – 2013-04-26 09:19:16

+0

@MatsPetersson在最簡單的情況下,你可以使用類似於'vector'的東西來記錄它的'size'和'capacity'。 – 2013-04-26 09:21:17

+0

它仍然會要求使用這些數據的應用程序「檢查它是否已經長大」或其他類似情況。我仍然認爲有幾種可能的解決方案,並非所有解決方案都與「增加」共享區域的大小有關。 – 2013-04-26 09:45:04

回答

1

要調整共享內存的大小,可以使用shmctl,其中cmd=SHM_SIZE

這樣做時你必須小心。如果你減小了尺寸,而其他進程訪問超出尺寸的內存,你將得到SIGBUS信號。

另一個問題是如何通知其他進程調整了共享內存的大小。我想你可以使用消息隊列或其他IPC機制。

+0

這是否也適用於'boost'呢? – nikhil 2013-04-26 10:05:34

+1

@nikhil不知道。我看到它有shared_memory_object :: truncate方法來設置大小,但我不確定它是否允許調整共享內存的大小。此外,只讀共享內存對象的大小被傳遞給構造函數。你將不得不重新創建對象。 – 2013-04-26 10:11:43

+0

噢好吧,我們只需要在區域可以寫入的情況下調用truncate。謝謝你,我還會讀到'shmctl'。 – nikhil 2013-04-26 10:52:52