shmget物理内存_共享内存 mmap shmget 区别

本文对比了mmap和shmget实现共享内存的差异。二者本质类似,但在安全性、一致性、持续性、易用性和通用性等方面有所不同。mmap对应真实文件,shmget对应交换分区的shm文件系统。若担心误删文件用shmget,否则mmap更简单。存储量小用shm,大则用mmap。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

请参考apache对于共享内存的scoreboard的初始化,ap_init_scoreboard()

得有一个内存变量ap_scoreboard_image来索引对应的共享内存

By firework2@foxmail.com

类Unix系统的共享内存有好几种机制,网上一搜就一大堆了,下面是几个我认为介绍的还不错的 : )

初学的同学多半都会想横向对比一下,到底用mmap实现共享内存好呢,还是用shmget好啊?

下面是我个人的一些理解:

1. 二者本质上是类似的,mmap可以看到文件的实体,而 shmget 对应的文件在交换分区上的 shm 文件系统内,无法直接 cat 查看

2. 安全性:mmap 方式对应的真实文件,如果用户有权限即可查看,甚至删除

shmget 方式其实也一样,好了一层皮罢了(ipcrm -m ...)

3. 一致性:mmap 方式下各进程映射文件的相同部分可以共享内存

shmget 时各个进程共享同一片内存区

不建议使用交叠的方式使用 mmap

4. 持续性:进程挂了重启不丢失内容,二者都可以做到

机器挂了重启,mmap 可以不丢失内容(文件内保存了OS同步过的映像),而 shmget 会丢失

5. 易用性:mmap 的接口会简单一些

6. 通用性:posix 的 mmap 会相对广泛一些

7. 其他:mmap在某些内核版本下会频繁读写磁盘,需要注意一下

如果你担心会因误删文件导致 mmap 出错,那就用 shmget 吧,否则的话直接mmap就可以了,用起来简单一些 : )

更多的细节,需要大量的实践 + 阅读内核实现来确认,暂时没考虑

另外要注意在有必要的时候捕获信号,还有就是要注意检查这些系统函数的返回值

============================================================================

http://blog.chinaunix.net/uid-26335251-id-3493125.html

1. 共享内存允许两个或多个进程共享一给定的存储区,因为数据不需要来回复制,所以是最快的一种进程间通信机制。共享内存可以通过mmap()映射普通文件(特殊情况下还可以采用匿名映射)机制实现,也可以通过系统V(shm)共享内存机制实现。应用接口和原理很简单,内部机制复杂。为了实现更安全通信,往往还与信号灯等同步机制共同使用。

结论:

1、mmap保存到实际硬盘,实际存储并没有反映到主存上。优点:储存量可以很大(多于主存)(这里一个问题,需要高手解答,会不会太多拷贝到主存里面???);缺点:进程间读取和写入速度要比主存的要慢。

2、shm保存到物理存储器(主存),实际的储存量直接反映到主存上。优点,进程间访问速度(读写)比磁盘要快;缺点,储存量不能非常大(多于主存)

使用上看:如果分配的存储量不大,那么使用shm;如果存储量大,那么使用mmap。

mmap系统调用并不是完全为了用于共享内存而设计的。它本身提供了不同于一般对普通文件的访问方式,进程可以像读写内存一样对普通文件的操作。而Posix或系统V的共享内存IPC则纯粹用于共享目的,当然mmap()实现共享内存也是其主要应用之一。

2)使用特殊文件提供匿名内存映射:适用于具有亲缘关系的进程之间;由于父子进程特殊的亲缘关系,在父进程中先调用mmap(),然后调用fork()。那么在调用fork()之后,子进程继承父进程匿名映射后的地址空间,同样也继承mmap()返回的地址,这样,父子进程就可以通过映射区域进行通信了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值