内存映射和共享内存
引言
内存映射实现共享内存。通过内存映射实现共享内存的方式又有好多种。
普通文件:现在文件系统打开一个存在的文件或者创建一个不存在的文件。
设备文件("/dev/zero")
匿名内存映射:mmap的参数只要稍作修改就好,MAP_SHARED修改为MAP_SHARED|MAP_ANON,fd参数设为-1就好了。
访问内存映射对象
内核允许文件大小和内存映射大小不一致。但是不一致的地方,有些是没有问题,有些会发出一些信号的。
Posix共享内存区
Posix提供了两种在无亲缘关系的进程之间通信。内存映射文件(有亲缘无亲缘关系均可)和共享内存区对象(使用Posix提供的一系列API)。
1、内存映射文件
(1)用于父子进程之间通信共享内存区
(2)用于无亲缘关系的进程之间通信共享内存区
2、共享内存区对象
需要使用Posix提供的API,有两个步骤要求:
a、指定一个名字参数调用shm_open,已创建一个新的共享内存共享区对象或者打开一个已经存在的内存共享区对象。
b、调用mmap函数把这个共享内存区映射到调用进程的地址空间。
总结
共享内存区中最好还是不要有指针。因为同一个共享内存对象可能会映射到各个调用进程的不同物理地址,因为指针是指向的实际地址。