【Linux】对system V本地通信的内核级理解

 一、system V版本的进程间通信技术  

        通过之前的学习,我们大致可以感受出来,共享内存,消息队列和信号量在使用的时候是有很多共性的。它们三个的接口,包括接口中传的参数有的都有很大的相似度。其实,共享内存,消息队列和信号量是操作系统针对本地进程间通信特意设计出来的system V版本的进程间通信(IPC,Inter Process Communication)技术。共享内存,消息队列和信号量所管理的资源称为IPC资源。在操作系统底层,共享内存,消息队列和信号量都是有相对应的结构体将它们维护起来的

二、共享内存,消息队列和信号量对应的结构体

2.1、共享内存内核结构体

  • shm_perm:表示该共享内存的所有权和权限 

下面就是ipc_perm结构体的内核 

  • _key:就是我们用ftok函数设置进共享内存中的key
  • uid:共享内存所有者的有效用户ID。这通常是在创建共享内存段时指定用户的ID。只有具有适当权限的用户才能对共享内存段执行特定的操作(如读、写或删除)。
  • gid:共享内存所有者所属组的有效组ID。类似于uid,它用于确定组级别的权限。如果一个进程属于拥有共享内存段的组,那么它可能具有额外的访问权限。
  • cuid:共享内存创建者的有效用户ID。这个字段用于记录最初创建共享内存段的用户的ID,通常用于审计或追踪目的。
  • cgid:共享内存创建者所属组的有效组ID。类似于cuid,它记录了创建共享内存段的组的ID。
  • mode:该共享内存的权限
  • _seq:_seq字段通常用于确保IPC对象的唯一性和追踪对象的更改。当IPC对象(如共享内存段、信号量或消息队列)被创建、修改或删除时,其序列号可能会发生变化。这有助于防止IPC对象的重复创建和避免竞态条件

        只有超级用户或创建IPC对象的进程才有权改变ipc_perm结构体的值。其他进程只能根据这些值来确定它们对共享内存段的访问权限。 

共享内存内核结构体剩余成员变量

  • shm_segsz:该共享内存的大小。
  • shm_atime:该共享内存最后一次挂接的时间。
  • shm_dtime:该共享内存最后一次去挂接的时间。
  • shm_ctime:该共享内存最后一次修改的时间。
  • shm_cpid:创建该共享内存的进程的pid。
  • shm_lpid:   最后一个挂接或去挂接该共享内存的进程的pid。
  • shm_nattch:表示当前附加到共享内存段的进程数。 

2.2、消息队列内核结构体

 2.3、信号量内核结构体

 

2.4、内核间的共性

        上面详细地介绍了共享内存的内核结构及其各个字段代表的含义,消息队列和信号量的字段有的含义跟共享内存是一样的,如果大家想了解的更多,可以在命令行中通过man指令进行查阅,这里不做赘述。这里只是想输出一个结论,共享内存、消息队列和信号量的内核在实现的时候是有很多相似性的,换句话说,就是它们三个是一个体系中的东西,在本地进程间通信这个体系中。 

三、共享内存,消息队列和信号量在内核中的组织方式

        通过上面的介绍,我们会发现,描述共享内存,消息队列和信号量的结构体的第一个成员变量都是一个叫struct ipc_perm的结构体,这个结构体在阐述共享内存时已经有详细介绍了。其中,在操作系统内核中,会有一个ipc_id_ary数组,类型就为struct ipc_perm*。未来当我们要创建一个共享内存或消息队列或信号量时,我们需要先顺着ipc_id_array数组中的下标往后找,找到一个下标后在这个下标中填入新的初始化好的struct ipc_perm*(有对应的算法来往后推算数组下标),再将共享内存或消息队列或信号量的结构体中其它的属性填好,这样一个共享内存或消息队列或信号量就被创建出来了。当我们要删除一个IPC资源的时候,只需要在该数组中将对应下标中的struct ipc_perm*释放掉就可以了。这样对IPC资源的管理就变成了对数组的增删查改

        当我们要对一个IPC资源做管理时,只需要对ipc_id_array数组中对应位置的struct ipc_perm*做强转就可以将这个结构体地址强转成一个共享内存或消息队列或信号量的地址,这时该IPC资源的类型就确定了,类型确定了里面该有的属性也就确定了。这就是C++语言中多态的思想。因为操作系统是C语言写的,所以只能用指针强转实现上面的效果

        因为结构体的第一个成员变量是struct ipc_perm*,我们也知道结构体第一个成员变量的地址就是整个结构体的起始地址,未来通过第一个成员变量的地址加上偏移量我们也可以访问该结构体中的其他成员变量。

四、总结

        其实System V的通信技术在现在已经逐渐被边缘化了。System V是一个单独设计的内核模块,其标准的设计不符合Linux下一切皆文件的思想。尽管隶属于文件部分,但已经是一个独立的模块,且shmid与文件描述符之间的兼容性做得并不好。通过上面的学习我们也可以看到,System V自己搞了一个类似于文件描述符表的ipc_id_ary数组,与文件那一套背离了。网络通信使用的是文件的接口,这使得System V标准在整合进网络结构时面临困难。随着POSIX标准的出现和普及,它为进程间通信提供了一套统一的接口和规范,使得不同的操作系统和应用程序在进程间通信上有了更好的兼容性和互操作性。这也进一步削弱了System V IPC的地位。System V版本的进程间通信技术由于设计上的局限性、与现代操作系统和网络结构的不兼容性以及新兴技术的出现,逐渐被边缘化。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/636739.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Learn ComputeShader 01 First Computer Shader

使用Unity版本:2019.4.12f1 整体流程: 1添加一个quad object并添加一个无光照材质 2.相机投影模式设置为正交 3.调整quad使其完全显示在相机内 4.创建脚本并且使用计算着色器覆盖quad的纹理 5.创建一个compute shader 前三步完成以后结果应该是这…

宽带上网技术发展(xDSL、PON)

文章目录 xDSL(x数字用户线,x Digital Subscriber Line)IDSL(基于ISDN数字用户线路)ADSL(不对称数字用户线路)RADSL(速率自适应数字用户线路)HDSL(高速率数字用户线路)VDSL(极高速率数字用户线路)SDSL(单对线路/对称数字用户线路) PON&#x…

《深入浅出.NET框架设计与实现》笔记2——C#源码从编写到执行的流程

中间语言(Intermediate Language,IL) C#编译器在编译时,会将源代码作为输入,并以中间语言形式输入出,该代码保存在*.exe文件中或*.dll文件中。 公共语言运行时(CLR) 可以将IL代码…

Spring之CGLIB和JDK动态代理底层实现

目录 CGLIB 使用示例-支持创建代理对象,执行代理逻辑 使用示例-多个方法,走不同的代理逻辑 JDK动态代理 使用示例-支持创建代理对象,执行代理逻辑 ProxyFactory 如何自动在CGLIB和JDK动态代理转换 使用示例-使用CGLIB代理方式 使用示…

深入理解Java IO流:字节流

深入理解Java IO流:字节流 引言 在Java中,IO(输入/输出)操作是程序与外部世界交互的重要方式。 其中,File类是进行文件操作的基础,而字节流和字符流则是数据传输的两种主要方式。 本文将深入探讨这些概念及…

综合案例(前端代码练习):猜数字和表白墙

目录 一、猜数字 html代码: 点击 猜 按钮的js代码: 点击 重开游戏 按钮的js代码: 整体代码: 页面效果: 二、留言板 css代码: html代码: js代码(主逻辑在这)&am…

vision颜色工具_CogColorExtractorTool

颜色提取工具 CogColorExtractorTool 从彩色图像中抽取像素来创建灰度图像 添加图片和工具 复位 需求:提取中间的红色的玫瑰 参数介绍: 膨胀 形态操作:匹配到的到都是像素点,数值越大,匹配到的结果越完整 柔和度: 如果要生成灰度输出图像,该图像的…

第07-4章 网络层详解

7.1 网络层协议 IP协议ARP(地址解析协议)RARP(反向地址解析协议)ICMP(互联网控制消息协议) 7.2 IP协议详解 7.2.1 IP协议功能 寻址和路由传递服务(不可靠,尽最大努力&#xff0c…

Unity面向切面编程

一直说面向AOP(切面)编程,好久直接专门扒出理论、代码学习过。最近因为某些原因😭还得再学学造火箭的技术。 废话不多说,啥是AOP呢?这里我就不班门弄斧了,网上资料一大堆,解释的肯定…

python怎么连接oracle

一:弄清版本,最重要!!! 首先安装配置时,必须把握一个点,就是版本一致!包括:系统版本,python版本,oracle客户端的版本,cx_Oracle的版本…

每日一题:地下城游戏

恶魔们抓住了公主并将她关在了地下城 dungeon 的 右下角 。地下城是由 m x n 个房间组成的二维网格。我们英勇的骑士最初被安置在 左上角 的房间里,他必须穿过地下城并通过对抗恶魔来拯救公主。 骑士的初始健康点数为一个正整数。如果他的健康点数在某一时刻降至 0…

Pytorch实现线性回归模型

在机器学习和深度学习的世界中,线性回归模型是一种基础且广泛使用的算法,简单易于理解,但功能强大,可以作为更复杂模型的基础。使用PyTorch实现线性回归模型不仅可以帮助初学者理解模型的基本概念,还可以为进一步探索更…