ACE框架 基于共享内存的进程间通讯
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框架 基于共享内存的进程间通讯的更多相关文章
- ACE框架 基于共享内存的分配器 (算法设计)
继承上一篇<ACE框架 基于共享内存的分配器设计>,本篇分析算法部分的设计. ACE_Malloc_T模板定义了这样一个分配器组件 分配器组件聚合了三个功能组件:同步组件ACE_LOCK, ...
- QSharedMemory共享内存实现进程间通讯(IPC)及禁止程序多开
版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:QSharedMemory共享内存实现进程间通讯(IPC)及禁止程序多开 本文地址:h ...
- ACE框架 基于共享内存的分配器
ACE框架提供了一个内存分配器模板,并且提供了(仅且)一个模板实例,基于共存内存的内存分配器.这个共存内存分配器模板实例在ACE框架应用于,基于内存映射的进程通讯,以及进程间同步等. ACE内存分配器 ...
- Windows进程间通讯(IPC)----共享内存
Windows中同一个EXE文件多次加载过程 Windows中EXE文件加载是基于内存映射文件的. 当EXE文件第一次被加载. 首先系统会先创建一个进程内核对象,并创建一个新的进程地址空间. 系统调用 ...
- win32进程间通讯--共享内存
小白一枚,如有不对,请各位大神多多指教! 最近看了看win32进程间通讯.简单写了写利用共享内存实现进程间通讯 使用共享内存实现进程间通讯: 1.在WM_CREATE消息下创建文件映射内核对象 hMa ...
- Linux 进程间通讯详解一
进程间的通讯 两台主机间的进程通讯 --socket 一台主机间的进程通讯 --管道(匿名管道,有名管道) --System V进程间通信(IPC)包括System V消息队列,System V信号量 ...
- 进程间通讯之mmap文件共享
进程间通讯之mmap文件共享 引文: 个人名言:“同一条河里淹死两次的人,是傻子,淹死三次及三次以上的人是超人”.经历过上次悲催的面试,决定沉下心来,好好的补充一下基础知识点.本文是这一系列第一篇:进 ...
- Linux 基于IPC机制实现进程间的共享内存处理
今天学习了相关于IPC(InterProcess Communication ,进程间通信)的相关知识.就做个笔记,一来让大家检查一下我的理解方面是不是有错误,二来也为了能让更多的博友们了解到相关的知 ...
- 撸代码--linux进程通信(基于共享内存)
1.实现亲缘关系进程的通信,父写子读 思路分析:1)首先我们须要创建一个共享内存. 2)父子进程的创建要用到fork函数.fork函数创建后,两个进程分别独立的执行. 3)父进程完毕写的内容.同一时候 ...
随机推荐
- nginx::配置https/反向代理
vim /etc/nginx/nginx.conf user nginx; worker_processes ; error_log /var/log/nginx/error.log warn; pi ...
- SpringBoot学习(三)探究Springboot自动装配
目录 什么是自动装配 何时自动装配 原理分析 注:以下展示的代码springboot的版本为2.0.3版.因源码过长,大家选择展开代码 ㄟ( ▔, ▔ )ㄏ 什么是自动装配 自动装配还是利用了Spri ...
- os模块/sys模块/json/pickle模块/logging模块(day16整理)
目录 今日内容 os模块 对文件操作 对文件夹此操作 辅助性的 了解 sys模块 json和pickle模块 json模块 pickle模块 logging模块 日志级别 添加设置 自定义配置 今日内 ...
- spring boot 整合JPA多数据源
上个文章介绍了spring boot在使用Mybatis持久化技术的时候如何使用多数据源,今天再补充一个使用spring data jpa实现多数据源的使用情况,JPA是一套数据库持久化规范,或者称之 ...
- LeetCode刷题笔记(1)常用知识点
1.Integer.parseInt(String s, int radix)方法的作用是:将radix进制的字符串s转化成10进制的int型数字并返回. Integer.valueof(String ...
- 深入理解.NET Core的基元(二) - 共享框架
原文:Deep-dive into .NET Core primitives, part 2: the shared framework 作者:Nate McMaster 译文:深入理解.NET Co ...
- Vue入坑第一篇
写在前面的话:文章是个人学习过程中的总结,为方便以后回头在学习.文章中会参考官方文档和其他的一些文章,示例均为亲自编写和实践,若有写的不对的地方欢迎大家和我一起交流. 一.前言 本篇作为vue入门的一 ...
- Python中xml和dict格式转换
在做接口自动化的时候,请求数据之前都是JSON格式的,Python有自带的包来解决.最近在做APP的接口,遇到XML格式的请求数据,费了很大劲来解决,解决方式是:接口文档拿到的是XML,在线转化为js ...
- ssh WARNING:REMOTE HOST IDENTIFICATION HAS CHANGED(警告:远程主机标识已更改)
ssh 192.168.1.88 出现以下警告: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ WARNING: REMOT ...
- 使用ESP8266 打造一款物联网产品---新版ESP8266-RTOS-SDK(V3.1以上)串口使用指南
问题背景: 使用乐鑫的ESP8266做一个物联网的项目,要使用串口0通信,串口1作为打印log.本来是一个非常简单的事情.没想到居然里面有个大坑.本着前任踩坑,后任抱娃的原则. 这里就做个记录,给后面 ...