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)父进程完毕写的内容.同一时候 ...
随机推荐
- python学习-多线程并发
1.线程与进程 通俗解释: 对于操作系统来说,一个任务就是一个进程(Process),比如打开一个浏览器就是启动一个浏览器进程,打开一个记事本就启动了一个记事本进程,打开两个记事本就启动了两个记事本进 ...
- Linux本地内核提权漏洞复现(CVE-2019-13272)
Linux本地内核提权漏洞复现(CVE-2019-13272) 一.漏洞描述 当调用PTRACE_TRACEME时,ptrace_link函数将获得对父进程凭据的RCU引用,然后将该指针指向get_c ...
- SpringBoot学习(二)探究Springboot启动机制
引言: SpringBoot为我们做的自动配置,确实方便快捷,但是对于新手来说,如果不大懂SpringBoot内部启动原理,以后难免会吃亏.所以这次博主就跟你们一起探究一下SpringBoot的启动原 ...
- C++ 构造函数的执行过程(一) 无继承
引言 C++ 构造函数的执行过程(一) 无继承 本篇介绍了在无继承情况下, C++构造函数的执行过程, 即成员变量的构建先于函数体的执行, 初始化列表的数量和顺序并不对构造函数执行顺序造成任何影响 ...
- Solr导入MongoDB数据
数据导入方式: 全量导入和增量导入: query 是全量导入时,把你的数据中查到的数据全部导入,deltaImportQuery 和 deltaQuery 是增量导入数据所需要的两个查询语句.delt ...
- 优化 .net core 应用的 dockerfile
优化 .net core 应用的 dockerfile Intro 在给 .net core 应用的写 dockerfile 的时候一直有个苦恼,就是如果有很多个项目,在 dockerfile 里写起 ...
- nginx配置中location匹配规则详解
一.概述 nginx官方文档给出location语法如下: 1 location [=|~|~*|^~] uri { … } 其中,方括号中的四种标识符是可选项,用来改变请求字符串和uri的匹配方式. ...
- 设计模式(十九)State模式
在面向对象编程中,是用类表示对象的.也就是说,程序的设计者需要考虑用类来表示什么东西.类对应的东西可能存在于真实世界中,也可能不存在于真实世界中.对于后者,可能有人看到代码后会感到吃惊:这些东西居然也 ...
- 游图邦YOTUBANG是如何搭建生态系统的?
现在的我们最关心的一个问题就是任何一个行业,如果没有办法很好的落地,就算描绘的非常美好,那也只是空中楼阁.昙花一现而已,它无法实现长久的一个发展.互联网时代呢,就是一个流量为王的一个时代,谁拥有庞大的 ...
- Linux后台运行Jar方法
原文地址:http://blog.csdn.net/c1481118216 https://blog.csdn.net/c1481118216/article/details/53010963 在li ...