1.shared memory 原理 shm
OS从物理内存开辟空间,再通过页表映射到堆栈之间的共享区里,返回虚拟地址给进程
OS内肯定不止一个共享内存,OS内存在多个共享内存,OS会用struct shm去描述共享内存,再将它们管理起来。
既然内存内存在多个共享内存,如何确保两个进程连接到同一块共享内存?
两个进程在使用共享内存时会约定一个唯一的数字来确保链接到同一块共享内存
如何去生成唯一的数字?
同样路径 同样id 同样算法 得到同一个key
2.快速认识系统接口
创建共享内存:
在内存上开辟空间,并挂接到进程上,将key写入 struct shm
既能创建也能读取。
shmflg:IPC_CREAT | IPC_EXCL | 0644
标记位,宏 IPC_CREAT: 不存在创建,存在就获取
IPC_EXCL: 不单独使用,单独使用无意义 ,存在就出错返回,不存在
就出错,确保生成一个新的共享内存
失败返回-1,成功返回shmid
ipcs -m 查看共享内存
共享内存的大小最好设置为 4096 * n
key vs shmid
key:不要在应用层使用,只在内核中标识共享内存的唯一性。
shmid:用shmid来操作共享内存。
挂接到进程的进程虚拟地址
shamddr:可以设置为nullptr
shmflg:可以设置为0
返回数据:成功则返回(void*需转换)虚拟地址,失败返回-1
去关联去除页表的映射关系
shmaddr:传入内存空间的虚拟地址
成功返回0,失败返回-1
控制共享内存(改 查 删)
shmctl(shmpid,IPC_RMID,nullptr) 删除共享内存
结论一:共享内存(IPC资源)生命周期是随内核,不同于文件随进程终止,共享内存会一直存在直到用户主动去删除:ipcrm -m shmid
3.编写代码
1.生成同一个key
2.创建共享内存
3.连接并控制
可能遇到的问题:
当创建一个shm后,再次运行可执行程序,会报出文件存在的错误
原因:第一次创建的shm是不会随进程的结束而关闭的,它的生命周期是随内核的
解决方法:手动删除:ipcrm -m shmid