共享内存概述
共享内存允许两个或者多个进程共享给定的存储区域
共享内存的特点
1.共享内存是进程间共享数据的一种最快的方法
一个进程向共享的内存区域写入了数据,共享这个内存区域的所有进程就可以立刻看到其中的内容
2.使用共享内存要注意的是多个进程之间对一个给定存储区访问的互斥
若一个进程正在向共享内存区写数据,则在它做完这一步操作前,别的进程不应当去读,写这些数据。
上面图片讲解:
左右两边每一个进程在创建的时候,都会给它分配4G的虚拟内存,所以左右两边的空间叫做虚拟内存,而中间的是物理内存,也就是内存条上的存储区域,这两个进程的前三个空间,4G虚拟内存分为3G的用户空间和1G的内核空间,每一个进程的用户空间是私有的,所以它们最终到达物理内存对应的区域是不相同的,所以说进程A和进程B的用户空间是没有办法进行沟通的,而另外空间,它俩映射出来的都是物理空间同一块区域,所以假设进程a在区域写,刚好b就能读,共享内存就相当于可以把物理地址先交给用户,由我的用户进程对其地址进行操作,就是对物理地址进行操作。
总结:共享内存是进程间通信方式中效率最高的
原因在于进程是直接在物理内存上进行操作,将物理地址映射到用户进程这,所以只要对其地址进行操作,就是直接对物理地址操作。所以快
获取一个共享内存标识符
#include <sys/ipc.h>
#include <sys/shm.h>
int shmget(key_t key, size_t size, int shmflg);
功能
创建一个共享内存
参数
key: 键值,唯一的键值确定唯一的共享内存
size: 创建的共享内存的大小
shmflg: 共享内存的访问权限
IPC_CREAT: 创建这个共享内存
IPC_EXCL: 如果已经存在则返回失败
一般为IPC_CREAT | 0666
返回值
成功 返回共享内存的id
失败: 返回-1
使用shell命令操作共享内存
查看共享内存
ipcs -m
删除共享内存
ipcrm -m shmid
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/shm.h>
int main()
{
key_t key;
if((key = ftok(".", 100)) == -1)
{
perror("fail to ftok");
exit(1);
}
int shmid;
//使用shmget创建一个共享内存
if((shmid = shmget(key, 500, IPC_CREAT | 0666