尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

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

发布时间:2026/9/27 22:30:56

资讯中心
01
ARTICLE

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

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进程才被唤醒去共享内存读取。六.共享内存的大小
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。