2010-01-20 107 views

回答

53

這是一個更多的設計問題,而不是速度(共享內存更快),域套接字明確更多的UNIX風格,並且做了更少的問題。在選擇方面事先知道:

域套接字優勢

  • 阻塞和非阻塞模式和它們之間的切換
  • 你沒有釋放他們時,任務完成

域套接字的缺點

  • 必須閱讀並以線性方式寫

共享內存優點

  • 非線性存儲
  • 不會阻塞
  • 多個程序可以訪問它

共享內存弊

  • 需要鎖定實施
  • 需要手動釋放,即使未使用任何程序

這就是我現在能想到的。但是,我會隨時使用域套接字 - 更不用說,重新實現分佈式計算要容易得多。由於需要安全的設計,共享內存的速度增益將會丟失。但是,如果您確切知道自己在做什麼,並使用正確的內核調用,則您可以使用共享內存以更快的速度實現

+0

+1作比較。 – jldupont 2010-01-20 13:56:12

+0

感謝您的詳細解答和比較! – SyBer 2010-01-21 13:18:11

+2

'需要手動釋放,即使未被任何程序使用'也可以與['/dev/ashmem'](http://lwn.net/Articles/452035/) – 2014-01-17 16:05:36

2

兩者都是進程間通信(IPC)機制。 UNIX域套接字用於在一臺主機上的進程之間進行通信,類似於在不同主機之間使用TCP-套接字。共享內存(SHM)是一塊內存,您可以在其中放入數據並在進程之間共享。 SHM通過使用指針爲您提供隨機訪問,套接字可以被寫入或讀取,但無法倒帶或定位。

7

在速度共享內存方面絕對是贏家。使用套接字,您將擁有至少兩個數據副本 - 從發送進程到內核緩衝區,然後從內核到接收進程。使用共享內存時,延遲將僅受框中內核之間的緩存一致性算法的約束。

儘管Kornel指出,處理共享內存更爲複雜,因爲您必須提出自己的同步/信令方案,這可能會根據您走哪條路線而增加延遲。絕對使用共享內存中的信號量(在Linux上使用futex實現)以避免非競爭情況下的系統調用。

+0

作鬥爭我相信什麼將Unix域套接字與正常的套接字是一端的寫入直接進入另一端的接收緩衝區。所以沒有必要額外的副本。如果您可以找出一種方法讓應用程序在共享內存中實際使用相同的對象,而不是將其複製出來,則這可能仍然是需要的副本。 – 2010-03-28 22:28:24

+0

至少有兩個額外的副本 - 從用戶到內核,然後回來。 – 2010-03-28 23:39:50

0

在這種情況下 - 套接字更快。寫入共享內存比任何IPC都快,但寫入內存映射文件並寫入共享內存是兩件完全不同的事情。

當寫入內存映射文件時,需要將寫入共享內存的內容「刷新」到實際綁定文件(不完全是爲您完成刷新),因此您先將數據複製到共享內存,然後再次將它複製(flush)到實際的文件中,那是超級膨脹 - 更多的東西,甚至更多的寫入套接字,你這樣做沒有任何好處。

+2

這是不正確的。通過內存映射文件(這是正常機制)設置共享內存相對簡單,並且數據共享以快速方式進行。 – 2015-09-15 15:20:15