簡體   English   中英

在UNIX進程之間交換適量大量數據的最佳方法是什么?

[英]What's the best way to exchange moderately large amounts of data between UNIX processes?

在UNIX進程之間交換數據中等大量數據(多兆字節,但不是千兆字節)的最佳方法是什么?

我認為,這將是內存映射文件 ,因為大小限制似乎足夠容忍。

我需要雙向通信,所以常見的管道無濟於事。 有了套接字和UDP,就我所知(參見此處 )而言存在大小限制。 不確定,如果TCP在fork()子進程和父進程之間進行通信是個好主意。

閱讀相關的問題,比如這個 ,有些人建議共享內存/ MMAP和其他人推薦的插座。

還有什么我應該研究的嗎? 例如,是否有一些更高級別的庫通過提供例如數據的XML序列化/反序列化來幫助IPC?

由於評論而編輯:

在我的特殊情況下,有一個父/控制器進程和幾個子進程(不能使用線程)。 控制器根據請求為孩子提供一些可能適合一個UDP包的關鍵數據。 兒童根據關鍵數據進行操作,並根據密鑰向控制器提供信息(信息的大小可以是10-100MB)。

問題:響應數據的大小,在密鑰請求上通知父級的機制,同步 - 父級必須在傳遞給子級后從其列表中刪除密鑰,不應發生重復的密鑰處理。

不得使用Boost和其他第三方庫(不幸的是)。 我或許可以使用SunOS 5.10系統提供的庫。

套接字。 在使用鎖或其他方式編寫或讀取內存時,您不必保護內存,以使其並行執行安全。 另一個好處是,您可以非常輕松地將代碼拆分為兩個單獨的可執行文件,並使用套接字通信代碼在不同的計算機上執行這些可執行文件。

在我看來,主要的缺點是你必須找到一個方案來(去)序列化你的數據並將數據塊拆分/組裝成幾個數據包。

共享內存很快,但是負擔協調訪問內存的所有負擔。 您可能需要設置(至少)一個互斥鎖,以確保在任何給定時間只有一個進程寫入共享內存(顯然,確保兩個進程都正確使用該互斥鎖)。

除此之外,您(可能)還需要在內存中設置一些結構,以便接收進程知道已寫入的新數據,它所在的位置等。

套接字限制了可以在單個數據包中發送的數據量,但不限制您可以發送的總數量。 另請注意,Unix域套接字基本上是共享內存,所有協調都在內核中處理,因此通常非常快。

有很多用於IPC序列化的庫/協議 - Boost Serialization,Sun XDR,Google協議緩沖區等。鑒於您正在交換相當多的數據,我傾向於傾向於 XML之外的其他東西。 XML編碼和解析往往相對較慢,並且通常也會擴展數據。

共享內存。 您可以非常快速地讀/寫它,並且它始終可用於雙方,無需請求響應。

http://en.wikipedia.org/wiki/Shared_memory

更重要的是,您只需要保留一份數據集副本,這樣就不會有2份副本加上飛行中的數據 - 如果您買不起2份副本,則可能需要傳輸相同的數據多次使用其他解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM