MyException - 我的异常网
当前位置:我的异常网» VC/MFC » 请问内存共享相关的有关问题

请问内存共享相关的有关问题

www.MyException.Cn  网友分享于:2014-08-05  浏览:0次
请教内存共享相关的问题
需要在进程中传输大量数据,现在准备用内存共享,第一次用有几点问题请教:

1.结构化的数据,如何写入共享内存时,读出时才能保持结构?

2,两个进程之间如何协调,在多线程中用过SetEvent,在多线程中可以用吗?否则如何协调?

3.如果A进程写了20000个结构数组到共享区,如何让B进程知道数组的大小?需要另外开辟管道通信?还是有其它方法?

谢谢!
------解决方案--------------------
我也工作几年了,试着回答一下吧。
如果是我解决这类问题,感觉两个进程还是应该需要有协议通信的,我一般习惯使用socket,但我确实也是认为使用pipe也是不错的选择,当然是指你的两个进程在同一台PC下执行为前提。
1、想让两边读写保持一样的结构那只能是,两个进程使用答成一致的结构体。当然我看你话的意思感觉这个结构体是可变的,那样的话就只能让两边通信,例:一边存储后,给通知另一边这个结构体是什么样的,另一边知道结构体类型后再去读取。当然这两个进程使用的结构体声明文件应该是一样的。
2、你好像是说错了吧,你是要问在“多进程中是否可以使用SetEvent”吧?多个进程之间使用SetEvent没问题,包括mutex、semaphore等系统资源都是可以在多进程中使用的。
3、第三个问题,也是需要进程通信的,基本上和第一个问题解决办法是一样的。另外还有一个办法,就是在把结构数据定义成指针,在外在包一层,下面给出伪码如:(意思一下,不一定恰当)
struct stData
{
...
}
struct stAllData
{
    int iSize;
    stData pstData*;
}
这样的话,另一边可以选从结构体数组中取出size。再进行读取。

我也有一问,不知道为什么不用pipe或socket直接把数据传送过过?而非要使用共享内存,我认为共享内存的缺点在于,还要处理多个进程对使用内存的互斥,这点是很麻烦的。
如果是我的话,非要使用共享内存,那只有一个理由,就是一个进程不停地更新数据,而另一个进程不一定非要得到所有数据,只是需要最新的数据,中间过程的数据另一个进程根本不关心。那样的话为了节省传输效率,我可能会选择共享内存。否则,如果另一边需要所有数据,我是一定会用协议+pipe或socket的办法传输过去的。
------解决方案--------------------
1、用内存映射后能得到可操作的内存的指针地址,赋值的话可以用memcpy类似的方式赋值,读的时候也用memcpy就行了
2、在多进程中用SetEvent也是可以的,用命名事件
3、你应该使用开头的一到四个字节空间来保存结构体的数目

其实你可以用socket方法进行进程间通信的
------解决方案--------------------
1. 内存的数据直接用内存拷贝,memcpy等,然后读取的时候你可以用读取出来,再转换成对应的数据结构
2. 可以用Mutex加Event来进行数据同步和通知
3. 自己定义结构中增加一个字段来表示大小
------解决方案--------------------
结构化的数据写入共享内存时注意对齐,写入时用SizeOf获取实际字节数,读时按实际字节读取再强制转换为结构指针。
共享内存创建时就有一个Mutex可以使用。
两个进程要通知对方已经对共享内存进行了存取以及大小位置等可以互发消息,socket就是一个不错的选择。
------解决方案--------------------
引用:
我也工作几年了,试着回答一下吧。
如果是我解决这类问题,感觉两个进程还是应该需要有协议通信的,我一般习惯使用socket,但我确实也是认为使用pipe也是不错的选择,当然是指你的两个进程在同一台PC下执行为前提。
1、想让两边读写保持一样的结构那只能是,两个进程使用答成一致的结构体。当然我看你话的意思感觉这个结构体是可变的,那样的话就只能让两边通信,例:一边存储后,给通知另一边这个结构体是什么样的,另一边知道结构体类型后再去读取。当然这两个进程使用的结构体声明文件应该是一样的。
2、你好像是说错了吧,你是要问在“多进程中是否可以使用SetEvent”吧?多个进程之间使用SetEvent没问题,包括mutex、semaphore等系统资源都是可以在多进程中使用的。
3、第三个问题,也是需要进程通信的,基本上和第一个问题解决办法是一样的。另外还有一个办法,就是在把结构数据定义成指针,在外在包一层,下面给出伪码如:(意思一下,不一定恰当)
struct stData
{
...
}
struct stAllData
{
    int iSize;
    stData pstData*;
}
这样的话,另一边可以选从结构体数组中取出size。再进行读取。

我也有一问,不知道为什么不用pipe或socket直接把数据传送过过?而非要使用共享内存,我认为共享内存的缺点在于,还要处理多个进程对使用内存的互斥,这点是很麻烦的。
如果是我的话,非要使用共享内存,那只有一个理由,就是一个进程不停地更新数据,而另一个进程不一定非要得到所有数据,只是需要最新的数据,中间过程的数据另一个进程根本不关心。那样的话为了节省传输效率,我可能会选择共享内存。否则,如果另一边需要所有数据,我是一定会用协议+pipe或socket的办法传输过去的。

我使用共享内存的理由是海量数据,比方上G的数据可以直接映射到内存中,或者更大的数据集分部分映射。这些通讯的办法是无法完成的。还有就是即时是少量的数据,使用内存共享还是要比通讯方便吧,呵呵,个人习惯吧。
------解决方案--------------------
A程序      文件缓存                                                B程序
                A给B的命令或返回给B的(文件)
                B给A的命令或返回给B的(文件)



最简单安全的方法解决,减少程序BUG可能性
------解决方案--------------------
引用:
A程序      文件缓存                                                B程序
                A给B的命令或返回给B的(文件)
                B给A的命令或返回给B的(文件)



最简单安全的方法解决,减少程序BUG可能性

你说的这个不错,早期好多应用使用“外存”交换数据。但是也存在即时通知的问题。
------解决方案--------------------
1、用文件映射对象就行了,保存好返回的句柄,然后把句柄传递给需要共享数据的程序;
2、多线程环境下,用 Mutex / Semaphore + Event 就可以搞定;
3、可以用进程间通信机制通知需要共享数据的进程。

文章评论

程序员的鄙视链
程序员的鄙视链
鲜为人知的编程真相
鲜为人知的编程真相
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
为什么程序员都是夜猫子
为什么程序员都是夜猫子
老程序员的下场
老程序员的下场
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
代码女神横空出世
代码女神横空出世
一个程序员的时间管理
一个程序员的时间管理
那些性感的让人尖叫的程序员
那些性感的让人尖叫的程序员
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
旅行,写作,编程
旅行,写作,编程
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
 程序员的样子
程序员的样子
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
Google伦敦新总部 犹如星级庄园
Google伦敦新总部 犹如星级庄园
我是如何打败拖延症的
我是如何打败拖延症的
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
2013年美国开发者薪资调查报告
2013年美国开发者薪资调查报告
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
中美印日四国程序员比较
中美印日四国程序员比较
2013年中国软件开发者薪资调查报告
2013年中国软件开发者薪资调查报告
那些争议最大的编程观点
那些争议最大的编程观点
总结2014中国互联网十大段子
总结2014中国互联网十大段子
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
编程语言是女人
编程语言是女人
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
我的丈夫是个程序员
我的丈夫是个程序员
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
程序员必看的十大电影
程序员必看的十大电影
如何成为一名黑客
如何成为一名黑客
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
程序员都该阅读的书
程序员都该阅读的书
漫画:程序员的工作
漫画:程序员的工作
10个调试和排错的小建议
10个调试和排错的小建议
程序员和编码员之间的区别
程序员和编码员之间的区别
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有