当前位置:嗨网首页>书籍在线阅读

12-System V消息队列的缺点

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

46.9 System V消息队列的缺点

UNIX系统为同一系统上不同进程之间的数据传输提供了多种机制,既包括无分隔符的字节流形式(管道、FIFO以及UNIX domain流socket),也包括有分隔符的消息形式(System V消息队列、POSIX消息队列以及UNIX domain数据报socket)。

System V消息队列的一个与众不同的特性是它能够为每个消息加上一个数字类型。应用程序可以使用这个完成两件事情:读取进程可以根据类型来选择消息或者它们可以采用一种优先队列策略以便优先读取高优先级的消息(即那些消息类型值更低的消息)。

但System V消息队列也存在几个缺点。

  • 消息队列是通过标识符引用的,而不是像大多数其他UNIX I/O机制那样使用文件描述符。这意味着在第63章介绍的各种基于文件描述符的I/O技术(如select()、poll()以及epoll)将无法应用于消息队列上。此外,在程序中编写同时处理消息队列的输入和基于文件描述符的I/O机制的代码要比编写只处理文件描述符的代码更加复杂。(在练习63-3中将考虑一种组合两种I/O模型的方法。)
  • 使用键而不是文件名来标识消息队列会增加额外的程序设计复杂性,同时还需要使用ipcs和ipcrm来替换ls和rm。ftok()函数通常能产生一个唯一的键,但却无法保证。使用IPC_PRIVATE键能确保产生唯一的队列标识符,但需要使这个标识符对需要用到它的其他进程可见。
  • 消息队列是无连接的,内核不会像对待管道、FIFO以及socket那样维护引用队列的进程数。因此就难以回答下列问题。
    • 一个应用程序何时能够安全地删除一个消息队列?(不管是否有进程在后面某个时刻需要从队列中读取数据而过早地删除队列会导致数据丢失。)
    • 应用程序如何确保不再使用的队列会被删除呢?
  • 消息队列的总数、消息的大小以及单个队列的容量都是有限制的。这些限制都是可配置的,但如果一个应用程序超出了这些默认限制的范围,那么在安装应用程序的时候就需要完成一些额外的工作了。

总体上来讲,最好避免使用System V消息队列。当碰到需要使用根据类型选择消息的工具的情况时应该考虑使用其他替代方案。POSIX消息队列(第52章)就是这样一种替代方案。更深层次一点的替代方案是使用基于多文件描述符的通信通道,它们在提供与根据类型选择消息类似的功能的同时还允许使用在63章介绍的另一种I/O模型。例如,如果需要传输“普通”和“优先”消息,那么可以为两种消息类型使用一组FIFO或UNIX domain socket,然后使用select()或poll()监控两个通道上的文件描述符。