您的位置:首页 > 其它

进程间通信系列(12)共享内存的基本概念

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

                              


  一个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函数映射共享内存,将这段创建的共享内存映射到具体的进程虚拟内存空间中。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: