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流上接收对方发送过来的数据代理(偏移量),才能在共享内存找到接收的数据。

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

ACE框架 基于共享内存的进程间通讯的更多相关文章

  1. ACE框架 基于共享内存的分配器 (算法设计)

    继承上一篇<ACE框架 基于共享内存的分配器设计>,本篇分析算法部分的设计. ACE_Malloc_T模板定义了这样一个分配器组件 分配器组件聚合了三个功能组件:同步组件ACE_LOCK, ...

  2. QSharedMemory共享内存实现进程间通讯(IPC)及禁止程序多开

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:QSharedMemory共享内存实现进程间通讯(IPC)及禁止程序多开     本文地址:h ...

  3. ACE框架 基于共享内存的分配器

    ACE框架提供了一个内存分配器模板,并且提供了(仅且)一个模板实例,基于共存内存的内存分配器.这个共存内存分配器模板实例在ACE框架应用于,基于内存映射的进程通讯,以及进程间同步等. ACE内存分配器 ...

  4. Windows进程间通讯(IPC)----共享内存

    Windows中同一个EXE文件多次加载过程 Windows中EXE文件加载是基于内存映射文件的. 当EXE文件第一次被加载. 首先系统会先创建一个进程内核对象,并创建一个新的进程地址空间. 系统调用 ...

  5. win32进程间通讯--共享内存

    小白一枚,如有不对,请各位大神多多指教! 最近看了看win32进程间通讯.简单写了写利用共享内存实现进程间通讯 使用共享内存实现进程间通讯: 1.在WM_CREATE消息下创建文件映射内核对象 hMa ...

  6. Linux 进程间通讯详解一

    进程间的通讯 两台主机间的进程通讯 --socket 一台主机间的进程通讯 --管道(匿名管道,有名管道) --System V进程间通信(IPC)包括System V消息队列,System V信号量 ...

  7. 进程间通讯之mmap文件共享

    进程间通讯之mmap文件共享 引文: 个人名言:“同一条河里淹死两次的人,是傻子,淹死三次及三次以上的人是超人”.经历过上次悲催的面试,决定沉下心来,好好的补充一下基础知识点.本文是这一系列第一篇:进 ...

  8. Linux 基于IPC机制实现进程间的共享内存处理

    今天学习了相关于IPC(InterProcess Communication ,进程间通信)的相关知识.就做个笔记,一来让大家检查一下我的理解方面是不是有错误,二来也为了能让更多的博友们了解到相关的知 ...

  9. 撸代码--linux进程通信(基于共享内存)

    1.实现亲缘关系进程的通信,父写子读 思路分析:1)首先我们须要创建一个共享内存. 2)父子进程的创建要用到fork函数.fork函数创建后,两个进程分别独立的执行. 3)父进程完毕写的内容.同一时候 ...

随机推荐

  1. RIDE-工程、测试套件、测试用例三者关系

    理论 type的选择: 一般来说:测试项目(directory)-测试套件(file)-测试用例 本质上,“测试项目”和“测试套件”并没有什么区别,但是testcase只能放在file类型的test ...

  2. python编程系列---多线程共享全局变量出现了安全问题的解决方法

    多线程共享全局变量出现了安全问题的解决方法 当多线程共享全局变量时,可能出现安全问题,解决机制----互斥锁:即在在一段与全局变量修改相关的代码中,假设一个时间片不足以完成全局变量的修改,就在这段代码 ...

  3. 13.多级代理下Nginx透传真实IP

    1.基于代理(七层负载均衡)情况下 透传客户端的真实IP 环境: 10.0.0.5 proxy_node1 一级代理 10.0.0.6 proxy_node2 二级代理 10.0.0.7 proxy_ ...

  4. 《HelloGitHub》第 43 期

    兴趣是最好的老师,HelloGitHub 就是帮你找到兴趣! 简介 分享 GitHub 上有趣.入门级的开源项目. 这是一个面向编程新手.热爱编程.对开源社区感兴趣 人群的月刊,月刊的内容包括:各种编 ...

  5. ESP8266开发之旅 网络篇⑬ SPIFFS——ESP8266 SPIFFS文件系统

    授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...

  6. Opentracing + Uber Jaeger 全链路灰度调用链,Nepxion Discovery

    当网关和服务在实施全链路分布式灰度发布和路由时候,我们需要一款追踪系统来监控网关和服务走的是哪个灰度组,哪个灰度版本,哪个灰度区域,甚至监控从Http Header头部全程传递的灰度规则和路由策略.这 ...

  7. git 的一些指令

    作为一个前端,git的各种指令应该是需要掌握的,因为前一段时间遇到了一些问题,总觉得每次遇到点问题都去百度这样总归不大好,还是记录一下比较常见的一些指令吧.以后遇到新的再继续添加. 1. 新建本地分支 ...

  8. Spring Boot 配置 - 配置信息加密

    ▶ Spring Boot 依赖与配置 Maven 依赖 <dependency> <groupId>org.springframework.boot</groupId& ...

  9. redis集群之Codis

    在大数据高并发场景下,单个 Redis 实例往往会显得捉襟见肘.首先体现在内存上,单个 Redis 的内存不宜过大,内存太大会导致 rdb 文件过大,进一步导致主从同步时全量同步时间过长,在实例重启恢 ...

  10. axio安装及使用

    先安装 npm install axios --save 再导入 import $ from "jquery"; import axios from "axios&quo ...