当前位置: 首页 > news >正文

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

http://www.jsqmd.com/news/305136/

相关文章:

  • 大模型学习完全指南:3阶9步框架助你高效掌握核心技术_AI大模型高效学习指南
  • 2026年Agent元年:大模型应用工程师50w+年薪学习路线与实战指南,大模型应用工程师年薪50w
  • Linux 之 【进程间通信】(共享内存、ftok、shmget、shmat、shmdt、shctl、IPC相关指令)
  • 如何提高大数据领域数据建模的准确性和可靠性
  • CGO调用OpenCV实现多角度模板匹配性能分析
  • 基于STM32单片机烟雾温度防盗报警 物联网云平台 火灾检测系统DIY
  • Photoshop CS6 精简绿色版Photoshop CS6 精简绿色版分享
  • 基于STM32单片机物联网云平台 WIFI点滴速度液体检测 输液系统DIY
  • 【Termux】Photopea离线版部署
  • python脚本实现短剧配音
  • 洛谷 P9100 [PA 2020] Miny 题解
  • Java应用实例:简易背单词程序(更新)
  • 初识线程:带你理解程序运行的基本流程
  • 后端开发效率翻倍:IntelliJ IDEA的5个“神级插件
  • Zookeeper在大数据实时报表系统中的应用
  • 063.经典搜索,剪枝
  • 从零开始学大模型核心:向量嵌入技术完全指南
  • CF2029G Balanced Problem
  • 【技术干货】大模型记忆机制进化全攻略:从存储到经验的AI认知革命
  • 1.5万字硬核AI架构指南:从单体智能到系统智能的实战设计
  • 双非二程序员的大模型逆袭之路:RAG与Agent技术学习指南
  • 大模型应用工程师学习路线:从提示词工程到AI系统构建,年薪50w+技能全攻略_这是一份大模型应用学习路线!(附学习资料)
  • AARONIA(安诺尼)PBS 1 与 PBS 2 近场探头 —— 精准定位电磁干扰源
  • 20260126 之所思 - 人生如梦
  • mysql day2
  • YOLOv8改进 - 注意力机制 | SENetV2: 用于通道和全局表示的聚合稠密层,结合SE模块和密集层来增强特征表示
  • 21点,如何计算胜率高达75%
  • 干瞪眼游戏胜率较高的玩法分析
  • 中国船级社信息开发咨询中心 APP开发工程师职位深度解析与技术面试指南
  • 北航杭州创新研究院移动客户端/前端开发工程师岗位深度解析与面试指南