社区
Linux/Unix社区
帖子详情
linux下用mmap实现共享内存的时候open和shm_open有什么区别
wind19
2013-09-23 07:37:03
open一个文件 和 shm_open一个文件,然后用mmap把它映射入内存,两者之间有什么区别。 我只知道shm_open打开的文件在 /dev/shm下面,其他没看出来,性能上有区别吗?
另外,我看到说 只有调用munmap 或 msync的时候才会把数据写入到磁盘,但我没有调用这两个函数之前让程序sleep,然后用cat打开文件也能看到数据,就是说数据已经写入磁盘了。 那么这样性能不是很差吗。
...全文
2463
7
打赏
收藏
linux下用mmap实现共享内存的时候open和shm_open有什么区别
open一个文件 和 shm_open一个文件,然后用mmap把它映射入内存,两者之间有什么区别。 我只知道shm_open打开的文件在 /dev/shm下面,其他没看出来,性能上有区别吗? 另外,我看到说 只有调用munmap 或 msync的时候才会把数据写入到磁盘,但我没有调用这两个函数之前让程序sleep,然后用cat打开文件也能看到数据,就是说数据已经写入磁盘了。 那么这样性能不是很差吗。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
7 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
YouCompleteMe
2014-10-11
打赏
举报
回复
/dev/shm 目录下的tmpfs文件系统是基于内存的文件系统
sjjwan
2014-05-04
打赏
举报
回复
2
对于mmap函数而言,shm_open与open函数打开一个文件没有什么区别,只是shm_open函数是在/dev/shm目录上生成一个文件,而且会校验该目录下是不是挂载了tmpfs文件系统,如果不是也不能正常打开的。所以一般还是用shm_open函数更规范一些,因为这个文件存在tmpfs文件系统下,在不用的情况系统会自动删除掉。
wind19
2013-09-26
打赏
举报
回复
版主啊,鸡冻一下先。 但是我没有设置share,在程序退出之后,还是可以用用cat看到文件内容。 还有,用shm_open 和 open打开一个文件,对于共享内存有区别吗?
qiyu1988
2013-09-24
打赏
举报
回复
shm_open内存共享主要功能还是作为一种便捷的ipc通信机制
qq120848369
2013-09-24
打赏
举报
回复
不设置share就不会写盘。
wind19
2013-09-24
打赏
举报
回复
open打开的不是也可以进行内存共享吗? 因为 mmap也会把它映射进内存。 另外,有没有什么办法让mmap不写磁盘,即便程序退出也不写。
Carl_CCC
2013-09-23
打赏
举报
回复
shm_open主要打开一个共享内存用户进程间交换大量数据 mmap可以用于交换数据,也可以映射文件,很方便的。 linux操作系统写文件没你想象那么简单,有缓存机制的,你cat文件的内容不一定是来自硬盘。 而mmap除了msync,munmap也会在适当时机写入硬盘。
linux
下通过
共享内存
和
mmap
实现
进程间通讯
最近在学习GNU/
Linux
内核,看到
mmap
的时候书上说:这句话说的很正确,虽然我们日常没有直接使用
mmap
,但是其实我们都间接地使用了
mmap
/mumap函数。举个例子,我们使用动态链接库的时候,我们都知道,动态链接不会把动态库中的代码整合到目标文件中,相反,动态库跟目标文件独立。那为什么运行时,程序能够获得指定的符号链接?这正是
mmap
的力量,程序运行时,他将保存在物理内存的动态库的内容(如果物理内存中没有,则先加载如内存)映射到自身的进程地址空间,这样符号所对应的指令数据便存在了。
mmap
将一个文件
C++面试题16_
共享内存
(
shm
)和
mmap
的
区别
?
很多人会把“
共享内存
(
shm
)”和 “
mmap
” 混在一起,因为它们底层都和有关,而且性能都非常高,
共享内存
:以“内存”为中心,
mmap
:以“文件”为中心。一、
共享内存
(
shm
)
shm
get()
shm
at()或者:
shm
_
open
()
mmap
()
Linux
进程间通信之
共享内存
(POSIX)
实现
篇
基于 2.6.12 内核, 说明 POSIX
共享内存
的核心数据结构、系统调用路径及关键
实现
. POSIX
共享内存
通过
shm
em(tmpfs) 文件系统
实现
, 主要文件:mm/
shm
em.cipc/
shm
.c(部分)、fs/namei.c(路径解析).
共享内存
的特殊文件系统
这个特殊的文件系统是基于Ram的。
shm
get会在这个特殊的文件系统上创建一个文件,
shm
at会调用
mmap
把这个文件映射到进程的地址空间中。 内核怎样保证各个进程寻址到同一个
共享内存
区域的内存页面 1、page cache及swap cache中页面的区分:一个被访问文件的物理页面都驻留在page cache或swap cache中,一个页面的所有信息由struct
Linux
共享内存
共享内存
是进程间通信的高效方式,允许不相关进程访问同一物理内存。
Linux
提供两种
实现
方式:System V和POSIX API。System V使用
shm
get创建、
shm
at连接、
shm
dt分离、
shm
ctl控制
共享内存
,需注意IPC_RMID仅标记删除而非立即释放。POSIX API通过
shm
_
open
创建、
mmap
映射、
shm
_unlink删除,更符合现代标准。两种方式都需要配合同步机制确保数据安全。示例代码展示了读写进程如何通过
共享内存
传递数据,System V使用键值标识,POSIX使用命名对象
Linux/Unix社区
23,224
社区成员
74,536
社区内容
发帖
与我相关
我的任务
Linux/Unix社区
Linux/Unix社区 应用程序开发区
复制链接
扫一扫
分享
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章