win32进程间通信问题请教各位高手!

zhoupu2004 2007-03-12 07:41:29
有两个进程A,B。进程B模拟系统的工作环境,从数据库中把数据读出,然后传递给进程A。进程B把数据读入内存后,该如何才能把数据传给A了?

据我所知道的方式有内存映射文件和WM_COPYDATA消息这两种办法。我对内存映射文件的理解是,一个文件,映射进进程的地址空间中。然后进程就可以用使用内存一样使用内存映射文件。
但是我的疑问是:在使用内存映射文件的时候,是把文件映射到进程的地址空间中,那说明文件实际上还是在硬盘上,而并没有读入内存?如果使用这种手段实现大量数据的进程间通信,那不是效率很低吗?
如果使用WM_COPYDATA消息机制,到是可以让进程B把数据读入一块内存区域,然后把这块区域的指针传递给进程A。但是我也有疑问:如果数据量很大,超过了可用的物理内存,那进程B该怎么办了?把数据读到虚拟内存中?如果数据量大到甚至超过了物理内存和虚拟内存之和又该怎么办了?
...全文
537 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
littlegang 2007-03-14
  • 打赏
  • 举报
回复
如果数据量很大,超过了可用的物理内存,那进程B该怎么办了?
操作系统负责利用虚拟内存

如果数据量大到甚至超过了物理内存和虚拟内存之和又该怎么办了?
试问,您认为进程B能写文件成功吗?
bladeIII 2007-03-14
  • 打赏
  • 举报
回复
LS的,具体问题要具体分析: 跨网络进程间通信能直接用内存映射?JAVA程序与C程序通信能简单的用内存映射?还有跨平台...
至于是否使用虚拟内存还是实际内存,要看实际的硬件软件情况了,比如windows支持关闭虚拟内存,在内存大的系统上,比如几个G,关掉虚拟内存全部使用物理内存,是可以这么作的。
jackadandyyang 2007-03-14
  • 打赏
  • 举报
回复
内存影射是效率最高的,现在数据通信都采用这种方式,我认为是建立了虚拟内存,并不是实际的物理内存。
bladeIII 2007-03-14
  • 打赏
  • 举报
回复
win32进程间通信的方式有很多种,并不仅限于内存映射文件和WM_COPYDATA消息方式。
比如命名管道(pipe),共享内存等,甚至你还可以使用socket。
内存映射文件是非常高效的通信方式,当然,它的确相对来说要底层一些。
WM_COPYDATA依赖windows窗口以及windows消息队列,受消息队列消息处理上的一些
优先级别控制,对于服务进程不是很合适。
内存大小限制时,当然是考虑分块连续通信,大多我们接触到的数据通信都是如此。
WingForce 2007-03-13
  • 打赏
  • 举报
回复
数据量大到甚至超过了物理内存和虚拟内存之和

超过了物理内存,从硬件上解决

A->B大量数据传输时,
我的经验,buffer,考虑用队列解决,
大量数据分成小块(1帧1帧的)
A一个一个发,B收到一个,处理一个,回收能回收内存,接着下一个,
如此往复~~

祝LZ好运
===========================================================================

win32平台可以使用AWE
rayshen 2007-03-13
  • 打赏
  • 举报
回复
我好像看过篇文章说,内存映射文件方式是最基本的进程间通讯方式,其余的进程通讯方式都是使用内存映射文件的方式实现的。这样的话,内存映射文件方式是效率最高的。
Wolf0403 2007-03-13
  • 打赏
  • 举报
回复
mmap 表示将文件映射入地址空间,可以理解为文件被内存缓冲,而这个缓冲是被两个进程同时访问的,所以效率是最高的。
genieyyt 2007-03-13
  • 打赏
  • 举报
回复
数据量大到甚至超过了物理内存和虚拟内存之和

超过了物理内存,从硬件上解决

A->B大量数据传输时,
我的经验,buffer,考虑用队列解决,
大量数据分成小块(1帧1帧的)
A一个一个发,B收到一个,处理一个,回收能回收内存,接着下一个,
如此往复~~

祝LZ好运
zhoupu2004 2007-03-12
  • 打赏
  • 举报
回复
2楼的兄弟,如果使用内存映射文件,进程B需要创建文件,将数据写入文件。而后进程A将文件映射进自己的地址空间,再读文件,就是读写硬盘各一次了。
如果使用WM_COPYDATA消息机制,则进程B读取数据,分配内存,写入内存,把内存区域指针传递给进程A,而进程A这时可以直接使用这个指针了。这就说明不需要读写硬盘了!
foochow 2007-03-12
  • 打赏
  • 举报
回复
内存映射文件效率最高的吧?
Jokar 2007-03-12
  • 打赏
  • 举报
回复
数据量那么大,单个进程处理时也得 每次从磁盘缓冲一小段数据到内存,使用后释放,再缓冲下一段数据的方法吧~, 那么两个进程就也得这样了.

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧