消息队列和管道的区别(转载)

摘要:
在内存中,消息缓冲区被组织成队列,通常称为消息队列。至于消息队列,某些UNIX系统当然不支持它。消息队列用于线程之间的信息交换,作为打破忠诚度的一种方式。Vxworks消息队列消息队列允许排列一定数量的不同长度的消息。多任务可以从同意消息队列发送和接收消息。与消息队列一样,ISR可以写入管道,但不能从中读取。

转载自:http://bbs.chinaunix.net/viewthread.php?tid=265266
作者:beginner-bj
请问管道和消息队列有什么不同


管道通信(PIPE)

管道通信方式的中间介质是文件,通常称这种文件为管道文件。两个进程利用管道文件进行通信时,一个

进程为写进程,另一个进程为读进程。写进程通过写端(发送端)往管道文件中写入信息;读进程通过读

端(接收端)从管道文件中读取信息。两个进程协调不断地进行写、读,便会构成双方通过管道传递信息

的流水线。

利用系统调用PIPE()创建一个无名管道文件,通常称为无名管道或PIPE;利用系统调用MKNOD()创建

一个有名管道文件,通常称为有名管道或FIFO。

PIPE是一种非永久性的管道通信机构,当它访问的进程全部终止时,它也将随之被撤消;它也不能用于不

同族系的进程之间的通信。而FIFO是一种永久的管道通信机构,它可以弥补PIPE的不足。

管道文件被创建后,便可对它进行读写操作,通过系统调用WRITE()和READ()来实现。通信完毕后,

可将管道文件关闭,用CLOSE()来实现。

消息通信(MESSAGE)

消息通信方式以消息缓冲区为中间介质,通信双方的发送和接收操作均以消息为单位。在存储器中,消息

缓冲区被组织成队列,通常称之为消息队列。

创建消息队列用系统调用MSGGET()来实现,这一步工作也被称为消息队列的初始化。在进行通信时,消

息队列的发送和接收分别用系统调用MSGSND()和MSGRCV()来实现。在需要改变队列的使用权限及其它

一些特性时,用MSGCTL()来实现。

转载自:http://bbs.chinaunix.net/viewthread.php?tid=257062
作者:foxmanzj

请问消息队列比运用管道有什么优势?


管道一般用于父子进程间通信(有名管道除外,有名管道不限于父子进程通信)。而消息队列可用于你机

器上的任何进程间通信(只要进程有权操作消息队列)。

转载自:http://www.linuxsir.org/bbs/showthread.php?t=235978
作者:kj501
如果要大规模的复制数据,最快的方法莫过于共享内存。管道只是所有的UNIX都支持,性能上肯定不如共

享内存。
至于消息队列,有些UNIX系统肯定是不支持的。具体的你可以看看APUE第二版的15.1节

转载自:http://www.ibm.com/developerworks/cn/linux/l-ipc/part3/
消息队列与管道以及有名管道相比,具有更大的灵活性,首先,它提供有格式字节流,有利于减少开发人

员的工作量;其次,消息具有类型,在实际应用中,可作为优先级使用。这两点是管道以及有名管道所不

能比的。同样,消息队列可以在几个进程间复用,而不管这几个进程是否具有亲缘关系,这一点与有名管

道很相似;但消息队列是随内核持续的,与有名管道(随进程持续)相比,生命力更强,应用空间更大。

转载自:http://blog.sina.com.cn/s/blog_4a0e545d01000c7l.html

vxworks消息队列与其他方式的一些比较:

1、信号量使用方便,可以解决很多任务间的协调问题,但是信号量所传递的信息有限,而内存共享虽然

传递信息可以大些,但是不标准。消息队列作为一种折忠方式用于线程之间的信息交换。

2、消息队列允许许多的消息排队,而每个信息可以有不同长度,而传统管道中的数据仅仅是一个数据流

,没有边界。Vxworks中的管道数据有消息组成。


vxworks消息队列
消息队列允许一定数量不同长度的消息进行排列。任何任务或中断服务程序(ISR)能够发送消息给消息队

列。任何任务可以从消息队列接受消息。多任务可以从同意消息队列发送和接受消息。两个任务之间的全

双工(Full-duplex)通信需要针对不同方向的两个消息队列。
一个任务或中断服务程序(ISR)用函数msgQSend( )发送一个消息到消息队列。如果没有任务等待消息队列

的消息,这个消息被添加消息缓存的队列里。如果某些任务已经在等待消息队列中的消息,消息立刻被传

递给第一个等待的消息的任务。

一个任务用函数msgQReceive( )从消息队列得到一个消息。如果消息队列缓存中有消息存在,第一个消息

立刻出列并回到调用处(caller).如果没有消息存在,则任务(calling task)停止(blocks)并被添加到

等待消息的任务队列中。这个等待的任务队列按照优先级或先进先出(FIFO)规则排列,这个规则有消息

队列创建时所指定。

管道(Pipes)

管道对消息队列提供了一个可供选择的接口,VxWorks的I/O系统。管道是虚拟的I/O设备,由驱动pipeDrv

管理。函数pipeDevCreate()创建一个管道设备,这个调用指定管道的名字,能被排列的最多的消息数,

和每个消息允许的长度。

status = pipeDevCreate ("/pipe/name", max_msgs, max_length);

被创建的管道是一个通常命名(named)的I/O设备,任务能用标准的I/O函数打开,读,写管道,并能调用

ioctl例程。当任务试图从一个空的管道中读取数据,或向一个满的管道中写入数据时,任务被阻塞。和

消息队列一样,ISR可以向管道写入,但不能从管道读取。

转载自:http://www.witech.com.cn/news/Article_Show.asp?ArticleID=231

vxworks消息队列和管道
消息队列是VxWorks提供的单个CPU中的任务之间通信的主要机制之一。消息队列允许基于FIFO或基于任务

优先级方式排队消息,一个消息队列的消息数目和消息长度可以由开发者在创建消息队列时指定。在理论

上,VxWorks允许多个任务向同一个消息队列发送消息,或者从同一个消息队列接收消息;而在实际应用

中,一般来说只有一个任务从消息队列接收消息,有一个或多个任务发送消息,即这个消息队列有多个生

产者,而只有一个消费者。消息队列时单向的,对于需要进行双向通信的两个任务,必须使用两个消息队

列。消息队列非常适合于Client-Server结构的任务之间的通信.

在VxWorks中,消息队列是一种代价比较高的一种通信机制,因此在使用时应该使消息的长度尽量短,而

且应避免在需要十分频繁通信的场合使用消息队列。另外消息队列中的消息是排队的,即使是完全相同的

消息,后面的消息也不会覆盖前面的消息。

管道(pipe)
在VxWorks中,管道是一种通过虚拟的I/O设备来实现的消息队列通信机制。使用函数pipeDevCreate()和

pipeDevDelete()来生成和删除管道,管道一经生成后,任务之间就可以使用标准I/O操作主要是read()和

write()进行通信。管道的优点在于它是一个I/O设备,与标准的VxWorks
I/O一样,可以使用select机制,而有了select机制,一个任务很方便地使用多个异步I/O设备,如任务要

处理同时从串口、管道、socket接收到的数据,就可以使用select。

免责声明:文章转载自《消息队列和管道的区别(转载)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Java中MongoDB返回ObjectId的差异iOS数据持久化的方式下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

kafka springboot (或 springcloud ) 整合

狂创客圈 经典图书 : 《Netty Zookeeper Redis 高并发实战》 面试必备 + 面试必备 + 面试必备 【博客园总入口 】 疯狂创客圈 经典图书 : 《SpringCloud、Nginx高并发核心编程》 大厂必备 + 大厂必备 + 大厂必备 【博客园总入口 】 入大厂+涨工资必备: 高并发【 亿级流量IM实战】 实战系列 【 Sprin...

Android 操作系统的内存回收机制

Android 是一款基于 Linux 内核,面向移动终端的操作系统。为适应其作为移动平台操作系统的特殊需要,谷歌对其做了特别的设计与优化,使应用程序关闭但不退出,并由操作系统进行进程 的回收管理。本文在 Application Framework 与 Linux 内核两个层次上,以进程为粒度,对 Android 操作系统的进程资源回收机制进行了剖析。读者...

rabbitMQ第二篇:java简单的实现RabbitMQ

前言:在这里我将用java来简单的实现rabbitMQ。下面我们带着下面问题来一步步的了解和学习rabbitMQ。 1:如果消费者连接中断,这期间我们应该怎么办 2:如何做到负载均衡 3:如何有效的将数据发送到相关的接收者?就是怎么样过滤 4:如何保证消费者收到完整正确的数据 5:如何让优先级高的接收者先收到数据 一:"Hello RabbitMQ" 下面...

基于P2P的匿名技术研究

李超 北京图形研究所 摘要:本文针对匿名通信中两种基本技术:Mix和洋葱路由进行了论述,并分析了P2P网络对于Mix网络和传统的洋葱路由的改进和缺陷,论述了基于P2P的匿名通信在提高通信性能和抗攻击能力上的实现技术。 关键词:P2P 洋葱路由 网络 匿名 1、概述  传统意义下的网络安全包括以下四个要素:秘密性(Confidentiality)、完整性(I...

BACnet标准初探

一、准备知识BACnet是用于智能建筑的通讯协定,是国际标准化组织(ISO)、美国国家标准协会(ANSI)及美国冷冻空调协会(ASHRAE)定义的通讯协定。BACnet针对智能建筑及控制系统的应用所设计的通讯,可用在暖通空调系统(HVAC,包括暖气、通风、空气调节)也可以用在照明控制、门禁系统、火警侦测系统及其相关的设备。优点在于能降低维护系统所需成本并且...

java和vb进行socket通信以及java与c/c++/oc 进行socket通信时汉字字符串编码问题解决

java和vb进行socket 以及java与c/c++/oc 进行socket通信时汉字字符串编码问题解决 我遇到的是 java 编码字符集采用 UTF-8 编码字符采用2+字符 我测试的代码如下 System.out.println("UTF-8:a->" + "a".getBytes("UTF-8").length); System....