关于内存共享的问题

mynamelj 2011-12-29 09:26:02
我创建了两个进程,想使用内存享进行通信,使用了mmap映射了一块内存区域

问题是,A进程向共享内存区域写入一段数据后怎样通知B进程去读取呢?

请高手指点!!
...全文
182 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
shaoxiaojing5193 2012-02-10
  • 打赏
  • 举报
回复


这个问题很简单阿,可以用很笨的方法就是 A进程共享了东西之后向B进程发送消息通知阿,可以用管道来发送消息通知,或者是设置 一个全局变量作为标志,标志改变了就是共享东西了,发现标志变了就赶紧去取东西,还有就是可以让B进程注册一个信号处理函数,然后A进程共享了东西之后就向B进程发送信号呗 各种简单又容易的方法啦,不过我不推荐哦,还是上面的前辈们的方法比较系统比较好。。。~~
开发者说 2012-02-10
  • 打赏
  • 举报
回复
把mmap的文件句柄定义成/dev/shm,不就可以了
sniperhuangwei 2012-02-10
  • 打赏
  • 举报
回复
轮询是可以考虑的方法,每100ms取一次数据不会占用你太多CPU时间。
相对于发送一条消息,通知对方取一次的方法,效率不见得比每100ms从
队列中将消息取光效率高。
qq120848369 2012-02-10
  • 打赏
  • 举报
回复
程序是人编出来的,楼主想要一种完全异步的windows消息机制,可惜木有。

想取数据的进程可以调用函数去检测,有就拿走,没有可以等待,也可以返回失败,用条件变量就可以做。

如果想随时检测是否有数据,那就用上边的方法阻塞等待就可以了,怕阻塞程序运行可以做到其他线程里,再怎么做是看程序需求的。
jialejiahi 2012-01-06
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 mynamelj 的回复:]

直接用sys V的共享内存shmget这些恐怕要比mmap简便一点吧。
至于你说的怎么通知的问题:
写的进程写进去的内容里面加上一个报文头。
读取的进程轮询方式读取共享内存空间。
如果读取到报文头,则生产者已经写入内容。
如果读到不到报文头,则生产者未写入内容。
注意使用共享内存的时候,要用信号量进行保护

-----------------------------
不停的去轮……
[/Quote]
轮询确实不太好哈,消息队列可以,用信号通知效率可能更高一点。
如果要共享的内容少得话,直接用消息队列传了也可以吧。
也可以
mynamelj 2012-01-05
  • 打赏
  • 举报
回复
直接用sys V的共享内存shmget这些恐怕要比mmap简便一点吧。
至于你说的怎么通知的问题:
写的进程写进去的内容里面加上一个报文头。
读取的进程轮询方式读取共享内存空间。
如果读取到报文头,则生产者已经写入内容。
如果读到不到报文头,则生产者未写入内容。
注意使用共享内存的时候,要用信号量进行保护

-----------------------------
不停的去轮询太占CPU时间了,这样应该不是个好办法

用消息队列去等,如果有消息过来再去内存区域去读,不知道这个方法是否能达到高效!
mynamelj 2012-01-05
  • 打赏
  • 举报
回复
大家先打开共享内存区才行.

创建文件的进程完成共享内存的初始化操作, 其他进程仅打开即可,如何保证创建+初始化的原子性,可以在创建成功之后,初始化完成之前设置S_IXUSR,初始化完成后fchmod取消掉, 其他打开进程stat检查S_IXUSR进行等待。

------------------
不好意思,不是很明白,linux下我是新手!

我目前是想知道,在B进程是不是需要创建一个线程去不停的去读内存区域是不是有数据,如果有就取出来!
或者是使用消息队列去等待A进程发消息过来通知,内存区域我放了数据,你快点去取吧。
不知道是不是这种思路,最主要的是能达到高效
mynamelj 2012-01-05
  • 打赏
  • 举报
回复
我是想写个服务器,进程A进使用epoll接受大量的网络连接,B进程则是数据逻辑处理,两个进程之间使用内存共享传递数据。查了许多linux相关资料,说是在linux环境下使用多进程比多线程要好,所以想使用内存共享来进行高速通信。我希望内存共享担起队列缓存功能,这样不必等B进程处理完了上一条再处理下一条。

希望大家各抒己见,把自的经验分享一样,谢谢!
qq120848369 2012-01-02
  • 打赏
  • 举报
回复
O_CREAT|O_EXCL,S_IXUSR创建成功,完成共享内存的初始化,之后fchmod取消S_IXUSR。
O_CREAT|O_EXCL,S_IXUSR创建失败,则stat并检查st_mode是否包含S_IXUSR,不包含则可以打开文件,内存映射了,否则轮询等待。
gohome520 2012-01-02
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 qq120848369 的回复:]

其实问题的关键就是如何保证创建共享内存与内存初始化的原子化, 可以利用mode位巧妙的同步.
[/Quote]

为什么关键是创建共享内存与内存初始化的原子化呢? 请指教。
jialejiahi 2011-12-31
  • 打赏
  • 举报
回复
直接用sys V的共享内存shmget这些恐怕要比mmap简便一点吧。
至于你说的怎么通知的问题:
写的进程写进去的内容里面加上一个报文头。
读取的进程轮询方式读取共享内存空间。
如果读取到报文头,则生产者已经写入内容。
如果读到不到报文头,则生产者未写入内容。
注意使用共享内存的时候,要用信号量进行保护。
elated 2011-12-31
  • 打赏
  • 举报
回复
可以用个信号量或互斥锁来做同步
B进程要读共享内存时获得信号量,如果A此时没有写完,那么便阻塞进程
A写好了释放信号量,这时B进程就可以来读了
如果需要这种要同步的语义,还不如用消息队列方便点
dongjiawei316 2011-12-31
  • 打赏
  • 举报
回复
使用shmget函数吧!
qq120848369 2011-12-31
  • 打赏
  • 举报
回复
其实问题的关键就是如何保证创建共享内存与内存初始化的原子化, 可以利用mode位巧妙的同步.
wesleyluo 2011-12-30
  • 打赏
  • 举报
回复
A写好了就给B进程发个消息,我写好了你来取啊。
qq120848369 2011-12-29
  • 打赏
  • 举报
回复
大家先打开共享内存区才行.

创建文件的进程完成共享内存的初始化操作, 其他进程仅打开即可,如何保证创建+初始化的原子性,可以在创建成功之后,初始化完成之前设置S_IXUSR,初始化完成后fchmod取消掉, 其他打开进程stat检查S_IXUSR进行等待。

23,120

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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