進程間通訊:共享內存和消息隊列簡述

操作系統內的併發執行進程可以是獨立的也可以是協作的:

  • 如果一個進程不能影響其他進程或受其他進程影響,那麼該進程是獨立的,換句話說,不與任何其他進程共享數據的進程是獨立的;
  • 如果一個進程能影響其他進程或受其他進程所影響,那麼該進程是協作的。換句話說,與其他進程共享數據的進程爲協作進程。

協作進程需要有一種進程間通信機制(簡稱 IPC),以允許進程相互交換數據與信息。進程間通信有兩種基本模型:共享內存和消息傳遞(消息隊列):

  • 共享內存模型會建立起一塊供協作進程共享的內存區域,進程通過向此共享區域讀出或寫入數據來交換信息。
  • 消息傳遞模型通過在協作進程間交換消息來實現通信。

共享內存:

       採用共享內存的進程間通信,需要通信進程建立共享內存區域。通常,共享內存區域駐留在創建共享內存段的進程地址空間內。其他希望使用這個共享內存段進行通信的進程應將其附加到自己的地址空間。
       回憶一下,通常操作系統試圖阻止一個進程訪問另一進程的內存。共享內存需要兩個或更多的進程同意取消這一限制,這樣它們通過在共享區域內讀出或寫入來交換信息。數據的類型或位置取決於這些進程,而不是受控於操作系統。另外,進程負責確保它們不向同一位置同時寫入數據。共享內存之間存在消息同步的問題,通常採用信號量在軟件層次上對中斷機制進行模擬,是一種異步通信方式。利用信號也可以實現共享內存的同步。

消息隊列:

       消息傳遞提供一種機制,以便允許進程不必通過共享地址空間來實現通信和同步。對分佈式環境(通信進程可能位於通過網絡連接的不同計算機),這特別有用。

兩者對比如下:

                          

       上述兩種模型在操作系統中都常見,而且許多系統也實現了這兩種模型。消息傳遞對於交換較少數量的數據很有用,因爲無需避免衝突。對於分佈式系統,消息傳遞也比共享內存更易實現。共享內存可以快於消息傳遞,這是因爲消息傳遞的實現經常採用系統調用,因此需要消耗更多時間以便內核介入。與此相反,共享內存系統僅在建立共享內存區域時需要系統調用;一旦建立共享內存,所有訪問都可作爲常規內存訪問,無需藉助內核。
 

參考:

linux實現共享內存同步的四種方法

進程間通信(IPC):共享內存和消息隊列原理詳解

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章