
【Linux】进程间通信----共享内存
在共享内存初次使用前,建议首先通过 减少共享内存分块数量,提升性能(尤其在多-zone环境下)。 避免因非必要情况频繁映射或操作共享内存,影响系统负载。
发布日期:2021-05-10 06:33:25
浏览次数:21
分类:精选文章
本文共 1009 字,大约阅读时间需要 3 分钟。
共享内存
1. 共享内存的原理
在物理内存中开辟一段空间,这段空间可以被不同的进程附加到自己的共享区中。附加的进程通过操作共享区来交换数据。每个进程附加到共享内存的方式类似于打开文件,每个进程都有自己的共享内存入口,但实际上共享内存的数据是同一块物理内存。
2. 共享内存的接口
共享内存的主要操作包括创建、删除和附加共享内存。以下是常用函数的说明:
-
int shmget(key_t key, size_t size, int shmflg)
key
:共享内存标识符,可任意指定,需确保唯一性。size
:共享内存的大小。shmflg
: Hos典型值为IPC_CREAT
|IPC_EXCL
,用于创建模式,确保共享内存不存在才创建,否则返回错误。 返回值:共享内存操作句柄。 书写提示:注意处理未授权访问情况,舍弃不必要的错误提示。 -
int shmat(int shmid, const void *shmaddr, int shmflg)
shmid
:共享内存操作句柄。shmaddr
:附加到共享内存的虚拟地址,传递NULL
让系统自动分配地址。shmflg
:访问模式,SHM_RDONLY
表示只读,0
表示可读可写。 返回值:附加成功的共享内存地址。 -
消耗共享内存区域,返回空闲状态。需谨慎使用,避免因升级数据结构引发应用逻辑错误。int shmdt(const void *shmaddr)
共享内存的生命周期受操作系统内核管理,默认自比回收,若存储过程未释放,待进程退出或共享内存被删除则内存被回收。
3. 共享内存的标识符与操作句柄的区别
- 标识符:用于唯一标识共享内存资源,类似于身份证,多个进程可通过标识符识别同一资源。
- 操作句柄:进程获取的共享内存入口,用于执行具体操作,如附加、读取、写入、删除等。操作句柄能够反映共享内存的最新状态。
4. 删除共享内存
共享内存的释放遵循以下规则:
- 确保所有附加进程已脱离(可用
shmdt
查询状态)。 - 使用
shmctl
或ipcrm -m
删除共享内存。 在操作前,建议执行ipcs
验证共享内存状态,避开正在被其他进程使用的情况。
5. 共享内存的操作建议
shmget
检验类型,避免因类型不符导致操作失败。发表评论
最新留言
做的很好,不错不错
[***.243.131.199]2025年04月17日 15时56分16秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
java 字符编码过滤器_java web中字符编码的过滤器(Filter - 1)
2023-01-24
java 线程 栈_Java线程堆栈分析
2023-01-24
#NOIP前数学知识总结
2023-01-24
java书籍_还搞不定Java多线程和并发编程面试题?你可能需要这一份书单!
2023-01-24
java序列化_java对象的序列化和反序列化
2023-01-24
java开发区块链_用Java代码实现区块链
2023-01-24
java快捷键eclipse_eclipse的设置和一些快捷键
2023-01-24
java拼车平台(ssm框架毕业设计)
2023-01-24
Java指定区间返回随机数
2023-01-24
Java推动老年人社区服务(毕设源码+mysql+lw)
2023-01-24
Java提高班(六)反射和动态代理(JDK Proxy和Cglib)
2023-01-24
java操作List
2023-01-24
Java操作Sql语句 出现迭代死循环 (Bug排查)
2023-01-24
#Leetcode# 92. Reverse Linked List II
2023-01-24
java攀枝花市房屋租售信息管理平台的设计与实现(ssm)
2023-01-24
java教学团队管理系统(ssm)
2023-01-24
java教学网站(ssm)
2023-01-24
java教学质量管理平台(ssm)
2023-01-24