Linux 之 【进程间通信】(消息队列与信号量、Systrm VIPC在内核中数据结构设计)

目录

1.消息队列

[2.Systrm V IPC在内核中数据结构设计](#2.Systrm V IPC在内核中数据结构设计)

3.临界资源与临界区

4.信号量


1.消息队列

操作系统在内核空间创建并维护多个消息队列作为共享资源,每个队列都有唯一的标识符。不同进程通过相同的标识符访问同一个队列,从而实现进程间通信。进程可以向队列发送带类型的数据块,也可以从队列中接收特定类型的数据。操作系统采用"先描述,再组织"的方式管理所有消息队列,为每个队列维护描述结构体,并通过链表等数据结构统一组织,确保通信的有序性和可靠性
消息队列的使用接口这里不做讲解

2.Systrm V IPC在内核中数据结构设计

Systrm V通信标准在操作系统内部是一个独立的模块,与一切皆文件的理念兼容性差

理念维度 System V IPC "一切皆文件"理念
访问方式 专用系统调用(shmget/shmctl等) 统一文件API(open/read/write
标识机制 独立的key/shmid/msgid/semid 文件路径和描述符
命名空间 独立的IPC命名空间 统一的文件系统命名空间
权限模型 自定义的struct ipc_perm 标准的Unix文件权限位
生命周期 随内核(需显式删除) 文件系统管理(可持久化)

Systrm V标准具有 共享内存、消息队列、信号量 三种进程间通信方式

操作系统内核为每种类型维护一个对象指针数组,数组的每个槽位存储对应IPC对象的指针。当用户通过xxxget()系统调用创建或获取IPC对象时,内核会分配一个数组索引 ,并结合递增的****序列号 (较大时会回绕到0)生成用户可见的唯一标识符(shmid/msgid/semid)。

此后,对特定数组的增删查改就是对特定IPC资源的增删查改
共享内存、消息队列、信号量 三种类型中的第一个字段都是struct ipc_perm

所以三种对象都能够通过其首字段位置实现类型安全的对象访问转换

复制代码
           struct ipc_perm {
               key_t          __key; /* Key supplied to semget(2) */
               uid_t          uid;   /* Effective UID of owner */
               gid_t          gid;   /* Effective GID of owner */
               uid_t          cuid;  /* Effective UID of creator */
               gid_t          cgid;  /* Effective GID of creator */
               unsigned short mode;  /* Permissions */
               unsigned short __seq; /* Sequence number */
           };

struct ipc_perm存储了对象的创建键值(__key)、属主和创建者的用户/组ID(uid/gid、cuid/cgid)、权限模式(mode)以及防重用的序列号(__seq)
封装的实现:系统调用接口(shmget/shmctlmsgget/msgctlsemget/semctl)封装了实现IPC资源访问功能的细节

继承的模拟:三种IPC对象(共享内存、消息队列、信号量)都将struct ipc_perm作为其数据结构的第一个成员

多态的模拟:例如,IPC_STAT命令在三种IPC类型中具有相同的语义(获取状态),但具体实现会根据对象类型访问不同的特有字段,实现了"同一接口,不同实现"的多态行为,而类型参数在运行时决定具体执行路径

3.临界资源与临界区

临界资源是并发环境中共享且任何时刻只允许单个执行流访问的资源,通常为内存空间但也可扩展至文件、硬件设备等

访问临界资源的那部分代码称为临界区,它通常只占整个程序代码的一小部分(如100行中的5-10行),需通过互斥机制(如锁或信号量)保护,以确保执行流在临界区内的操作具有原子性和隔离性

从资源层级看,CPU将进程视为其调度资源,而进程则将其内存空间视为私有资源;当多进程共享同一内存区域时,该区域即成为临界资源

4.信号量

(1)信号量的核心本质

信号量本质是一把共享计数器,其整数值cnt描述临界资源中可用资源的数量。信号量机制实现了对多进程/多线程访问共享资源的预订和控制

(2)资源预订机制

执行流必须先申请信号量才能访问临界资源的机制类似于"资源预订",申请成功表示获得访问权限,这样,信号量就可以通过保证进入共享资源的执行流的数量,有效保护临界资源

信号量值减1(P操作)对应资源分配,信号量值加1(V操作)对应资源释放

(3) 进程间同步

上述的资源预定机制说明信号量本身也是所有通信进程可见的共享资源,用于实现进程间协同工作的基础同步机制,那么

信号量作为共享资源就需要进行自我保护,PV操作的原子性可以确保信号量自身的线程安全

(4) PV操作的原子性

P操作(申请) :cnt--,原子减1,申请资源,V操作(释放) :cnt++,原子加1,释放资源

原子性要求:单条汇编指令完成,无中间状态,避免普通cnt--/cnt++(3条指令)的竞态问题

(5)二元信号量(互斥锁)

信号量整数值仅为0或1(两态),资源整体使用、整体申请、整体释放时,本质上实现了互斥功能,保护了单一共享资源

相关推荐
木卫二号Coding2 小时前
Docker-构建自己的Web-Linux系统-镜像colinchang/ubuntu-desktop:22.04
linux·ubuntu·docker
维度攻城狮2 小时前
Ubuntu突然无法中文输入的问题解决办法
linux·运维·ubuntu
Coder个人博客2 小时前
Linux6.19-ARM64 mm Makefile子模块深入分析
linux·安全·车载系统·系统架构·系统安全·鸿蒙系统·安全架构
猫猫的小茶馆2 小时前
【Linux 驱动开发】五. 设备树
linux·arm开发·驱动开发·stm32·嵌入式硬件·mcu·硬件工程
岱宗夫up2 小时前
基于ROS的视觉导航系统实战:黑线循迹+激光笔跟随双模态实现(冰达机器人Nano改造)
linux·python·机器人·ros
开开心心_Every3 小时前
PDF转图片工具推荐:免费支持批量转换
linux·运维·服务器·spring boot·edge·pdf·powerpoint
郝学胜-神的一滴4 小时前
Python中的with语句与try语句:资源管理的两种哲学
linux·服务器·开发语言·python·程序人生·算法
zhangrelay4 小时前
如何让手机电脑流畅飞起低碳节能性能拉满-软件安装篇-ESR-Extended Support Release-延长支持版-LTS
linux·运维·笔记·学习
JiMoKuangXiangQu4 小时前
Linux eBPF 案例:sk_filter 读取 IP 地址崩溃
linux·ebpf·sk_filter