2011-03-25 140 views
3

我正在閱讀有關共享內存的教程,並發現以下語句:「如果進程希望通知另一個進程已將新數據插入到共享內存中,則必須使用信號,消息隊列,管道,插座或其他類型的IPC。「。那麼使用共享內存和其他類型的IPC來通知的主要優點是什麼,而不是使用不需要使用任何其他IPC類型的IPC,例如消息隊列和套接字?共享內存和IPC

回答

6

這裏的區別是IPC機制的信令與共享狀態。

信令(信號,消息隊列,管道等)適用於信息往往很短,及時且有針對性。這些機制的事件往往會喚醒或中斷另一個程序。比喻是,「一個程序將SMS發送給另一個?」

  • 嘿,我添加了一個新的條目哈希表!
  • 嘿,我完成了你要求我做的工作!
  • 嘿,這是我的貓的照片。他不可愛?
  • 嘿,今晚你想出去嗎?這個新的地方叫做硬盤。

共享存儲器,與上述相比,是用於共享在小部件更改或反覆讀取相對大的,穩定的物體更有效。程序可能會不時地諮詢共享內存或在收到其他信號後。想想看,一個家庭的程序會在他們家的廚房的(大)白板上寫什麼?

  • 我們最喜歡的食譜。
  • 我們知道的事情。
  • 我們的朋友的電話號碼和其他聯繫信息。
  • 我們家族的傑出歷史的最新手稿,由監獄時間組織。

這些例子之後,你可能會說,共享內存,而不是嚴格意義上的IPC機制更接近於一個文件,與共享內存明顯的例外是

  1. 隨機訪問,而文件是連續的。
  2. 揮發性,而文件傾向於生存程序崩潰。
+1

我可以爲我的流程創建自定義信號來收聽嗎? – CMCDragonkai 2014-06-23 05:52:55

+0

例如,如果您調用'kill(pid,50333)',我很難找出_supposed_發生了什麼,但無論如何我都不會推薦它。 標準信號包括SIGUSR1和SIGUSR2,其含義由程序定義。但是,如果你需要兩條以上的消息,那麼你可能根本不應該使用信號。它們不是一個特別靈活的IPC機制。 – 2014-06-23 07:25:16

+0

這似乎是正確的。 – CMCDragonkai 2014-06-23 07:45:12

0

共享內存用於在進程之間傳輸數據(也用於快速讀取/寫入磁盤文件)。如果您不需要傳輸數據並且只需要通知其他進程,則不要使用共享內存 - 請改用其他通知機制(信號量,事件等)。

2

你想要共享內存的例子是共享哈希表(或btree或其他複合結構)。您可以讓每個進程都接收更新消息並更新該結構的私有副本,或者可以將哈希表存儲在共享內存中並使用信號量進行鎖定。

2

共享內存非常快 - 這是您使用它的主要優勢和原因。您可以使用部分內存來保留有關數據有效性的標誌/時間戳,但如果您想避免輪詢共享內存,則可以使用其他形式的IPC進行信號傳送。

0

根據從進程到進程傳遞的數據量,共享內存會更有效率,因爲您可以最大限度地減少數據從用戶態內存複製到內核內存並返回到用戶態內存的次數。