基于桥接模式多平台共享内存管理设计及实现.docxVIP

基于桥接模式多平台共享内存管理设计及实现.docx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
基于桥接模式多平台共享内存管理设计及 实现 摘要:在多平台操作系统下,共享内存的实现存在一些差 异,在程序设计中通常依靠条件编译来实现,导致软件耦合 性太强,不利于扩充。该文结合设计模式中的桥接模式,提 出了一种支持多操作系统平台的共享内存程序设计方案改 进的新方法。 关键词:多平台;共享内存;桥接模式 中图分类号:TP311文献标识码:A文章编号: 1009-3044 (2012) 31-7592-05 在实时控制系统中,大部分系统都要求支持多种操作系 统平台,并且经常要进行大量的数据交换和共享。进程间的 数据交换和共享可以采用共享内存、管道、发送消息等几种 方法来直接完成,在这些方法中,共享内存能够很好的实现 进程间大容量数据的快速交换。在不同操作系统下,共享内 存的实现存在一些差异,因此,在软件设计中经常需要判别 操作系统的类型,分情况进行实现,这样极大地降低了软件 的可扩充性和实现细节对客户的透明性。本文旨在结合设计 模式中的Bridge模式,提出了一种多操作系统平台下,共 享内存模块的设计和实现方法。 1 Bridge 模式 Bridge模式的用意是将抽象部分与实现部分分离,使它 们都可以独立的变化。主要适用于以下情况:在类的抽象和 它的实现部分之间可以划分开,相互独立,还能动态结合; 类的抽象以及它的实现都应该可以通过生成子类的方法加 以扩充。结构图如图1所示。 2各平台共享内存的实现 共享内存(Shared Memory)是一种在Windows平台或 者Unix平台下多个进程之间通讯的常用方法。可用于同一 个程序中多个进程之间通讯,也可以用于不同程序之间的信 息传递。 2. 1 Windows平台下,共享内存的实现 在Windows操作系统中,任何一个进程不允许读取、写 入或是修改另一个进程的数据,但是在某个进程内创建的文 件映射对象的视图却能够为多个其他进程所映射,这些进程 共享的是物理存储器的同一个页面。因此,当一个进程将数 据写入此共享文件映射对象的视图时,其他进程可以立即获 取数据变更情况。为了进一步提高数据交换的速度,还可以 采用由系统页文件支持的内存映射文件而直接在内存区域 使用,显然这种共享内存的方式是完全可以满足在进程间进 行大数据量数据快速传输任务要求的。 具体步骤如下: 在发送进程中调用内存映射API函数 CreateFileMapping创建一个有名字标识的共享内存;函数 CreateFileMapping原型如下所示: HANDLE CreateFLeMapping ( HANDLE hFile , LPSECURITY_ATTRIBUTES lpFileMappingAttributes , DWORDflProtect , DWORD dwMaximumSizeHigh, DWORD dwMax i mumS i z eLow, LPCTSTR lpName ); 如果多个进程都要对同一共享内存进行写访问,则必须 保持相互间同步。映射文件还可以指定PAGE_WRITECOPY标 志,可以保证其原始数据不会遭到破坏,同时允许其他进程 在必要时自由的操作数据的拷贝。 在创建文件映射对象后,发送端进程调用 MapViewOfF订e函数映射到本进程的地址空间内; 接收端进程访问共享内存对象,需要通过内存对象名调 用0penFileMapping函数,以获得共享内存对象的句柄。然 后调用MapViewOfF订e函数来映射对象视图。用户可以使用 该对象视图来进行数据读写操作,以达到数据通讯的目的; 当用户进程结束使用共享内存后,调用 UnmapViewOfF订e函数以取消其地址空间内的视图。 2.2 Unix平台下,共享内存的实现 在发送端进程中创建一块共享内存,并设置共享内存的 大小。 在创建文件映射对象后,发送端进程将这块共享内存区 映射到本进程的地址空间内; 接收端进程访问共享内存对象,步骤同发送端。 当用户进程结束使用共享内存后,调用函数取消其地址 空间内的视图。 3多平台下,共享内存的传统实现方法 传统方式下,多平台共享内存的实现主要依靠条件编 译。同一段函数的实现过程中,针对不同的平台,要通过条 件编译来实现。也就是说,在实现共享内存的类 CSharedMemory中,每一个函数的具体实现,都要使用条件 编译来区分到底是哪一个平台。这种情况下,如果要修改某 一平台的程序,会影响其他平台程序的运行。 下面是 CShareMemory 类的头文件 Sharedmemory. h: 从以上类CShareMemory的定义及实现过程可以看出, 两种平台的共享内存通过条件编译来实现,会有很多弊端。 比如,修改某一种平台的程序,使得另一种平台也不能正常 运行,耦合性太强。另外,如果系统要扩充到一

文档评论(0)

ggkkppp + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档