2011-02-11 96 views
1

從POSIX隊列接收消息時如何節省內存?從POSIX隊列接收消息時如何節省內存?

看來,當在多進程/多線程環境中使用POSIX隊列時,沒有線程安全的方式將消息出隊到比max_msgsize小的緩衝區。

是否有任何標準解決此問題?或者它甚至是一個問題?

我很清楚還有其他非常棒的庫可以做到這一點,但我只是想爲用戶提供一個完全標準的解決方案,如果他們不想處理依賴關係的話。我試圖排隊潛在的數百兆字節每個消息,並有一個進程池與多個線程每個出隊消息進行處理。

感謝, Chenz

+0

爲什麼你不能只使用信號量來保護訪問?也許我不太明白這個問題。 – frankc 2011-02-11 21:10:34

+0

無法查詢隊列中下一條消息的大小,因此我必須分配一個等於消息允許的最大大小的緩衝區。 – 2011-02-14 13:03:14

+0

謝謝,現在我明白了。 – frankc 2011-02-14 19:03:16

回答

2

的POSIX隊列接口,爲您注意,不允許你來查詢消息的大小。

因此,實際上,所有的消息都可以按照隊列定義配置的最大大小,並且您必須假定簡單的實現可以很好地利用該消息來簡化記錄。

鑑於您正在處理數兆字節的消息,所以將這些消息放入隊列中不太可能是一個好的解決方案(不幸的是)。

如果你的消息率低(至一些定義),你實際做有一個合理的上限,那麼就繼續前進,並嘗試一下。

除了這個,你的下一個最好的選擇就是使用隊列作爲工作隊列,而不是作爲工作項隊列。您的工作項目將不得不以不同方式存儲在文件中。然後在隊列中有一個很好的短文件名,指向要處理的工作項目的位置。

好運

0

我認爲沒有真正的好方法來做到這一點。這是一個想法,但我認爲你會發現它由於鎖競爭而表現不佳:

有一個靜態緩衝區等於最大消息的大小。因爲有一個共享的緩存,現在你出隊的過程必須是這樣的:

  • 鎖sempaphore
  • 出隊到靜態緩衝區
  • 弄不清消息的真實尺寸
  • 副本從靜態緩衝區線程本地緩衝區,則該消息的實際大小
  • 解鎖旗語

存在具有的開銷靜態緩衝區,但依賴於消息大小的分佈,您仍然可能會看到總內存使用量減少。但是,現在您必須處理靜態緩衝區的爭用問題,這可能會很好,特別是當一些大消息連續到達時。如果非常大的消息很少,那麼這可能不是一個可怕的解決方案。