本博文为原创,遵循CC3.0协议,转载请注明出处:http://blog.csdn.net/lux_veritas/article/details/11934083
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1.什么是共享内存的编程模型?
2.共享内存有哪几种实现方式?
2.1 mmap的实现方式
2.2 System V API
2.3 POSIX API
3. 深入分析
4. 总结
5. References
1. 什么是共享内存?
硬件的视角来看共享内存:在一个多处理机系统中,一条RAM可以被多个不同的CPU处理器(核)访问到,这即是一个共享内存的硬件系统。
软件的角度来看共享内存,它是进程间通信(IPC)的一种方式,通过某种手段共享某一段物理内存(页)的多个进程,通过对共享的这部分物理内存页进行读写,完成彼此之间的通信。【1】
大多数软件工程师所说的共享内存,指的是IPC的这种通信方式,而与其他IPC机制相比,共享内存省略了一些数据的拷贝过程,因而成为最快的一种IPC通信方式。本文主要讨论的也是共享内存的IPC机制。
2. 共享内存有哪几种实现方式?
共享内存的机制允许两个或多个进程通过把公共的数据结构放入一个共享的内存区域来访问它们。UNIX有两套事实上的共享内存API,一种是标准的POSIX API,一种是比较老的System V API。【2】
两种API的工作方式与执行流程大体相同,都是间接使用mmap的方式,完成内存文件映射的过程。
此处以System V API为例,结合内核源码,简述其实现共享内存通信的过程。举个简单的范例,两个进程,一个写进程,用于向共享内存段写数据,一个读进程,用于从共享内存段读数据。
write进程:
#include <stdio.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <string.h>
int main()
{
int shm_id;