社区
Linux/Unix社区
帖子详情
关于内存共享的问题
mynamelj
2011-12-29 09:26:02
我创建了两个进程,想使用内存享进行通信,使用了mmap映射了一块内存区域
问题是,A进程向共享内存区域写入一段数据后怎样通知B进程去读取呢?
请高手指点!!
...全文
182
16
打赏
收藏
关于内存共享的问题
我创建了两个进程,想使用内存享进行通信,使用了mmap映射了一块内存区域 问题是,A进程向共享内存区域写入一段数据后怎样通知B进程去读取呢? 请高手指点!!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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进行等待。
Android专用驱动
Ashmem是一个
共享
内存
驱动,它与传统的
共享
内存
相比,最大的特点是它是通过文件描述符来描述的,并且可以动态地进行分块管理。动态分块管理的目的是可以将部分不再使用了的
内存
交回给系统,非常适合
内存
较小的移动...
关于
内存
泄漏
问题
(
共享
内存
、请求调页、缺页异常处理)
最近发现了一个
问题
,当不同的进程申请了同一块
共享
内存
时,会有
内存
泄漏现象,即当程序运行时,有些进程的
内存
会逐渐 增加,波动幅度较为明显。 2.
问题
排查 通过调试排查,我们发现是
共享
内存
引起的。我们用两...
python
共享
内存
SharedMemory
该模块提供了一个SharedMemory类,用于分配和管理多核或对称多处理器(SMP)机器上进程间的
共享
内存
。为了协助管理不同进程间的
共享
内存
生命周期,multiprocessing.managers模块也提供了一个BaseManager的子类:...
Linux进程间通信——使用
共享
内存
下面将讲解进程间通信的另一种方式,使用
共享
内存
。 一、什么是
共享
内存
顾名思义,
共享
内存
就是允许两个不相关的进程访问同一个逻辑
内存
。
共享
内存
是在两个正在运行的进程之间
共享
和传递数据的一种非常有效的方式...
进程间通信——
共享
内存
(Shared Memory)
共享
内存
,顾名思义就是允许两个不相关的进程访问同一个逻辑
内存
,
共享
内存
是两个正在运行的进程之间
共享
和传递数据的一种非常有效的方式。不同进程之间
共享
的
内存
通常为同一段物理
内存
。进程可以将同一段物理
内存
...
Linux/Unix社区
23,120
社区成员
74,507
社区内容
发帖
与我相关
我的任务
Linux/Unix社区
Linux/Unix社区 应用程序开发区
复制链接
扫一扫
分享
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章