首页/新闻资讯/正文详情

Linux进程间通信(五).system Ⅴ共享内存

发布时间:2026/9/27 22:30:58 来源:云帆数科 栏目:资讯中心
Linux进程间通信(五).system Ⅴ共享内存
一.何谓system V?这是一套进程间通信的共享内存的标准。二.原理AB进程的处于虚拟地址空间共享区的空间都通过页表映射到物理内存的同一块区域这就保证了不同进程看到了同一份资源进而实现了进程间通信。注意1.开辟空间建立映射等一系列操作是由OS完成的用户通过系统调用来间接实现以上操作。2.内核设定上这个空间(step1)是允许共享的不会因AB进程进行写时拷贝导致改变其中一个进程的指向进而无法通信。3.通信完成后释放空间时AB进程都是把申请的虚拟地址空间free掉然后去掉页表上的映射关系,共享内存没有指针指向它(是否在使用共享内存)自然而然被OS释放掉那么操作系统怎么知道有没指针指向共享内存呢答案是引用计数当引用计数减到0就没有进程使用共享内存即没有进程的指针指向共享内存这时OS就会释放共享内存。4.先描述再组织三.共享内存接口的使用1.创建共享内存——shmget形参解析①.size共享内存的大小②.shmflg标记位一个宏有两种IPC_CREAT和IPC_EXCLIPC_CREAT创建一个共享内存共享内存不存在就先创建如果存在就打开这个已经存在共享内存并返回。IPC_EXCL单用是滚木毫无意义需用“|”配合IPC_CREAT使用。即IPC_CREAT|IPC_EXCL。共享内存不存在就创建共享内存如果存在shmget出错返回保证了shmget只要成功返回就一定是一个新的共享内存③.key在说这个参数之前我们先引出两个问题1.我们如何去评估一个共享内存是否存在2.怎么保证要进行共享内存通信的两个进程拿到的是同一个共享内存呢问题的答案就是这个key!key可以标识共享内存的唯一性。既然有唯一性就代表着其必然存在。这里需要注意一个点key并非是内核生成的而是在用户层生成当生成以后要手动传给shmget这个系统调用!那为什么是在用户层生成呢进程A调用shmget接口创建了共享内存空间但是进程B怎么连接上这个空间呢首先让进程B再去调用shmget接口是绝对行不通的这只能构建新的共享内存空间。那么在系统层面把key传给B进程反正key能保证共享内存的唯一性这不就成了吗还是不行因为在系统层面想把key从进程A传给B是要基于双方已经建立通信的所以AB进程在建立通信之前会在用户层约定一个key(在用户层约定是不用建立通信的)A进程把key传给系统中对内存空间进行描述的结构体作为识别共享内存空间的身份证随后在用户层拿到key的进程B就会根据这个key找到对应的共享内存空间了。那么如何约定的呢这里用了另一种通信方式——命名管道只要让AB打开同一路径下的同一管道文件就可以实现key的传递。注意共享内存包括描述共享内存的struct其指向的共享内存空间④.返回值那么shmget创建成功以后这个int返回值是啥反正不会是keykey是给内核用的,用户不会去使用key,这是一个用户层的整数值(标识值)。在用户这是通过这个返回值来标识共享内存的后续用户在调用其他系统调用时也是通过这个返回值来访问共享内存。2.生成key——ftok理论上说key可以随意生成但是会带来冲突所以我们一般使用一个接口(内含算法)——ftok来为我们构建冲突较小的key。这玩意是个纯用户层面的算法。pathname字符串和id都可以瞎写但是建议pathname就写当前工作目录的路径.。算法会将这俩货做混合最终构建出我们的key。如果还是发生冲突就更改两个形参以保证key的唯一性。构建key成功就会返回key。2.5.去关联——shmdt在对共享内存进行删除之前还需先将虚拟地址空间与共享内存去关联。3.删除共享内存进程结束如果没有删除共享内存其还会一直存在这跟文件不一样文件的引用计数为0时代表打开文件的所以进程全部退出就会释放文件。所以共享内存的生命周期随内核①.删除共享内存的指令——ipcrmipcrm -m shmid(即shmget的返回值再说一遍不是key!!!!)那么怎么看到shmid呢答案是指令ipcs -m:注意指令是针对用户层面的封装是运行于用户层面的所以要用shmid管理运行内存②.删除共享内存的接口——shmctl这是个共享内存控制函数通过不同的控制命令(形参cmd)可以对共享内存完成不同操作最后一个形参事关共享内存的属性进程删除操作的时候可以置为空。cmd分三种- IPC_STAT获取共享内存信息内核把数据写入 buf buf不能为NULL- IPC_SET修改共享内存的权限、属主从buf读取配置buf不能为NULL-IPC_RMID标记删除共享内存段buf传 NULL 即可【最重要】形参buf指向描述共享内存的结构体shimd_ds该结构体包含共享内存许多属性创建共享内存的进程在shmget以后会把key设置到ipc_perm结构体的_key上。获取共享内存的进程会拿着key去与shimd_ds的_key进行对比如果相同就可以知道访问的是同一个共享内存。4.将共享内存空间映射到进程地址空间——shmat返回值返回起始的虚拟地址。进程可以通过该起始虚拟地址进而访问到对应的共享内存空间。如果单纯从接口名来看:at是attach的意思就是将共享内存挂载到进程的地址空间中。形参解析shmaddr虚拟地址的使用情况OS最清楚用户不能盲目设置一个虚拟地址所以使用接口时就将参数设置为nullptr。shmflg既想对共享内存读也想对其写所以设为0,使用默认配置。四.关于读写在搭建信道的时候用到了大量的系统调用但是在对共享内存进行读写操作时是没有用到系统调用的是直接对共享内存相关联的虚拟地址进行操作的以上确实是有系统调用但它属于搭建信道的范畴。这里进行写操作的时候将虚拟地址空间当成一个大的字符串用for循环进行一个个字符的写入读取是直接获取虚拟地址空间的初始值这时的虚拟地址空间已经被写入了总结五.共享内存通信的特点和弊端共享内存通信有个弊端通信双方的进程是没有同步机制这个保护机制的一个写的进程压根没有生成另一个读的进程生成以后不会阻塞等待写入而是去不断地读取。这会导致数据不一致比如A进程打算写aabb结果写完aab就立马被B进程读了去(AB是并发运行的你读你的我写我的)。在AB进程间再创建一条命名管道A进程会在写入共享内存的时候倘若写完自己想要写的就通过管道向B发通知B进程不准直接读共享内存而是要等待管道的通知通知到了B进程才被唤醒去共享内存读取。六.共享内存的大小

相关推荐

摆脱论文困扰:6款2026年靠谱AI写论文工具深度横评——TaoToken统一Key接入配置实战
摆脱论文困扰:6款2026年靠谱AI写论文工具深度横评——TaoToken统一Key接入配置实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 22:30:46

Cursor-Free-VIP 下载、安装与使用教程:TaoToken 统一 Key 接入配置指南
Cursor-Free-VIP 下载、安装与使用教程:TaoToken 统一 Key 接入配置指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 22:30:46

张家港做网站优化价格揭秘:从零搭建官网避坑指南
张家港做网站优化价格揭秘:从零搭建官网避坑指南

张家港做网站优化价格揭秘:从零搭建官网避坑指南 在张家港找建站公司,最让人头疼的不是技术,而是报价单上那些看不懂的“优化费”。很多老板怕被坑高价,问一圈发现价格从两三千到几万不等,心里直打鼓。其实,网站优化的核心逻辑在于 从零搭建… · 2026/9/27 22:30:46

谷歌搜索结果快照对比教程:Python 监控排名进出与模块变化(附代码)
谷歌搜索结果快照对比教程:Python 监控排名进出与模块变化(附代码)

排名监控做久了会发现:光看「我的排名」不够。真正有价值的问题是——今天谁新进了前 10?谁掉出去了?精选摘要换人了吗? 这些答案都不在单次采集里,而在「两次快照的对比」里。这篇教程教你用 Python 做搜索结果快照对… · 2026/9/27 23:02:34

Linux:虚拟地址空间
Linux:虚拟地址空间

一、程序地址空间程序地址空间是程序运行成为进程之后,进程自身视角下所能访问的全部地址范围。这片地址空间被操作系统划分成多个功能区域,包括代码段(.text)、初始化数据段(.data)、未初始化数据段&#… · 2026/9/27 23:02:34

制造企业如何借助MOM平台强化「异常管理」?一文解析核心实践要点
制造企业如何借助MOM平台强化「异常管理」?一文解析核心实践要点

1. 引言:异常管理正在成为制造执行的核心能力对制造企业来说,生产现场的异常几乎无可避免:设备突发停机、来料质量波动、工艺参数越限、工单交期告急、人员操作偏差等等。真正拉开企业间差距的,往往不是「是否发生异常」&#xff… · 2026/9/27 23:02:34

注意:算力基建投资超十万亿,这里拆解科技巨头的表外负债
注意:算力基建投资超十万亿,这里拆解科技巨头的表外负债

注意:算力基建投资超十万亿,这里拆解科技巨头的表外负债 你见过买东西还要反过来分走卖家股份的生意吗? 2026年9月24日,明星人工智能公司Anthropic找老牌网络服务商Akamai签了一份长达七年的租约,一口气砸出116亿美元采… · 2026/9/27 23:02:34

【仓颉语言入门 · 第17课】
【仓颉语言入门 · 第17课】

【仓颉语言入门 第17课】接口 interface 与实现 第 15、16 课把 struct/class 的骨架和血肉都搭好了。但还差最后一块拼图:类与类之间怎么约定"能力"?怎么让一只鸟和一架飞机共享"能飞"这个抽象?怎么写一个函数&#xf… · 2026/9/27 23:02:28

just 1.51.0 Windows x64 下载:命令运行器与justfile说明
just 1.51.0 Windows x64 下载:命令运行器与justfile说明

just 1.51.0 Windows x64 下载 官方发行页 本文整理 just 1.51.0 的 Windows x64 MSVC 压缩包,用于需要固定版本的项目命令管理环境。备用入口经草料提示页进入夸克,点击“继续访问”查看文件;登录与下载要求以实际页面为准。 文件信息 文… · 2026/9/27 23:02:28

MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现

简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01

汕头网站建设制作厂家避坑指南:5大注意事项救急
汕头网站建设制作厂家避坑指南:5大注意事项救急

汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01

多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习

简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01

MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现

简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01

汕头网站建设制作厂家避坑指南:5大注意事项救急
汕头网站建设制作厂家避坑指南:5大注意事项救急

汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01

多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习

简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码