共享内存、消息队列、信号量
一般来说,共享内存、消息队列、信号量详解这三个技术,用的不多,简单认识了即可。如果想进一步了解,可以接着AI学习。
目录
一、共享内存
1、理解
2、相关函数和命令
共享内存函数:
相关命令:
二、消息队列(了解即可)
三、信号量(了解即可)
一、共享内存
1、理解
共享内存是一种允许多个进程访问同一块物理内存区域的IPC机制。共享内存的主要特点是:
- 高效性:因为进程之间通过直接读写共享的内存区域来进行通信,速度很快,开销较低。
- 数据一致性:多个进程可以同时访问共享内存,数据一致性由进程自行管理,通常需要额外的同步机制(如互斥锁、信号量等)来防止数据竞争和冲突。
操作系统内存在多个共享内存,提供多个进程间通信
因此要管理共享内存
先描述,在组织
因此共享内存有结构体对象,叫做struct Shm;因此也有对应数据结构和匹配算法
对共享内存的管理,变成了对链表的增删查改
共享内存不随着进程的结束而释放
而是一直存在,直到系统重启
即共享内存生命周期随内核
文件生命周期随进程
因此需要手动释放
共享内存挂接到进程:
共享内存 在挂接的进程之间构成一个虚拟地址-物理地址之间形成映射
页表的虚拟地址,映射到进程地址空间中的共享区
CPU就可以通过进程PCB的共享区访问到共享内存
共享内存不对内容数据保护
我还没有写完,你就读了,这会导致信息数据不一致
这是共享内存缺点,需要解决
但是同时,共享内存的访问不需要系统调用
所以共享内存是进程间通信最快的方式
因为减少数据拷贝次数
解决共享内存不保护问题:(信息不一致)
进程间再建立管道,利用管道的同步机制
共享内存大小建议:4096*n
2、相关函数和命令
共享内存函数:
shmget
:
- 用法:
int shmget(key_t key, size_t size, int shmflg);
- 参数:
key
:共享内存段的标识符,通常通过ftok
函数生成。size
:共享内存段的大小(以字节为单位)。shmflg
:标志位,用于设置共享内存的权限和创建选项,例如IPC_CREAT
(如果不存在则创建)、IPC_EXCL
(如果已存在则失败)等。- 返回值:成功时返回共享内存段的标识符(一个非负整数);失败时返回 -1。
shmat
:
- 用法:
void *shmat(int shmid, const void *shmaddr, int shmflg);
- 参数:
shmid
:由shmget
返回的共享内存段标识符。shmaddr
:指定共享内存段的附加地址,通常设置为NULL
以自动选择。shmflg
:附加标志,常用0
。- 返回值:成功时返回指向共享内存段的指针;失败时返回 (void *) -1。
常用接口:
shmdt
:
- 用法:
int shmdt(const void *shmaddr);
- 参数:
shmaddr
:指向共享内存段的指针,通常是shmat
返回的指针。- 返回值:成功时返回 0;失败时返回 -1。
shmctl
:
- 用法:
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
- 参数:
shmid
:共享内存段标识符。cmd
:操作命令,例如IPC_STAT
(获取共享内存信息)、IPC_RMID
(删除共享内存段)等。buf
:指向shmid_ds
结构体的指针,用于存储或设置共享内存的信息。- 返回值:根据
cmd
参数的不同,返回不同的值;失败时返回 -1。
相关命令:
删除共享内存:
ipcrm -m shmid
查看共享内存:
ipcs -m
二、消息队列(了解即可)
消息队列是一种消息传递机制,允许进程通过将消息发送到队列中来进行通信。每个消息队列有一个消息队列标识符,用于标识和管理消息队列。消息队列的主要特点是:
- 异步通信:发送者和接收者可以在不同的时间运行,发送消息后发送者可以立即继续执行。
- 消息优先级:消息队列可以设置消息优先级,确保重要消息优先处理。
- 大小限制:消息队列通常有大小限制,以避免无限制增长。
三、信号量(了解即可)
概念:
1、多个执行流(进程)都能看到的资源,叫共享资源
2、被保护起来的资源,叫临界资源---同步和互斥
3、互斥:任何时刻只允许一个进程访问共享资源
4、资源被程序员通过特定接口代码访问,这部分代码叫临界区;另外部分代码叫非临界区代码
5、所谓对共享资源进行保护---临界资源,本质是对访问共享资源的代码保护
信号量理论
信号量---信号灯;目的:保护临界资源(互斥共享资源)
将共享资源分成多个小块,支持多个进程同时访问
信号量,本质是一个计数器
对资源与的预定机制(电影票)
卖票,最怕超出座位
信息量类似于最大座位,不能超过
一旦申请信号量,就预定了对应资源
资源只有一个(整体资源),信号量称为二元信号量,即互斥
写代码步骤:申请信号量、访问共享内存、释放信号量
原子态:要么有,要么没有;只有两种状态,没有中间状态
信息量实现通信:计数器能被多个进程同时看到,因此信号量也是一个公共资源
申请P、释放V信号量:PV操作----安全---原子性(二元状态)
操作系统如何管理共享内存、信息队列、信息量?
共享内存、信息队列、信息量有各自的数据结构
但是每种数据结构的第一个变量都是perm
再用一个perm数组保存perm的地址
访问时,将perm数组内的内容类型强转
这就将IPC资源管理统一
那我怎么知道是各种类型的结构?
perm结构体内部有种类字段指向属于那种类型