进程之间具有独立性,每个进程只能访问自己的虚拟地址,进程之间无法直接沟通
共享内存
特性:最快的进程间通信方式
实现原理:
- 在物理内存中开辟一块空间(在内核具有标识,能够被其它进程找到)
- 将这块空间通过页表映射到自己的虚拟地址空间(根据虚拟地址来进行访问操作了)
- 通过虚拟地址进行内存操作
- 解除映射关系
- 删除共享内存
在物理内存上开辟出一块内存空间、将这块空间映射到虚拟地址空间,虽然两个进程都是自己的虚拟地址空闲,但是操作的物理内存都是同一块,一个进程通过虚拟地址空间修改了这个值,那么另一个进程中这个值也会改变。
为什么说共享内存是最快的进程间通信方式?
以管道举例,管道实际上是内核中的一块缓冲区,而我们的读写端都是在用户空间中的,进程需要将buf[]数据写入到管道,涉及到一次内核态与用户态的数据拷贝。获取管道中的数据也是同样的。后面要讲的消息队列和信号量也涉及两次拷贝。
而共享内存就不一样,只是一个进程修改了数据,使用共享内存的其它进程也会被修改。不需要内核态与用户态的数据拷贝,所以共享内存是最快的进程间通信方式。
实现原理:
-
建立共享内存
int shmget(key_t key, size_t size, int shmflg) key: 就是共享内存的名字,唯一值,内核中标记这块共享内存, 其他进程通过相同的值来访问同一块共享内存 size:共享内存的大小,内存管理以内存页的方式进行管理 shmflg:创建时的标志位 IPC_CREAT(创建)|IPC_EXCL(有了报错)|mode(权限) 返回值: 成功:返回共享内存的标识操作句柄 失败:返回-1
-
建立映射关系
void* shmat(int sh