system V 共享内存

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值