本文是对《Unix 网络编程 卷2:进程通信》的笔记。

引言

消息队列是进程间通信的一种方式,可是如果不理解他的实现原理,会有众多不理解之处,下面就结合本书中的例子,对posix消息队列来一个说明。

1、消息队列是进程间通信,那谁来保证他们的进程互斥共享呢,即读写不交叉?

2、消息队列异步通信机制(解释:异步通信是一个进程A需要读消息队列,但是队列是空的,又不想阻塞,那么当进程B给消息队列送入消息之后谁来通知A消息队列已经有消息了呢)是如何实现的呢?

3、消息队列结构(本文用存储映射I/O实现消息队列)?

                      Posix消息队列内核结构

这个地方由于使用画图软件不太友好,剩下的几个消息结构不能展现出来了。基本上属性的作用在途中已经标明,对于之前提出的几个问题,相信你能够通过这个图来自己给出答案。

几个重要的函数实现

mq_open()  打开一个文件,并进行存储映射,将这个内存实现为消息队列的结构。当然里面还是有很多细节的。有兴趣的可以看看这本书上给出的源码。

mq_close() 关闭消息队列,释放存储映射内存和消息队列描述符所占用的内存。

mq_getattr() mq_setattr() 这内部实现还是要用到互斥锁,因为获取属性的时候,不希望有线程去修改他的属性;同理,设置属性的时候,不希望有线程区读取他的属性。

mq_send() mq_receive() 这个内部实现不仅要用到互斥锁还要用到条件变量。互斥锁是用来保证只有一个线程操作消息队列,条件变量和互斥锁结合起来是用来当消息队列空的时候,有进程读,就会陷入阻塞,当消息队列为慢的时候,有进程想要写,就会陷入阻塞,这个时候条件变量就可以用来互相唤醒了。

mq_notify()  这个函数是用来实现消息队列由空变为非空的时候,给一个注册进程发送通知(内部通过kill函数给这个注册进程发送信号进行异步通知)。进程调用这个函数就会被注册到消息队列中。任意时刻,只有一个进程能注册到为接收某个队列的通知。

最新文章

  1. HTTP 基础知识
  2. Web端即时通讯技术原理详解
  3. 21 数据库编程 - 《Python 核心编程》
  4. mysql数据库 安装 (原创)
  5. javascript中继承(一)-----原型链继承的个人理解
  6. 安卓升级提示 phoneGap APK软件更新提示
  7. JS远程获取网页源代码的例子
  8. [C入门 - 游戏编程系列] 贪吃蛇篇(一) - 世界定义
  9. IOS 特定于设备的开发:Core Motion基础
  10. Codeforces 430B Balls Game(Two Pointers)
  11. iOS上线项目源码分享
  12. [面试算法题]比较二叉树异同-leetcode学习之旅(5)
  13. 在docker中安装mysql
  14. ☆ [HDU4825] Xor Sum「最大异或和(Trie树)」
  15. SparkR-Install
  16. ABP框架系列之八:(Introduction-介绍)
  17. 【转】 Ubuntu在启动器添加程序快捷方式
  18. Unity4.6证书激活问题
  19. Patchwork(2013年)--CNV检测方法流程
  20. hdu 1269 迷宫城堡 最简单的联通图题 kosaraju缩点算法

热门文章

  1. 规划(纪念我在ACM道路上的一年)
  2. POJ 2387 Til the Cows Come Home(dij+邻接矩阵)
  3. openwrt 包makefile
  4. ios控件 UIImageView
  5. 更改Xcode的缺省公司名
  6. viewpager处理(一):让viewpager不能滑动
  7. DataBinding
  8. Update Case的用法与execute执行字符串
  9. linux命令-sed,uniq,cut,wc
  10. Java 向Hbase表插入数据报(org.apache.hadoop.hbase.client.HTablePool$PooledHTable cannot be cast to org.apac