news 2026/4/23 12:32:19

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Linux 之 【进程间通信】(消息队列与信号量、Systrm VIPC在内核中数据结构设计)

目录

1.消息队列

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 12:29:38

量子科技长三角产业创新中心 AI软件开发工程师岗位深度解析与面试指南

量子科技长三角产业创新中心 AI软件开发工程师 职位信息 岗位职责: 1、参与设计开发AI 软件栈开发,包括架构设计、推理引擎、异构调度、图优化、算子开发、算子分析性能优化、编译器优化、AI工具集等; 2、AI网络算子开发、调试优化、整网性能调优,包括算子融合、高性能算子…

作者头像 李华
网站建设 2026/4/17 10:53:41

github上传项目

sudo apt-get install git cd "/media/liangxinyu/Elements SE/MMKGRLib" git init git add . git commit -m "第一次提交代码" git branch -M main git push -f origin main

作者头像 李华
网站建设 2026/4/23 12:30:09

告别手残 + 突破内网!Excalidraw和cpolar 让创意协作无边界

🎁个人主页:User_芊芊君子 🎉欢迎大家点赞👍评论📝收藏⭐文章 🔍系列专栏:AI 文章目录: 这么好的组合赶紧去安装吧,教程如下👇 1. 安装Docker2. 使用Docker拉…

作者头像 李华
网站建设 2026/4/19 2:39:41

掌握Air780EHV核心板的OTP核心库API的用法

Air780EHV核心板集成的OTP核心库API,为开发者提供了对OTP存储区进行数据管理的能力。通过该API,可实现数据写入、内容读取以及在特定策略下的擦除操作。尽管OTP具有不可逆性,但API层的逻辑封装保障了操作的安全性与可追溯性,是关键…

作者头像 李华
网站建设 2026/4/23 12:31:37

基于STM32单片机智能手环 运动时间 里程提醒 蓝牙 时钟 血氧

目录 STM32单片机智能手环功能概述运动时间与里程提醒蓝牙通信实时时钟(RTC)血氧检测硬件与代码要点扩展功能建议 源码文档获取/同行可拿货,招校园代理 :文章底部获取博主联系方式! STM32单片机智能手环功能概述 基于STM32单片机…

作者头像 李华