2011-02-26 51 views
9

我寫的網絡守護進程,在Linux內核2.6,其中有 一個生產者進程消費者氮處理,不使對數據進行任何改變,而不會產生任何響應回製片人。具有共享內存結果的進程之間進行通信零拷貝?

只要生產者進程生成一個數據對象,其長度從幾個10字節到幾十K字節不等,就必須將數據對象傳遞給一個可用的使用者進程。

第一次,我考慮使用一個命名/無名PIPE。但是,它們將成爲內存複製開銷。

  1. 生產者的用戶空間緩衝--copy - >內核空間的管道緩衝區
  2. 內核空間的管道緩衝區--copy - >消費者的用戶空間緩衝

由於程序可能與低延遲的大量同伴一起工作,複製開銷可能是有害的。因此,我決定在mmap()中使用POSIX共享內存。

如果使用過程之間共享數據POSIX共享內存使用mmap()不會導致任何存儲器複製,不像PIPE我只是想知道。

另外,是否有任何其他方式來共享進程之間的數據,但結果零拷貝? 該程序將在Linux上運行,最近版本的內核爲 ,可能不需要具有跨平臺功能。

我決定不爲每個消費者/產品產卵/運行一個線程,而是由於設計問題導致進程 。

感謝您的回覆。

回答

5

共享內存通常專門設計爲不會導致副本開銷(來源:http://www.boost.org/doc/libs/1_46_0/doc/html/interprocess/sharedmemorybetweenprocesses.html#interprocess.sharedmemorybetweenprocesses.sharedmemory.shared_memory_what_is)。

如果您使用的是C++,Boost :: Interprocess是一個很好的庫,用於以跨平臺的方式實現您所描述的內容 - 您可以使用它們的共享內存類與named_upgradable_mutex結合使用。 named_upgradable_mutex類支持在資源上提供獨佔和可共享的鎖,因此您可以輕鬆地使用它實現您的消費者 - 生產者模型。 (來源:http://www.boost.org/doc/libs/1_37_0/doc/html/boost/interprocess/named_upgradable_mutex.html#id2913393-bb

2

共享內存不應該引入任何副本(緩存一致性除外),並且您可以直接訪問內存,以便您可以避免代碼中的副本。

0

是的,它應該是零拷貝。

但是,這也是一個(可能是過早的)優化,您需要非常小心,以確保您的進程正確配合共享內存的分配/釋放/修改。您肯定需要某種互斥來避免併發訪問問題。

就我個人而言,我會使用管道,直到性能成爲一個合適的問題。如果確實如此,那麼使用Boost :: Interprocess或類似庫的建議是合理的。

+4

確定進程之間移動大量數據不是「過早優化」,而是「必要的體系結構」。並不是所有的優化(或設計或架構)都「不成熟」。 – 2013-12-10 01:04:34

相關問題