【Linux进程间通信(六)】深入理解 System V IPC

news2025/1/11 14:49:35

         (一)引入

(二)IPC 命名空间

(三)ipc_ips结构体

(四)ipc_id_ary结构体

(五)kern_ipc_perm结构体

(六)操作系统对IPC资源是如何管理的


(一)引入

在前三篇的博客中,我介绍了System V IPC在Linux中的三种方式:共享内存、消息队列以及信号量。观察这三种IPC资源的内核数据:

共享内存:

           struct shmid_ds {
               struct ipc_perm shm_perm;    /* Ownership and permissions */
               size_t          shm_segsz;   /* Size of segment (bytes) */
               time_t          shm_atime;   /* Last attach time */
               time_t          shm_dtime;   /* Last detach time */
               time_t          shm_ctime;   /* Creation time/time of last
                                               modification via shmctl() */
               pid_t           shm_cpid;    /* PID of creator */
               pid_t           shm_lpid;    /* PID of last shmat(2)/shmdt(2) */
               shmatt_t        shm_nattch;  /* No. of current attaches */
               ...
           };

 消息队列:

           struct msqid_ds {
               struct ipc_perm msg_perm;   /* Ownership and permissions */
               time_t          msg_stime;  /* Time of last msgsnd(2) */
               time_t          msg_rtime;  /* Time of last msgrcv(2) */
               time_t          msg_ctime;  /* Time of creation or last
                                              modification by msgctl() */
               unsigned long   msg_cbytes; /* # of bytes in queue */
               msgqnum_t       msg_qnum;   /* # number of messages in queue */
               msglen_t        msg_qbytes; /* Maximum # of bytes in queue */
               pid_t           msg_lspid;  /* PID of last msgsnd(2) */
               pid_t           msg_lrpid;  /* PID of last msgrcv(2) */
           };

信号量:

           struct semid_ds {
               struct ipc_perm sem_perm;  /* Ownership and permissions */
               time_t          sem_otime; /* Last semop time */
               time_t          sem_ctime; /* Creation time/time of last
                                             modification via semctl() */
               unsigned long   sem_nsems; /* No. of semaphores in set */
           };

 我们不难发现,这三种IPC资源的数据结构中都包含了一个结构体ipc_perm,这就需要我们思考了,为什么要这么设计呢?跟着我的脚步往下走吧。

 上图是在Linux内核中管理System V IPC的部分,接下来我将依照这个图来进行讲解。

(二)IPC 命名空间

在Linux内核中存在一个IPC命名空间,它是一种用于隔离不同进程间通信资源的机制。IPC命名空间允许在同一主机上创建多个独立的IPC资源集合,每个 IPC 命名空间都有自己的信号量、消息队列和共享内存等 IPC 对象。

通过IPC命名空间,可以实现不同进程之间的通信资源隔离,避免不同进程之间的通信资源相互干扰。

IPC命名空间里面用struct ipc_ids的结构体数组来管理各种IPC资源,该结构体数组中的每一个元素都代表一个IPC资源,比如ids[0]可能代表信号量,ids[1]可能代表消息队列等。

struct ipc_namespace{
    atomic_t count; 
    struct ipc_ips ids[3];
    ......
};

(三)ipc_ips结构体

struct ipc_ids结构体内容如下

struct ipc_ids {
    struct ipc_id_ary *entries;
    int in_use;
    int max_id;
    int seq;
    struct ipc_id_ary *free;
    struct ipc_id_ary *in_use_next;
    struct ipc_id_ary *in_use_prev;
};

  • entries:存储 IPC 对象信息的数组,每个元素是一个 ipc_id_ary 结构体,用于存储特定类型的 IPC 对象的 id。
  • in_use:当前已经被使用的 IPC 对象数量。
  • max_id:当前 IPC 对象的最大 id。
  • seq:IPC 对象的序列号。
  • free:空闲的 ipc_id_ary 结构体链表,用于存储可以被重用的 IPC 对象 id。
  • in_use_next 和 in_use_prev:指向已经被使用的 ipc_id_ary 结构体的链表的下一个和上一个元素。

(四)ipc_id_ary结构体

 struct ipc_id_ary结构体内容如下:

struct ipc_id_ary {
    struct ipc_ids *ids;
    int in_use;
    int seq;
    struct kern_ipc_perm *p[IPCID_ARRAY_ENTRIES];
};
  • ids:指向包含该 ipc_id_ary 结构体的 ipc_ids 结构体的指针,用于确定所属的 IPC 对象类型。
  • in_use:表示该 ipc_id_ary 结构体当前是否被使用。
  • seq:IPC 对象的序列号。
  • p:一个长度为 IPCID_ARRAY_ENTRIES 的指针数组,用于存储指向 kern_ipc_perm 结构体的指针。kern_ipc_perm 结构体包含了 IPC 对象的权限信息等。

(五)kern_ipc_perm结构体

  kern_ipc_perm结构体内容如下:

struct kern_ipc_perm {
    key_t key;              // IPC 对象的键
    kuid_t uid;             // 拥有者的用户 ID
    kgid_t gid;             // 拥有者的组 ID
    kuid_t cuid;            // 创建者的用户 ID
    kgid_t cgid;            // 创建者的组 ID
    umode_t mode;           // 权限模式
    unsigned int seq;       // 序列号
};

(六)操作系统对IPC资源是如何管理的

可以发现,kern_ipc_perm跟共享内存、消息队列以及信号量中的ipc_perm的内容一致。

 现在我们可以对操作系统如何管理IPC资源来进行总结了。

设计者通过先描述,再组织的思想将各种IPC资源通过结构体数组的数据结构来进行管理,所以对IPC资源的管理就变成了对数组的增删查改。

接下来我将通过 操作系统是如何查找一个特定的IPC对象(这里我以消息量为例子)的权限信息的,来讲解IPC管理。

  1. 用户进程传递IPC对象的唯一标识符给系统,系统根据这个标识符进行查找。

    系统使用IPC对象的标识符作为索引,在全局的ipc_ids数组中进行查找。
  2. 系统根据IPC对象的标识符,在全局的ipc_ids数组中查找到对应的ipc_ids结构体,获取IPC对象的全局序列号。

    系统根据IPC对象的标识符计算出在ipc_ids数组中的位置,获取对应的ipc_ids结构体。
  3. 在ipc_ids结构体中的entries数组中,根据IPC对象的全局序列号找到对应的ipc_id_ary结构体。

    系统根据IPC对象的全局序列号,在entries数组中查找对应的ipc_id_ary结构体。
  4. 在ipc_id_ary结构体中,根据IPC对象的全局序列号和局部序列号,通过p指针数组找到要查找的IPC对象的位置。

    系统根据IPC对象的全局序列号和局部序列号,在p指针数组中找到对应的IPC对象的位置。
  5. 最终在kern_ipc_perm *p数组中找到了目标IPC对象的位置,可以对该IPC对象进行操作。

    系统根据在ipc_id_ary结构体中找到的位置,定位到kern_ipc_perm *p数组中对应的IPC对象。

通过以上步骤,系统可以根据用户传递的IPC对象的唯一标识符,通过一系列的查找和计算,最终定位到系统中具体的IPC对象,确保进程可以安全地访问和操作IPC资源。这种查找过程涉及到对全局数据结构的索引和计算,以及多层的查找和定位操作。

而最后找到的kern_ipc_perm结构体虽然和三种IPC方式中的ipc_perm结构体名称不同,但其内容都是相同的,操作系统会利用类型转换,通过kern_ipc_perm结构体就可以访问其他三种IPC方式的结构体了,这就类似于一种多态的思想,通过父类指针,访问子类。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

mybatis:Spring junit 测试报错:Failed to load ApplicationContext

Spring junit 测试报错:Failed to load ApplicationContext 解决方法,修改mybatis版本,版本过高导致无法加载依赖

NVIDIA Omniverse Cloud API支持数字孪生开发,可解决复杂AI问题 | 最新快讯

在全球范围内,价值超过 50 万亿美元的重工业市场,正在竞相实现数字化。 基于此,为帮助数字孪生技术更好地赋能千行百业,AI 企业 NVIDIA 在架构底层算力的同时,也搭建了 NVIDIA AI Enterprise 和 Omniverse 两大平台。 …

PDF转word转ppt软件

下载地址:PDF转word转ppt软件.zip 平时工作生活经常要用到PDF转word转ppt软件,电脑自带的又要开会员啥的很麻烦,现在分享这款软件直接激活就可以免费使用了,超级好用,喜欢的可以下载

【不使用深度学习框架】多层感知机实现手写Minist数据集识别

手写Minist识别是一个非常经典的问题,其数据集共有70000张28*28像素的图片,其中60000张作为训练集,剩下的10000张作为测试集,每一张图片都表示了一个手写数字,经过了灰度处理。 本文延续前面文章提到的多层感知机&…

五一 Llama 3 超级课堂 大完结

首先很感谢上海人工智能实验室和机智流等相关举办单位组织的这个活动,在Llama3发布不多时就让我们可以体验到大模型的进步,回顾整个活动,从内容上看是相当用心的。从A100的提供使用到大模型部署,微调,Agent功能应用和数…

网贷大数据查询要怎么保证准确性?

相信现在不少人都听说过什么是网贷大数据,但还有很多人都会将它跟征信混为一谈,其实两者有本质上的区别,那网贷大数据查询要怎么保证准确性呢?本文将为大家总结几点,感兴趣的朋友不妨去看看。 想要保证网贷大数据查询的准确度&am…

Mamba结构的Demo源码解读

文章目录 前言一、mamba结构构建辅助函数解读1、dataclass方法解读2、Norm归一化LayerNormRMSNormRMSNorm源码 3、nn.Parameter方法解读 二、mamba原理二、mamba模型构建1、主函数入口源码解读2、Mamba类源码解读 三、ResidualBlock的mamba结构源码解读四、MambaBlock构成Resid…

【四、性能测试】性能测试基础与几个重要的概念

你好,我是山茶,一个95后在职程序员。也是一个目标跟 1000 程序员探索出 AI 测试 副业之路的 bro,欢迎跟我一起沟通交流! 一、什么是性能测试? 性能测试是通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来…

Clion STM32CubeMX 项目

系列文章目录 前言 最后修改 2024 年 4 月 16 日 操作系统:Windows / Linux / macOS 所需工具 STM32CubeMX、GNU ARM 工具链 项目格式: CMake 兼容配置: OpenOCD 运行与调试/嵌入式 GDB 服务器 对于以 STM32 板卡为目标的嵌入式项目&#xf…

渗透之sql盲注(时间/boolean盲注)

sql盲注:sql盲注意思是我们并不能在web页面中看到具体的信息,我们只能通过输入的语句的真假来判断。从而拿到我们想要的信息。 我们通常使用ascii值来进行盲注。 目录 手动注入: 时间盲注: 布尔盲注: python脚本注…

gitlab集群高可用架构拆分部署

目录 前言 负载均衡器准备 外部负载均衡器 内部负载均衡器 (可选)Consul服务 Postgresql拆分 1.准备postgresql集群 手动安装postgresql插件 2./etc/gitlab/gitlab.rb配置 3.生效配置文件 Redis拆分 1./etc/gitlab/gitlab.rb配置 2.生效配置文件 Gitaly拆分 1.…

C# 和 Qt 相比的一些优势

C# 和 Qt 都是流行的软件开发工具,它们各自具有不同的优势,适用于不同的开发场景。以下是 C# 和 Qt 相比的一些优势。相比之下,Qt 也有其独特的优势,特别是在跨平台 GUI 应用程序开发方面。然而,C# 的这些优势使得它在…

又发现一个ai生成音乐的网站-heymusic

网址 https://heymusic.ai/ 尴尬,不挂梯子能登录进来,但是谷歌账号注册不了,刷新了几遍也没注册上。 看了下价格,应该不是免费的,所以也没了试用的兴趣。 我也不想用别的邮箱注册了,所以只能简单的水一…

DenseCLIP环境配置

直接看raoyongming/DenseCLIP: [CVPR 2022] DenseCLIP: Language-Guided Dense Prediction with Context-Aware Prompting (github.com) 但这里的环境配置可能和现在不太适配,自己配了好久没弄好 后面尝试了另外的版本的(但这个版本少了一些内容&#…

【MM32F3270火龙果】点亮led

文章目录 前言GPIO的工作模式一、有哪些工作模式?1.1 GPIO的详细介绍1.2 GPIO的内部框图输入模式输出部分 二、操作GPIO点亮led2.1 初始化gpio2.2 写gpio 三、示例代码总结 前言 本文将介绍如何在MM32F3270火龙果微控制器上使用Keil开发环境点亮LED。MM32F3270火龙…

【R语言】生存分析模型

生存分析模型是用于研究时间至某个事件发生的概率的统计模型。这个事件可以是死亡、疾病复发、治疗失败等。生存分析模型旨在解决在研究时间相关数据时的挑战,例如右侧截尾(右侧截尾表示未观察到的事件发生,例如研究结束时还未发生事件&#…

大语言模型入门介绍(附赠书)

自2022年底ChatGPT的震撼上线以来,大语言模型技术迅速在学术界和工业界引起了广泛关注,标志着人工智能技术的又一次重要跃进。作为当前人工智能领域的前沿技术之一,代表了机器学习模型在规模和复杂性上的显著进步。它们通常由深度神经网络构成…

17.接口自动化学习-日志

1.日志输出渠道 &#xff08;1&#xff09;文件格式 xx.log &#xff08;2&#xff09;控制台输出 2.日志级别 debug<info<warnning<error<critical 3.代码实现 from utils.handle_path import log_path import logging import datetime def logger(fileLogTr…

微信视频号怎么开店卖东西的?从开店到发货,具体流程来了

这两年&#xff0c;视频号逐渐展露头角&#xff0c;发展短&#xff0c;商家少&#xff0c;很多类目都没被商家占领&#xff0c;于是好多想创业的新手玩家就准备去视频号小店这个新平台闯一闯 那视频号小店是怎么开店卖东西的&#xff1f;今天我就给大家讲一讲视频号小店的正确…

modprobe: can‘t open ‘modules.dep‘: No such file or directory

使用modprobe会提示modprobe: cant open modules.dep: No such file or directory 直接输入depmod即可。 如果depmod没有效果&#xff0c;则需要重新配置编译你的根文件。 在busybox配置界面进入linux Module Utilities, 上下键选择depmod&#xff0c;并按 y 选中&#xff0c…