管道和消息队列有哪些区别?

17

管道(Pipes)和消息队列(Message Queues)之间的区别有哪些?

请从VxWorks和Unix两个角度加以解释。

我认为管道是单向的,而消息队列不是。

但是,管道内部使用消息队列,为什么管道是单向的,而消息队列不是?

您还能想到其他方面的差异吗(例如设计、用法或其他方面)?


1
我认为它们通常是相同的东西。消息队列倾向于确保数据到达接收者。因此,它们可以将数据持久化,直到接收者变得可用,但我想这不是强制性的,而是实现相关的,就像单向/双向或持久/单个消息管道等一样... 管道用于发送字符串和二进制数据块,而队列用于发送消息,但同样,这可能是实现相关的。如果我们谈论消息传递,人们喜欢重新发明轮子。有些术语有五个以上的不同名称... - inf3rno
请查看以下链接:https://www.quora.com/What-is-the-difference-between-message-queue-and-pipes - Rick
5个回答

21

消息队列:

  • 单向的
  • 有固定数量的条目
  • 每个条目具有最大大小
  • 在创建时分配所有队列内存 (# 条目 * 条目大小)
  • 类似于数据报的行为: 读取一个条目会将其从队列中移除。如果你没有读取整个数据,剩余的数据就会丢失。例如:发送一个20字节的消息,但接收者只读取了10字节,剩余的10字节就会丢失。
  • 任务只能在单个队列上使用 msqQReceive 挂起(有替代 API 可以更改这一点)
  • 当发送时,如果队列已满(而且你没有使用 NO_WAIT),你将会挂起
  • 当接收时,如果队列为空(而且你没有使用 NO_WAIT),你将会挂起
  • 支持接收和发送的超时

管道:

  • 是建立在消息队列之上的层 <--- 单向的!
  • 有最大元素数,每个元素都有最大大小
  • 不是流式接口。与消息队列一样的数据报语义
  • 在读取时,将等待直到有数据可读
  • 在写入时,将等待直到底层消息队列有空间
  • 可以使用 select 机制等待多个管道

以上是我现在能想到的内容。


2
任务处于挂起状态,意味着它正在等待某些事件的发生:在这种情况下,队列需要有内容(读取时)或有空槽位(写入时)。 - Benoit

1
“VxWorks管道与UNIX管道有很大的区别”,VxWorks文档中说道,他们并不是在开玩笑。这里是manpages
看起来可以毫不夸张地说,Unix管道和VxWorks管道之间唯一的相似之处就是它们都是IPC的一种形式。它们的特性不同,API也不同,实现肯定也非常不同。

1

消息队列和管道的比较: - 一个消息队列可用于双向传递数据 - 消息不需要按先进先出顺序读取,而可以进行选择性处理 来源:见http://www.cs.vsb.cz/grygarek/dosys/IPC.txt


1
我还在UNIX中的IPC中发现了这个区别。它指出它们之间的区别在于消息队列和管道,前者以数据包的形式存储/检索信息,而管道则逐个字符进行。
消息队列:

消息队列:类似于管道的匿名数据流,但是以数据包的形式存储和检索信息。

管道:

管道:通过标准输入和输出接口的双向数据流,逐个字符读取。

我还在这里找到了这个问题:管道 vs 消息队列

-1

MQ具有内核持久性,并且可以被多个进程打开。


Ken,我不确定你在说什么... 在vxWorks的上下文中,管道可以被多个进程打开。我不确定内核持久性是什么意思。 - Benoit
看起来vxWorks的“管道(pipes)”与几乎所有其他现代操作系统上的“管道”非常不同。您可以假设我的答案适用于除vxWorks之外的每个系统。 :-) - Ken
内核持久性意味着它会随着内核的存在而持续存在,与文件系统持久性、进程持久性(至少在Unix上具有管道)等不同。 - Ken

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接