共享内存区域是被多个进程共享的一部分物理内存。多个进程都可以把该共享内存映射到自己的虚拟内存空间。所有用户空间的进程若要操作共享内存,都要将其映射到自己的虚拟内存空间中,通过映射的虚拟内存空间地址去操作共享内存,从而达到进程间的数据通信。

一个C程序的内存分为代码段、数据段、堆、栈,那么共享内存区域被安排在C程序内存的哪个区域呢?在堆和栈之间有一个共享内存映射区,这个区域就是共享内存在C程序内存空间的分布区域。

共享内存是进程间共享数据的一种最快的方法,提升数据处理效率,是一种效率最高的IPC机制。一个进程向共享内存写入数据,共享这个内存的所有进程都可以立刻看到其中的内容。但是共享内存本身不提供同步与互斥机制,因此需要通过进程信号量进行同步与互斥。
共享内存的属性:
struct shmid_ds {
struct ipc_perm shm_perm; /* 共享内存区域的操作权限,ipc_perm结构 */
size_t shm_segsz; /* 大小 */
time_t shm_atime; /* 映射时间,调用shmat时会更改的 */
time_t shm_dtime; /* 取消映射时间,shmdt时会更改 */
time_t shm_ctime; /* 更改时间 */
unsigned short shm_cpid; /* 创建此共享内存的进程PID */
unsigned short shm_lpid; /* 最后操作这个共享内存的进程PID */
short shm_nattach; /* 至今映射到的进程数量? */
...
}
注意:
1) 子进程不继承父进程创建的共享内存,但是父子进程是共享的;
2) 子进程继承父进程根据共享内存映射的地址。
使用共享内存的步骤:
1.使用shmget函数创建共享内存;
2.使用shmat函数映射共享内存,将这段创建的共享内存映射到具体的进程虚拟内存空间中。
版权声明:本文为weicao1990原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。