共享内存、消息队列、信号量

一般来说,共享内存、消息队列、信号量详解这三个技术,用的不多,简单认识了即可。如果想进一步了解,可以接着AI学习。

目录

一、共享内存

1、理解

2、相关函数和命令

共享内存函数:

相关命令:

二、消息队列(了解即可)

三、信号量(了解即可)

一、共享内存

1、理解

共享内存是一种允许多个进程访问同一块物理内存区域的IPC机制。共享内存的主要特点是:

  • 高效性:因为进程之间通过直接读写共享的内存区域来进行通信,速度很快,开销较低。
  • 数据一致性:多个进程可以同时访问共享内存,数据一致性由进程自行管理,通常需要额外的同步机制(如互斥锁、信号量等)来防止数据竞争和冲突。

操作系统内存在多个共享内存,提供多个进程间通信
因此要管理共享内存
先描述,在组织
因此共享内存有结构体对象,叫做struct Shm;因此也有对应数据结构和匹配算法
对共享内存的管理,变成了对链表的增删查改

共享内存不随着进程的结束而释放
而是一直存在,直到系统重启
即共享内存生命周期随内核
文件生命周期随进程
因此需要手动释放

共享内存挂接到进程:
共享内存 在挂接的进程之间构成一个虚拟地址-物理地址之间形成映射
页表的虚拟地址,映射到进程地址空间中的共享区
CPU就可以通过进程PCB的共享区访问到共享内存

共享内存不对内容数据保护
我还没有写完,你就读了,这会导致信息数据不一致
这是共享内存缺点,需要解决
但是同时,共享内存的访问不需要系统调用
所以共享内存是进程间通信最快的方式
因为减少数据拷贝次数
解决共享内存不保护问题:(信息不一致)
进程间再建立管道,利用管道的同步机制

共享内存大小建议:4096*n

2、相关函数和命令

共享内存函数:

  1. shmget

    • 用法int shmget(key_t key, size_t size, int shmflg);
    • 参数
      • key:共享内存段的标识符,通常通过 ftok 函数生成。
      • size:共享内存段的大小(以字节为单位)。
      • shmflg:标志位,用于设置共享内存的权限和创建选项,例如 IPC_CREAT(如果不存在则创建)、IPC_EXCL(如果已存在则失败)等。
    • 返回值:成功时返回共享内存段的标识符(一个非负整数);失败时返回 -1。
  2. shmat

    • 用法void *shmat(int shmid, const void *shmaddr, int shmflg);
    • 参数
      • shmid:由 shmget 返回的共享内存段标识符。
      • shmaddr:指定共享内存段的附加地址,通常设置为 NULL 以自动选择。
      • shmflg:附加标志,常用 0
    • 返回值:成功时返回指向共享内存段的指针;失败时返回 (void *) -1。

常用接口

  1. shmdt

    • 用法int shmdt(const void *shmaddr);
    • 参数
      • shmaddr:指向共享内存段的指针,通常是 shmat 返回的指针。
    • 返回值:成功时返回 0;失败时返回 -1。
  2. 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结构体内部有种类字段指向属于那种类型

  • 13
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

二十5画生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值