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

共享内存概述

共享内存,就是在内存里开辟一块公共空间多个进程可以同时映射到自己的虚拟地址空间,大家直接读写同一块物理内存

Linux 进程间通信 IPC 最快的一种方式。

1️⃣创建共享内存空间

2️⃣映射到自己的进程

3️⃣strcpy写数据

4️⃣断开与共享内存的连接

5️⃣干掉共享内存

核心原理

  1. 内核在物理内存中创建一块内存区域
  2. 多个进程把这块内存映射(挂载)到自己的进程地址空间
  3. 进程直接用指针读写这块内存,不用拷贝、不用系统调用中转
  4. 数据无需在内核和用户态来回复制,所以速度最快

优点

  • 速度最快:无数据拷贝,直接内存访问
  • 适合大批量数据传输
  • 多个进程可读可写,双向通信

缺点

  • 不自带同步机制:没有锁、没有等待通知
  • 多个进程同时写会数据错乱
  • 需要自己配合信号量、管道、消息队列做同步互斥

#include <sys/shm.h>

创建或获取一个共享内存:成功返回共享内存ID,失败返回-1

int shmget (key_t key, size_t size, int flag);

  • key:共享内存的键值,相当于 “共享内存的名字”,多个进程通过同一个key就能找到同一块共享内存。可以用IPC_PRIVATE创建一个仅当前进程可用的私有共享内存。
  • size:共享内存段的大小,单位是字节,通常需要按页大小对齐(比如 4KB)。
  • flag:创建 / 获取模式,包含权限位和控制选项:
    • IPC_CREAT:如果共享内存不存在则创建,存在则直接获取。
    • IPC_EXCL:和IPC_CREAT配合使用,只有当共享内存不存在时才创建,否则报错。
    • 权限位:比如0666,表示所有用户都有读写权限。

连接共享内存到当前进程的地址空间:成功返回指向共享内存的指针,失败返回-1


void *shmat (int shm_id, const void *addr,int flag);

addrshmat返回的共享内存地址指针。

/ 断开与共享内存的连接:成功返回0,失败返回-1

int shmat (void *addr);

  • 作用:把共享内存段 “挂载” 到当前进程的虚拟地址空间,让进程可以像访问普通内存一样读写这块共享内存。
  • 参数说明
    • shm_idshmget返回的共享内存 ID。
    • addr:指定共享内存映射到进程地址空间的起始地址,一般填NULL,让系统自动选择合适的地址。
    • flag:映射模式,常用选项:
      • 0:默认读写模式,进程可以读写共享内存。
      • SHM_RDONLY:只读模式,进程只能读取共享内存。

控制共享内存的相关信息:成功返回0,失败返回-1

int shmct1(int shm_id, int cmd, struct shmid_ds *bouf);

  • 作用:对共享内存段执行控制操作,比如查看状态、修改权限、删除共享内存。
  • 参数说明
    • shm_id:共享内存 ID。
    • cmd:控制命令,常用选项:
      • IPC_STAT:获取共享内存的状态信息,存入buf指向的shmid_ds结构体。
      • IPC_SET:修改共享内存的权限、所有者等信息,从buf结构体读取配置。
      • IPC_RMID:标记共享内存段为删除状态,当所有进程都断开连接后,系统会真正释放这块内存。
    • bufshmid_ds结构体指针,用于存放或传递共享内存的配置信息,IPC_RMID时可以填NULL
  • 返回值:成功返回0,失败返回-1,并设置errno

ipcs -m 可以查看系统中有哪些共享内存

删除共享内存。ipcrm -m 加id号

下节学信号及信号量!!

    http://www.zskr.cn/news/1314764.html

    相关文章:

  • 2026柚子皮厂家推荐:全品类供应,高性价比之选 - 栗子测评
  • 恒立直线导轨供应商哪家好?2026直线导轨定制厂家汇总:直线导轨供应厂家推荐+RUSON中空旋转平台供应商推荐 - 栗子测评
  • Linux|操作系统|zfs文件系统的使用详解
  • 【网安-Web渗透测试-内网渗透】内网信息收集(工具)
  • 转:调动员工积极性的七个关键
  • 解决FlexNet Publisher许可证协议不匹配错误-83
  • 【2026年最新版】JDK安装、环境配置教程(详细图文附安装包)
  • 2026香柚汁厂家推荐:NFC果汁原料厂家,原料甄选,新鲜锁鲜 - 栗子测评
  • 【c#基础】3.流程控制
  • JDBC(四):Statement
  • 2026年热门的钢制侧向防火卷帘多家厂家对比分析 - 品牌宣传支持者
  • 硬件入门 + 单片机基础(第7天)综合实训(传感器+IO整合)
  • 为什么 SAP S/4HANA 的前端更常用 SAPUI5,而不是 React、Vue 或 Angular
  • 从选题到定稿不熬夜:2026 年 10 款 AI 毕业论文工具实测,Paperxie 领衔全流程通关
  • HarmonyOS 6学习:从视频加载到长截图——性能优化实战全解析
  • 评审前2小时完成页面布局:前端AI工具快速出图工作流
  • SBA系列生物传感分析仪的工作原理是什么?
  • 2026年团队原型设计工具选型指南:功能、易用性全面评测
  • 玩客云直刷Armbian集成宝塔:一站式搭建个人服务器
  • Gitee SCA:平台唯一官方集成的开源组件安全与合规治理方案
  • TVA智能体范式的工业视觉革命(7)
  • Docker Compose部署Nginx Proxy Manager保姆级教程:从端口映射到数据持久化全解析
  • 数组指针VS指针数组
  • 长期项目使用 Taotoken 聚合 API 在模型选型与切换上的便利性体验
  • ARM Thumb指令集立即数编码与寄存器操作详解
  • TVA智能体范式的工业视觉革命(8)
  • 深入QGIS矢量数据底层:手写WKT字符串添加几何图形,一次搞懂空间数据存储原理
  • NotebookLM具身智能落地实战(从零部署到ROS2集成):谷歌AI团队内部培训手册泄露版
  • 为什么你的NotebookLM要点召回率低于61.8%?——基于172份真实用户数据集的BERT-Chunk对齐缺陷报告
  • 【NotebookLM要点提取黄金法则】:20年AI工具实战总结的5大避坑指南与3步精准萃取法