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

【Linux篇】进程间通信:进程IPC

目录

共享内存空间

共享内存是在用户空间还是内核空间?——用户空间

共享内存的生命周期

如何使用共享内存

共享内存的权限

共享内存是进程间通信中,速度最快的方式:

共享内存的缺点:


进程间通信标准:

  1. system V---共享内存
  2. linux内核支持了这种标准,专门设计了一个IPC通信模块,对于我们来说就是通信接口的设计

共享内存空间

共享内存是一种进程间通信的机制,即不同进程的虚拟内存空间(虚拟内存地址不需要相同),映射到相同的物理内存中。如果某个进程向共享内存写入数据,所做的改动将【立即影响到】【同时访问】(加了锁的就不算“同时可以访问")同一段共享内存的任何其他进程

在Linux中,每个进程都有属于自己的进程控制块(PCB)和地址空间(Addr Space),并且都有一个与之对应的页表,负责将进程的虚拟地址与物理地址进行映射,通过内存管理单元(MMU)进行管理。两个不同的虚拟地址通过页表映射到物理空间的同一区域,它们所指向的这块区域即共享内存

我们把将物理内存中的某段空间映射到多个进程的虚拟地址空间中的这种通信方式,叫做“共享内存”

在操作系统内,有多个共享内存同时存在,所以操作系统要将它们都管理起来

  • 先描述再组织

  • 共享内存一定会有对应的描述共享内存的内核结构。有这一点后,再加上物理内存。

  • 进程与共享内存的关系就是内核数据结构之间的关系。进程的内核数据结构与共享内存的数据结构

在共享内存中,存在引用计数,当引用计数为0时,表示没有进程在使用这块共享内存,此时就会被操作系统释放掉

共享内存是在用户空间还是内核空间?——用户空间

共享内存的接口,system V的特性

key:用来标识共享内存的唯一性

size:共享内存的大小

shmflg:共享内存创建的选项

怎么评估共享内存存在还是不存在?

怎么保证两个不同的进程,拿到的就是同一个内存?

  • 手动构建key

  • 查看一个已经创建的共享内存

ipcs -m

  • 删除共享内存

ipcrm -m +共享内存id

能不能使用key来代替id?

不能。为什么?

key是要给内核进行区分唯一性的。用户使用指令管理共享内存是在用户层的,而指令内部是对系统调用进行了封装的。也就是说,指令是运行在用户层的,而key是给OS用的,所以不能使用key来代替id

  • 代码删除共享内存

 void Destroy(){if(_shmid == gdefaultid)return;int n=shmctl(_shmid,IPC_RMID,nullptr);if(n > 0){printf("shmctl delete shm: %d success!\n",_shmid);}else{EXR_EXIT("shmctl\n");}}   

共享内存的生命周期

  • 共享内存的生命周期随内核。

  • 如果进程没有显示的删除对应的共享内存,即便进程退出了,ipc资源依旧被占用

如何使用共享内存

使用共享内存需要先把共享内存映射到进程的地址空间当中。

怎么映射的?

操作系统提供了一个系统调用shmat。调用这个系统调用的进程会把自己的堆栈之间的映射区和队友的共享内存建立映射。

成功:返回共享内存起始的虚拟地址

失败:-1

shmat,将共享内存挂接到进程的地址空间中

共享内存的权限

共享区属于用户空间

共享内存是进程间通信中,速度最快的方式:

  1. 两个进程都映射了这块空间,映射之后读写直接被对方看到

  2. 不需要进行系统调用进行读取或者写入内容,直接以指针地址的方式访问空间

共享内存的缺点:

  1. 通信双方没有所谓的同步机制

  2. 因为没有同步机制,所以会导致数据不一致

共享内存没有保护机制

如果非得将共享内存保护起来呢?

http://www.lryc.cn/news/602584.html

相关文章:

  • java每日精进 7.28【流程设计6.0(泳池和泳道)】
  • 重生之我在暑假学习微服务第三天《Docker-上篇》
  • 采用黑翅鸢优化算法BKA-CNN-LSTM、CNN-LSTM、LSTM、CNN四模型多变量回归预测,多输入单输出(Matlab)
  • 轻资产革命:连合直租如何用DaaS模式重塑企业资产逻辑
  • 【Apache Tomcat】
  • 设计模式实战:自定义SpringIOC(理论分析)
  • 中国汽车能源消耗量(2010-2024年)
  • 力扣17:电话号码的字母组合
  • 设计模式(二十四)行为型:访问者模式详解
  • ADB+Python控制(有线/无线) Scrcpy+按键映射(推荐)
  • 【学习笔记】AD7708/18(1)-理解官网的参考代码
  • MacBook IOS操作系统格式化U盘FAT32
  • 【深度解析】R语言与作物模型(以DSSAT模型为例)融合应用
  • 分布式微服务--核心组件与架构关系(一)
  • R语言简介(附电子书资料)
  • Leetcode_349.两个数组的交集
  • JavaScript手录09-内置对象【String对象】
  • 6.2 总线事务和定时 (答案见原书 P295)
  • 基于Flask的智能停车场管理系统开发实践
  • C语言:20250728学习(指针)
  • 使用node-cron实现Node.js定时任务
  • Javaweb Day3
  • 主要分布于内侧内嗅皮层的层Ⅲ的网格-速度联合细胞(Grid × Speed Conjunctive Cells)对NLP中的深层语义分析的积极影响和启示
  • 学习人工智能所需知识体系及路径详解
  • BUUCTF-MISC-[HBNIS2018]caesar1
  • 科技风杂志《科技风》杂志社科技风编辑部2025年第19期目录
  • 《Ai智能眼镜的市场定义及用户分析》- 深圳市天趣星空科技有限公司 CEO 王洁
  • 【7.26-7.28胜算云AI日报:首个开源3D世界生成模型腾讯混元、微软预示 8 月 GPT-5 发布、Nemotron推理、商汤悟能、DM夺金】
  • Python 实现多服务器并发启动 SDK-C Master 与 Viewer 的分布式方案
  • 科技赋能成长 脑力启迪未来