2010-03-18 61 views
7

管道和消息隊列之間有什麼區別?管道和消息隊列之間有什麼區別?

請解釋從vxworks & unix的角度。

我認爲管道是單向的,但消息隊列不是。

但是不要管道內部使用消息隊列,那麼管道是如何單向的,但消息隊列不是?

你能想到的其他區別是什麼(從設計或使用或其他角度)?

+0

我想一般他們是同樣的事情。消息隊列傾向於確保數據到達收件人。所以他們可以堅持數據,直到收件人變得可用,但我想這不是強制性的,並且依賴於實現,就像單向/雙向或持久/單消息管道等一樣。管道用於發送字符串塊和二進制數據,而隊列用於發送消息,但同樣,這可能取決於實現。如果我們在談論消息傳遞,人們喜歡重新發明輪子。有些術語有5個以上的不同名稱... – inf3rno 2015-09-28 06:47:29

回答

-1

MQ具有內核持久性,可以由多個進程打開。

+0

肯,我不確定你在說什麼......在vxWorks環境中,管道可以通過多個進程打開。我不確定內核持久性的含義。 – Benoit 2010-03-19 00:38:56

+0

在幾乎所有其他現代操作系統上,vxWorks「管道」與「管道」非常不同。您可以假設我的答案適用於每個非vxWorks系統。 :-) – Ken 2010-03-20 03:50:49

+0

內核持久化意味着只要內核確實存在,而不是文件系統持久性,進程持久性(哪些管道至少在Unix上)等等。 – Ken 2010-03-20 03:55:09

11

消息隊列是:

  • 單向
  • 固定條目數
  • 每個條目都具有在創建
  • 分配的最大尺寸
  • 所有隊列存儲器(#條目*條目大小)
  • 類似數據報的行爲:讀取條目將其從隊列中刪除。如果你沒有閱讀整個數據,其餘的都會丟失。例如:發送一個20字節的消息,但接收器讀取10個字節。其餘的10個字節丟失。
  • 任務只能使用msqQReceive一個隊列掛起(也有辦法改變這種替代API)
  • 發送時,你會掛起如果隊列已滿(你不這樣做NO_WAIT)
  • 在接收時,你會掛起如果隊列爲空(和你不這樣做NO_WAIT)
  • 超時都支持接收和發送

管道

  • 是消息隊列中的一層< ---單向!
  • 有最大數量的元素,每個元素具有最大尺寸
  • 不是流接口。數據報的語義,只列出消息隊列
  • 上閱讀,都會PEND直到有數據讀取
  • 在寫,都會PEND直到有在底層消息隊列空間
  • 可以使用選擇工具來等待多個管道

這就是我現在能想到的。

+0

什麼是'pend'? – 2010-03-19 01:46:02

+2

任務處於掛起狀態,這意味着它正在等待發生某種事情:在這種情況下,隊列中有東西(讀取時)或有一個空插槽(寫入時)。 – Benoit 2010-03-22 13:53:42

1

「VxWorks管道與UNIX管道有很大不同」,vxWorks文檔說,他們不是在開玩笑。 Here's the manpages

看起來好像並不誇張地說,Unix管道和vxWorks管道之間的唯一相似之處在於它們是IPC的一種形式。功能不同,API不同,實現方式肯定有很大不同。

0

我還在IPC in UNIX中發現了這種差異。它指出它們之間的區別在於消息隊列和管道是第一個存儲/檢索信息包中的信息。雖然管道按字符逐個進行。

消息隊列:

消息隊列:一個匿名數據流類似於管,但存儲 並檢索在報文信息。

管:雙向數據流通過標準輸入和 輸出接口,並通過文字

我也發現了這個問題,在這裏讀到字符:Pipe vs msg queue

0

消息隊列和管道的比較: - 可以使用一個消息隊列直接傳遞數據離子 - 消息不一定要對先入先出的原則 讀出,但可以有選擇地處理,而不是 來源:看http://www.cs.vsb.cz/grygarek/dosys/IPC.txt

相關問題