ACE框架将基于共享内存的进程间通讯功能,如其它IO组件或IPC组件一样,设计成三个组件。流操作组件ACE_MEM_Stream,连接器组件ACE_MEM_Connector,以及接收连接组件ACE_MEM_Accpter。ACE框架为基于共享内存的进程间通讯提供了两种数据传输(分发deliver)策略。一种是使用生产者-消费者队列的一对多的多用户MT策略,另一种是使用socket流的可以使用反应器响应数据接收事件的Reactor策略。不论哪一种策略都要通过socket进行TCP连接,并进行进程间通讯的握手。

基于共享内存的进程间通讯的流操作组件使用了策略模式,并实现了一个适配器ACE_MEM_IO,适配到IO常规操作接口,分别有对普通数据块,以及ACE_Message_Block消息块的操作接口。适配器接口的实现应用策略组件ACE_MEM_SAP。连接器组件ACE_MEM_Connector,以及接收连接组件ACE_MEM_Accpter同样会应用策略组件ACE_MEM_SAP的初始化接口对进行连接的进程间通讯流初始化。而策略组件ACE_MEM_SAP的算法实现都依赖上两篇介绍的内存块分配器组件。

基于共享内存的进程间通讯连接器和连接接收器(Connector-Accepter)应用socket通讯来完成进程间通讯流的连接建立。基于共享内存的进程间通讯流建立起连接,双方必须使用相同分配器选项初始化一样的分配器,以及必须使用一致的数据传输(分发deliver)策略。也就是说基于共享内存的进程间通讯流在连接阶段,必须交换彼此的信息进行握手。在此阶段必须依赖另一种通用的进程间通讯方式来进行信息的交换。因此基于共享内存的进程间通讯流必须借助socket流进行信息的交换。交换策略信息后,流的服务端会向流的客户端发送文件映射地址。由于Reactor策略会复用socket流向对方发送共享内存的数据节点代理,一个共享内存空间的偏移量,流的客户端只需要根据文件映射地址打开内存映射区域就可以了。而MT策略则使用创建在共享内存上的生产者-消费者队列,流的客户端还必须打开生产者-消费者队列所有的资源。而这些操作都是由策略组件的初始化接口完成的。也可以说连接器和连接接收器(Connector-Accepter)在连接阶段对流的策略进行初始化。

这里要注意,基于共享内存的进程间通讯流使用的分配器初始化选项是由连接器和连接接收器(Connector-Accepter)进行指定的。并且这些选项是连接器和连接接收器(Connector-Accepter)的私有成员,用户不能对其修改。我们的分配器被硬指定为固定在进程空间64M处理进行内存映射,并且不得修改,从而保证共享内存在进程之间的地址一致。

MT策略使用了生产者-消费者队列,并且有一对,一条队列客户端为生产者,流服务端为消费者,而另一条队列则是流服务端为生产者,流客户端为消费者。这两条队列只能由一个流服务端提供,并且可以供多个流客户端使用。作为消费者的一方阻塞在队列的semaphore上,由队列的生产者进行通知。

MT策略不能使用Reactor进行IO多路复用,所以有另一种用于Reactor进行IO多路复用的策略,Reactive策略。这种策略,进程间通讯流只可以在建立socket连接的双方之间进行。因为这个种策略使用socket流发送共享内存上的数据代理(偏移量),双方必须在socket流上接收对方发送过来的数据代理(偏移量),才能在共享内存找到接收的数据。

我们还可以看到基于共享内存的进程间通讯是如何使用上两篇介绍的分配器提供的两种服务。

最新文章

  1. js 的Location对象
  2. Java Base64 类
  3. struts2 访问Web元素的4种方法
  4. DP:Making the Grade(POJ 3666)
  5. bash: 避免命令重复执行的简单脚本
  6. Oracle----Key Word
  7. opencv学习笔记-图像叠加、混合
  8. CH Round #53 -【Nescafé 32】杯NOIP模拟赛
  9. c#配置文件的简单操作
  10. Java基础语法(三)---数组
  11. Course2-Python函数和模块
  12. 电子医疗设备创新研发应该用i.MX6Q开发板吗?为医疗设备提供解决方案
  13. Vue-admin工作整理(十九):从数字渐变组件谈第三方JS库Count-to的使用
  14. netty源码解解析(4.0)-6 线程模型-IO线程EventLoopGroup和NIO实现(一)
  15. SAP SD模块功能构成
  16. Heapify
  17. bzoj2565 最长双回文子串
  18. JavaScript jQuery 笔记
  19. Android 音视频开发入门指南
  20. nginx搭建mp4流服务器

热门文章

  1. 阻塞IO模型
  2. VS2017-Linux项目-使用第三方库如何配置
  3. Distinct 实现自定义去重
  4. 个人记账app(一)需求设计
  5. SoapUI 关联之Property Transfer、JSONPath、Xpath
  6. 基于Java的开源爬虫框架WebCollector的使用
  7. Java基础(七)泛型数组列表ArrayList与枚举类Enum
  8. 对于Serializable的理解
  9. java和Jvm目录
  10. Office中国在这个开个博客