Shared Memory

来源:互联网 发布:网络作家工作室 编辑:程序博客网 时间:2024/05/16 19:35


mmap -> /dev/shm

shmget => ipcs   / ipcrm


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

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

 

By firework2@foxmail.com

 http://www.linuxgraphics.cn/gui/ipc_shrmem.html

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

 

http://www.ibm.com/developerworks/cn/linux/l-ipc/part5/index1.html

http://www.ibm.com/developerworks/cn/linux/l-ipc/part5/index2.html

 

http://blog.csdn.net/nellson/archive/2010/03/20/5398436.aspx  (里面的时间性能测量不全面)

 

 

初学的同学多半都会想横向对比一下,到底用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://www.ibm.com/developerworks/cn/aix/library/au-cn-sharemem/index.html

 

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

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()返回的地址,这样,父子进程就可以通过映射区域进行通信了。


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 拘留20天还没有判刑怎么办 被打了没有证据怎么办 拘留37天后没有放人怎么办 强制执行执行的财产不够怎么办 收到公安局拘留通知家属应该怎么办 对方不出谅解书怎么办 寻衅滋事没抓的 怎么办 公务员政审父母拘留过怎么办 我参与了网赌怎么办 亲人出车祸去世家属怎么办 车牌换了原保险怎么办 北京车牌夫妻变更车险怎么办 赌博拘留15天不交罚款怎么办 给人打了不赔钱怎么办 打了人对方讹钱怎么办 换车了原来的etc怎么办 换异地车牌了etc怎么办 被执行人拘留15天后不还钱怎么办 被执行人拘留后还是不还钱怎么办 摩托车套牌被交警扣了怎么办 套牌摩托车遇到交警怎么办 不知情收到小偷东西了怎么办 盗窃罪法院判定农民赔钱没钱怎么办 公安局通知家属取刑拘通知书怎么办 老公诈骗坐牢家人该怎么办 家人被拘留我该怎么办 车牌被偷了一个怎么办 车牌给人家偷了怎么办 收购了偷来的铝怎么办 员工自动离职后档案怎么办 辞职了老板不发工资怎么办 上班老板不发工资怎么办 逮捕后延长羁押期限怎么办手续 员工提出辞职公司不同意怎么办 员工提出辞职后即不来上班怎么办 打架把对方打成轻伤害怎么办 被刑拘了家人该怎么办 看守所在押人员检查出乙肝怎么办 孩子不写作业老师该怎么办 孩子老师向我表白该怎么办 幼儿园老师打孩子家长该怎么办