当前位置: 首页 > 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.jsqmd.com/news/842558/

    相关文章:

  • 2026红西柚果粒厂家推荐+柑橘果粒厂家推荐:源头直供,品质优选 - 栗子测评
  • 高并发应用场景
  • 如何优化 ECS 实例的网络带宽峰值应对突发流量
  • 2026柚子皮厂家推荐:全品类供应,高性价比之选 - 栗子测评
  • 【网安-Web渗透测试-内网渗透】内网信息收集(工具)
  • 恒立直线导轨供应商哪家好?2026直线导轨定制厂家汇总:直线导轨供应厂家推荐+RUSON中空旋转平台供应商推荐 - 栗子测评
  • 量子计算中SIMD编译优化与离子阱架构实践
  • FastAPI + SQLite 实战:从零搭建个人记账系统
  • 计算机毕业设计 | vue+springboot高校宿舍 学生住宿管理系统(附源码+论文+讲解视频)
  • 3步实现B站视频转文字:让学习笔记制作变得轻松简单
  • 第六章:UI组件与Material3主题
  • Blender-Armatures
  • C51可重入函数原理与实践指南
  • 2026香柚果茸厂家推荐:优质原料直采,风味纯正 - 栗子测评
  • 第一阶段开发复盘与优化纪要
  • 电镀整流机源头厂家:企业采购选型策略深度解析
  • HTML代码加密工具源码_在线网页加密解密_防复制源码
  • 2026合金铝板定制厂家甄选:花纹铝板生产厂家+防滑铝板生产厂家+防滑铝板源头厂家汇总 - 栗子测评
  • 向量数据库横评:Milvus vs Pinecone vs Weaviate 选型指南
  • NotebookLM具身智能落地实战(从零部署到ROS2集成):谷歌AI团队内部培训手册泄露版
  • 解决FlexNet Publisher许可证协议不匹配错误-83
  • 2026铝板定制加工厂推荐盘点:靠谱保温铝板生产厂家+冲压用铝板源头厂家推荐 - 栗子测评
  • 长期项目使用 Taotoken 聚合 API 在模型选型与切换上的便利性体验
  • ABAP RFC调用避坑指南:从`SY-SUBRC`错误码到`CX_ROOT`异常处理的完整实战
  • Equalizer APO终极指南:免费开源的系统级音频均衡解决方案
  • 大模型推理速度慢?用 TensorRT + 量化技术实现 3 倍提速
  • PL/SQL核心技术难点梳理与实战应用案例解析
  • PS网页版源码_在线Photoshop源码_Nginx免环境部署_支持PSD
  • 数组指针VS指针数组
  • 低成本玩转BK7231U:基于CH341A与SPI的固件烧录实战