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