共享内存区域说白了就是多个进程共享的一块物理内存地址,只是将这块物理内存分别映射到自己的虚拟地址空间上。假设有10个进程将这块区域映射到自己的虚拟地址上,那么,这10个进程间就可以相互通讯。由于是同一块区域在10个进程的虚拟地址上,当第一个进程向这块共享内存的虚拟地址中写入数据时,其他9个进程都会看到。但是进程之间使用这块共享内存时,必须通过信号量做同步控制。管道和消息队列由操作系统来控制,而共享内存需手动同步。
API接口:
int shmget((key_t)key,int sharedsize,int flag);//创建或获取内核对象
void* shmat(int shmid,const void* addr,int flag);//将进程中虚拟地址映射到指定内核对象开辟的物理内存上,并将虚拟地址返回
int shmdt(void* addr);//将虚拟地址与共享内存区域断开连接
int shmctl(int shmid,int cmd,struct shmid_ds *buf);//共享内存的控制函数
共享内存是最快的IPC(进程间通讯简称)原因:
1.在通讯之前访问内核对象时,需要用户态切换内核态。但是当真正发送数据时,直接通过指针操作空间,不需要用户态切换内核态。
2.发送方可以直接通过指针将数据写入共享内存区域,接收方直接通过指针操作共享内存区域的数据。相比管道、消息队列少了两次数据拷贝。
命令:
ipcs -m 查看共享内存
ipcrm -m shmid 删除共享内存