http://blog.csdn.net/liangkaiming/article/details/6240005
顾名思义,共享内存让一段内存可供多个进程访问。用特殊的系统调用(即对 UNIX 内核的请求)分配和释放内存并设置权限;通过一般的读写操作读写内存段中的数据。
共享内存并不是从某一进程拥有的内存中划分出来的;进程的内存总是私有的。共享内存是从系统的空闲内存池中分配的,希望访问它的每个进程连接它。这个连接过程称为映射,它给共享内存段分配每个进程的地址空间中的本地地址。
read()
和 write()
的作用与一般情况下一样。 这些图中所示的许多工作可以通过 UNIX 共享内存 API 执行。实际上,有两套共享内存 API:POSIX API 和比较老(但是仍然有效)的 System V API。因为 POSIX 是 UNIX 和 Linux® 及其衍生系统上的公认标准,所以我们使用此版本。另外,POSIX API 使用简单的文件描述符执行读写,大家应该更熟悉。
POSIX 为创建、映射、同步和取消共享内存段提供五个入口点:
shm_open()
:创建共享内存段或连接到现有的已命名内存段。这个系统调用返回一个文件描述符。shm_unlink()
:根据(shm_open()
返回的)文件描述符,删除共享内存段。实际上,这个内存段直到访问它的所有进程都退出时才会删除,这与在 UNIX 中删除文件很相似。但是,调用 shm_unlink()
(通常由原来创建共享内存段的进程调用)之后,其他进程就无法访问这个内存段了。mmap()
:把共享内存段映射到进程的内存。这个系统调用需要 shm_open()
返回的文件描述符,它返回指向内存的指针。(在某些情况下,还可以把一般文件或另一个设备的文件描述符映射到内存。对这些操作的讨论超出了本文的范围;具体方法请查阅操作系统的 mmap()
文档。)munmap()
:作用与 mmap()
相反。msync()
:用来让共享内存段与文件系统同步 — 当把文件映射到内存时,这种技术有用。使用共享内存的过程是,用 shm_open()
创建内存段,用 write()
或 ftruncate()
设置它的大小,用 mmap()
把它映射到进程内存,执行其他参与者需要的操作。当使用完时,原来的进程调用 munmap()
和 shm_unlink()
,然后退出。
原文:http://www.cnblogs.com/feixiang927/p/5065906.html