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)父进程完毕写的内容.同一时候 ...
随机推荐
- 面试官,不要再问我“Java虚拟机类加载机制”了
关于Java虚拟机类加载机制往往有两方面的面试题:根据程序判断输出结果和讲讲虚拟机类加载机制的流程.其实这两类题本质上都是考察面试者对Java虚拟机类加载机制的了解. 面试题试水 现在有这样一道判断程 ...
- 关于托福改革后的难度、评分和拼分,听听ETS的老师怎么说
“笔者有幸于几天前去到ETS位于普林斯顿的总部学习,聆听了他们关于托福考试的发展和变革的说明,在这里向大家汇报一下此行的收获.” 当从车上下来那一刻起,我们便被那辽阔的绿草地和宜人的风景所吸引,伴随着 ...
- linux下安装配置svn服务器
linux下安装配置svn服务器 1. svn服务器安装 将subversion-1.4.0.tar.gz和subversion-deps-1.4.0.tar.gz传到服务器. tar xfvz su ...
- 封装自己通用的 增删改查的方法 By EF
封装自己的通用CURD By EF using System; using System.Collections.Generic; using System.Data.Entity; using Sy ...
- Spring MVC(1)Spring MVC的初始化和流程以及SSM的实现
一.Spring MVC概述 1.Spring MVC 的架构 对于持久层而言,随着软件的发展,迁移数据库的可能性很小,所以在大部分情况下都用不到Hibernate的HQL来满足迁移数据库的要求.与此 ...
- ORM之单表操作
ORM简介 MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人员的 ...
- 一个开源组件 bug 引发的分析
这是一个悲伤的故事.某日清晨,距离版本转测还剩一天,切图仔的我正按照计划有条不紊的画页面.当我点击一个下拉弹框组件中分页组件页数过多而出现的向后 5 页省略号时,悲剧开始了,弹框被收回了.情景再现 问 ...
- SQLserver2016对字段是json对象查询
现在2016内置对json对象的查询支持了.正好项目中用到,做个备忘 如果字段内容是: [{"tagid":"100015","orderid&quo ...
- 前端技术之:如何在控制台将JS class实例输出为JSON格式
有一个类: class Point { constructor(x, y) { this.x = x; this.y = y; } } 如果我们在控制台中输出其实例: console.log(new ...
- Python 中 -m 的典型用法、原理解析与发展演变
在命令行中使用 Python 时,它可以接收大约 20 个选项(option),语法格式如下: python [-bBdEhiIOqsSuvVWx?] [-c command | -m module- ...