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(两态),资源整体使用、整体申请、整体释放时,本质上实现了互斥功能,保护了单一共享资源

相关推荐
groundhappy3 小时前
idalib安装和codex ida-mcp配置
linux·开发语言·python
通信小小昕4 小时前
Ubuntu 26.04 中文输入法安装
linux·运维·ubuntu
张小姐的猫5 小时前
【Linux】网络编程 —— HTTP协议(上)
linux·运维·服务器·网络·http·单例模式·策略模式
栩栩云生5 小时前
AI 写代码犯的错,早被写进了错题集
linux·安全·ai编程
imc.116 小时前
linux基础IO
linux·运维·服务器
BelongPanda8 小时前
Linux Nginx 纯手动 Let‘s Encrypt 泛域名证书配置教程
linux·nginx
酷可达拉斯9 小时前
Linux操作系统-shell编程(0)
linux·运维·服务器·python·云计算
2301_777998349 小时前
Linux中断机制:操作系统如何高效运行
linux·运维·服务器
yunwei379 小时前
eBPF 教程:检查 exec 后真正安装的可执行镜像
linux·开源
笑锝没心没肺10 小时前
yum update 报错:GPG key retrieval failed: [Errno 14] HTTPS Error 404 - Not Found
linux·运维·服务器