2010-03-18 64 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

相关问题