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

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

一般来说,共享内存、消息队列、信号量详解这三个技术,用的不多,简单认识了即可。如果想进一步了解,可以接着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结构体内部有种类字段指向属于那种类型

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • GPT-SoVITS
  • EPIC Institute of Technology Round August 2024 (Div. 1 + Div. 2)
  • 大模型日报 2024-08-16
  • vim中跳转头文件
  • JS DOM、点击事件
  • C++ 设计模式——简单工厂模式
  • 忽略时间戳,快速对比tcpreplay和tcpdump数据包pcap数据包一致性
  • 开发军用LabVIEW程序注意事项
  • centos虚拟机IP地址频繁变化的原因及解决策略
  • eNSP 华为远程访问路由器
  • c语言学习,malloc()函数分析
  • 数据库:数据查询
  • Android大脑--systemserver进程
  • 杂项:WPF编程指南 第一章
  • Linux - 基础工具使用
  • Android优雅地处理按钮重复点击
  • Apache Pulsar 2.1 重磅发布
  • Cumulo 的 ClojureScript 模块已经成型
  • input的行数自动增减
  • php面试题 汇集2
  • python3 使用 asyncio 代替线程
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • Sequelize 中文文档 v4 - Getting started - 入门
  • SpiderData 2019年2月25日 DApp数据排行榜
  • Vue.js 移动端适配之 vw 解决方案
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 第2章 网络文档
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 理清楚Vue的结构
  • 优化 Vue 项目编译文件大小
  • 掌握面试——弹出框的实现(一道题中包含布局/js设计模式)
  • 《天龙八部3D》Unity技术方案揭秘
  • ​​​​​​​STM32通过SPI硬件读写W25Q64
  • ​Java并发新构件之Exchanger
  • ​一、什么是射频识别?二、射频识别系统组成及工作原理三、射频识别系统分类四、RFID与物联网​
  • (pojstep1.3.1)1017(构造法模拟)
  • (八十八)VFL语言初步 - 实现布局
  • (二)PySpark3:SparkSQL编程
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (六)Hibernate的二级缓存
  • (七)Flink Watermark
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • (三) diretfbrc详解
  • (三)Kafka离线安装 - ZooKeeper开机自启
  • (一)RocketMQ初步认识
  • (转)nsfocus-绿盟科技笔试题目
  • (状压dp)uva 10817 Headmaster's Headache
  • .mysql secret在哪_MySQL如何使用索引
  • .NET CLR基本术语
  • .NET Core 实现 Redis 批量查询指定格式的Key
  • .net FrameWork简介,数组,枚举
  • .NET 的静态构造函数是否线程安全?答案是肯定的!
  • .net 简单实现MD5
  • .net反编译的九款神器
  • .net利用SQLBulkCopy进行数据库之间的大批量数据传递