linux最快的IPC--共享内存

  • mmap、munmap、msync
mmap是把一个文件或一个内存区对象映射到调用进程的地址空间,使用该函数的目的有三个:
(1)使用普通文件以提供内存映射I/O
(2)使用特殊文件以提供匿名内存映射
(3)使用shm_open以提供无亲缘关系进程间的Posix共享内存区

#include<sys/mman.h>
void *mmap(void *addr,size_t len,int prot,int flags,int fd,off_t offset);

flags:MAP_SHARED或MAP_PRIVATE。
MAP_PRIVATE:那么调用进程对被映射数据的修改只对该进程可见,而不改变底层支撑对象(或是一个文件对象、或是一个共享内存区对象)。
MAP_SHARED:那么调用进程对被映射数据的修改对于共享该对象的所有进程都可见,而且确实改变了其底层支撑对象。

父子进程之间共享内存去的方法之一是,父进程在调用fork之前先指定MAP_SHARED标志调用mmap。这样父进程的映射关系就存留到子进程当中。而且父进程所作的修改子进程能看到。

举例:父子进程通过共享内存区,給内存映射文件当中的计数器持续加1


注意:上面的信号量是有名信号量,而有名信号量是在内核当中维护的。

再用匿名信号量实现上述过程:





  • 前面主要讨论共享内存以及mmap,并给mmap实现父子进程共享内存的例子。现在主要把共享内存区的概念扩展到无亲缘关系进程间共享的内存区
    Posix.1提供俩种在无亲缘关系进程间的共享内存区的方法
    (1)内存映射文件:即上面讲到的使用mmap映射文件的方法。上面主要使用这种方法实现父子进程之间的共享内存区,它也可以用于无亲缘关系的进程之间。
    (2)共享内存区对象:由shm_open打开一个Posix.1 IPC名字,所返回的描述符由mmap函数映射到当前进程的地址空间。

    注:无亲缘关系的进程同步使用信号量的话要使用有名信号量。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值