没有合适的资源?快使用搜索试试~ 我知道了~
【系统架构设计师】共享内存实现进程间大数据的交换
5星 · 超过95%的资源 需积分: 9 57 下载量 176 浏览量
2012-02-22
22:05:31
上传
评论
收藏 25KB DOC 举报
温馨提示
试读
4页
引言 进程间的数据交换和共享是一种非常重要和实用的技术。大、中型软件的开发设计多是由众多程序设计人员的合作完成,通常一个程序设计人员只负责其中一个或几个模块的开发,这些模块可以是动态链接库也可以是应用程序或是其他形式的程序组件。这些独立开发出来的程序模块最终需要作为一个整体来运行,即组成一个系统,在系统运行期间这些模块往往需要频繁地进行数据交换和数据共享,对于动态链接库同其主调应用程序之间的数据交换是非常容易实现的,但是在两个应用程序之间或是动态链接库同其主调应用程序之外的其他应用程序进行数据交换就比较困难了。尤其是在交换数据量过大、交换过于频繁的情况下更是难以实现,本文即对此展开讨论,并提出了一种通过共享内存来实现进程见大数据量快速交换的一种方法。
资源推荐
资源详情
资源评论
共享内存实现进程间大数据的交换
引言
进程间的数据交换和共享是一种非常重要和实用的技术。大、中型软件的开发设计多
是由众多程序设计人员的合作完成,通常一个程序设计人员只负责其中一个或几个模块的
开发,这些模块可以是动态链接库也可以是应用程序或是其他形式的程序组件。这些独立
开发出来的程序模块最终需要作为一个整体来运行,即组成一个系统,在系统运行期间这
些模块往往需要频繁地进行数据交换和数据共享,对于动态链接库同其主调应用程序之间
的数据交换是非常容易实现的,但是在两个应用程序之间或是动态链接库同其主调应用程
序之外的其他应用程序进行数据交换就比较困难了。尤其是在交换数据量过大、交换过于
频繁的情况下更是难以实现,本文即对此展开讨论,并提出了一种通过共享内存来实现进
程见大数据量快速交换的一种方法。
通讯方式的比较和选择
进程间通讯的方式有很多,常用的有共享内存、命名管道和匿名管道、发送消息等几
种方法来直接完成,另外还可以通过 socket 口、配置文件和注册表等来间接实现进程间数
据通讯任务。以上这几种方法各有优缺点,具体到在进程间进行大数据量数据的快速交换
问题上,则可以排除使用配置文件和注册表的方法;另外,由于管道和 socket 套接字的使
用需要有网卡的支持,因此也可以不予考虑。这样,可供选择的通讯方式只剩下共享内存
和发送消息两种。由于数据量比较大,这样在使用消息进行通讯时就无法通过消息参数将
数据直接携带到接收方,只能以地址传送的方式进行。当一个应用程序向另一个应用程序
发送数据时将会发出 WM_COPYDATA 系统消息,因此可以考虑通过向消息队列插入
WM_COPYDATA 消息的方法来实现数据在进程间的拷贝。
在使用 WM_COPYDATA 消息时,由第一个消息参数指定发送窗口的句柄,第二个消
息参数则为一同数据相关的数据结构 COPYDATASTRUCT 的指针,此结构原形声明如下:
typedef struct tagCOPYDATASTRUCT {
DWORD dwData;
DWORD cbData;
PVOID lpData;
} COPYDATASTRUCT;
其中,只需将待发送数据的首地址赋予 lpData、并由 cbData 指明数据块长度即可。
消息发出后,接收方程序在 WM_COPYDATA 消息的响应函数中通过随消息传递进来的第
二个参数完成对数据块的接收。但是在使用 WM_COPYDATA 消息时,只能用
SendMessage()函数发送而不能使用 PostMessage(),这两个函数虽然功能非常相似都是
负责向指定的窗口发送消息,但是 SendMessage()函数发出消息后不是马上返回,而是在
接收方的消息响应函数处理完之后才能返回,并能够得到返回结果。在此期间发送方程序
将被阻塞,SendMessage()后面的语句不能被继续执行。而 PostMessage()函数在发出消
息后马上返回,其后语句能够被立即执行,但是无法获取消息的执行结果。可见,在交换
数据量较大的情况下实现数据频繁而又快速的交换用发送 WM_COPYDATA 消息的方法也
是不合适的,当数据传输过于频繁时将有可能导致数据的丢失。
比之以上几种进程间通讯方法,共享内存有着明显的优势。共享内存是通过直接操作
内存映射文件来进行的,而内存映射文件又是进行单机数据共享的最低层机制,前面几种
数据交换方式在低层都是通过内存映射文件来进行的。因此使用共享内存可以以较小的开
资源评论
- twinter2012-12-03很好,对我来说可以实现.
- operator11212013-05-24不错,实现内存共享,充分利用PC服务器内存资源
- jiankunww2013-05-14相对来说不错。。。但是Microsoft Visual C++ 6.0的代码
- abc123zxc22014-03-05很有借鉴意义,学习
myleilei
- 粉丝: 2
- 资源: 117
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 全卷积网络基于voc2012数据集简单pytorch实现
- pycharm的一些介绍-用于更好的学习python
- 基于C++的程序设计大赛天梯赛L2答案(天梯赛)
- 基于python实现的三次样条插值和均值插值法实现
- Python语言教程2-python批量图片大小处理-多文件夹
- Python语言教程1-python批量图片重命名,将后缀某几个不想要的字去除
- Space Combat Kit 太空战斗套件Unity游戏开发插件资源unitypackage C#
- Universal Device Preview 通用设备预览Unity游戏开发插件资源unitypackage
- Paladin Anim Set 圣骑士动画集Unity游戏动作动画插件资源unitypackage
- 计算机财务管理期末考报表部分题目及答案.doc
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功