目录

共享内存空间

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

共享内存的生命周期

如何使用共享内存

共享内存的权限

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

共享内存的缺点:


进程间通信标准:

  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.pswp.cn/bicheng/91026.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/91026.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/91026.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kubernetes 存储入门

目录 Volume 的概念 Volume 的类型 通过 emptyDir 共享数据 编写 emptyDir 的 Deployment 文件 部署该 Deployment 查看部署结果 登录 Pod 中的第一个容器 登录 Pod 中的第二个容器查看 /mnt 下的文件 删除此 Pod 使用 HostPath 挂载宿主机文件 编写 Deployment 文件…

深入理解Redission释放锁过程

lock.unlock();调用unlock方法,往下追Override public void unlock() {try {// 1. 执行异步解锁操作并同步等待结果// - 获取当前线程ID作为锁持有者标识// - unlockAsync()触发Lua脚本执行实际解锁// - get()方法阻塞直到异步操作完成get(unlockAsync(Thread.curre…

四、计算机组成原理——第4章:指令系统

目录 4.1指令系统 4.1.1指令集体系结构 4.1.2指令的基本格式 1.零地址指令 2.一地址指令 3.二地址指令 4.三地址指令 5.四地址指令 4.1.3定长操作码指令格式 4.1.4扩展操作码指令格式 4.1.5指令的操作类型 1.数据传送 2.算术和逻辑运算 3.移位操作 4.转移操作 …

RAG面试内容整理-检索器与生成器的解耦架构

在RAG系统中,检索器(Retriever)与生成器(Generator)的解耦架构是实现灵活高效的关键设计。所谓解耦,即将检索相关文档和生成答案两个步骤分开,由不同的模块或模型负责。这种架构带来的直接好处是模块独立优化:我们可以针对检索任务微调或更换检索模型,而不必影响生成模…

【2026毕业论文鸿蒙系统毕设选题】最新颖的基于HarmonyOS鸿蒙毕业设计选题汇总易过的精品毕设项目分享(建议收藏)✅

文章目录前言最新毕设选题(建议收藏起来)最新颖的鸿蒙毕业设计选题汇总100套易过的精品毕设项目分享毕设作品推荐👇👇👇文未可免费咨询毕设相关问题,点赞留言可送系统源码👇👇&#…

超全!Linux 面试 100 题精选解析:网络篇|16 个 Linux 网络排查与配置必考题详解

网络,是 Linux 系统的神经系统。 一台服务器再强大,没有网络连接也如孤岛。尤其在实际运维与面试场景中,“网络相关的问题”是高频重灾区,比如: IP 配置错乱,连不上公网DNS 无响应,域名解析失败…

在 CentOS 上安装 FFmpeg

在 CentOS 上安装 FFmpeg 可以通过以下两种推荐方法实现(以 CentOS 7/8 为例): 方法一:通过 RPM Fusion 仓库安装(推荐) # 1. 安装 EPEL 仓库 sudo yum install epel-release# 2. 启用 RPM Fusion 仓库 # C…

数据结构——图(一、图的定义)

一、图的定义1、什么是图?图G(V,E) 如图,无向图G顶点集V{,,...,},用|V|表示图G的顶点个数如:V{A,B,C,D} ,|V|4边集E{(u,v)|uV, vV}, 用|E|表示图G的边的条数如:E{(u,v)|(A,B),(A,D),(A,C),(C,D)}&#xf…

Python 列表推导式与生成器表达式

Python 列表推导式与生成器表达式在 Python 中,列表推导式(List Comprehension)和生成器表达式(Generator Expression)是处理序列数据的高效工具。它们不仅能简化代码,还能提升数据处理的效率。本文将详细介…

XCF32PVOG48C Xilinx Platform Flash PROM

XCF32PVOG48C 是 Xilinx 公司推出的一款高容量、低功耗的 Platform Flash PROM(平台闪存配置芯片),专为 Xilinx FPGA 和 CPLD 系列产品提供非易失性配置存储支持。凭借其 32 Mbit 的大容量与出色的系统兼容性,该芯片成为中高端 FP…

重复文件清理工具,附免费链接

链接:https://pan.baidu.com/s/1s_Zx1eHp5Y-XnbbGldIgvw?pwdkjex 提取码:kjex 复制这段内容后打开百度网盘手机App,操作更方便哦

【Spring Boot 快速入门】二、请求与响应

目录请求响应请求Postman 工具简单参数请求实体参数请求数组集合参数日期参数JSON 参数路径参数响应请求响应 请求 Postman 工具 Postman 是一款功能强大的网页调试与发送网页 HTTP 请求的 Chrome 插件 作用:常用于进行接口测试 简单参数请求 原始方式 在原始的…

高并发系统技术架构

(点个赞,算法会给你推荐更多类似干货 ~) 口诀: CDN 扛静态,WAF 防恶意;验证码拦机器; Nginx 先限流,Sentinel 再熔断; Redis 扣库存,MQ 异步写; 对…

python任意模块间采用全局字典来实现借用其他类对象的方法函数来完成任务或数据通信的功能

我们在编写pthon代码时,模块间的数据通信主要采用以下几种方法:1、采用全局变量。所有模块都通过引用全局变量,通过本模块对此全局变量数据的修改值,其他模块也能访问并得到此全局变量的当前值,由于全局变量的不可控性…

linux 部署 flink 1.15.1 并提交作业

下载 1.15.1 https://flink.apache.org/downloads.html#apache-flink-1151 部署模式分类 会话模式应用模式单作业模式 1、会话模式 先启动一个集群,保持一个会话,然后通过客户端提交作业,所有作业都在一个会话执行; 会话模式适合规…

Redis数据量过大的隐患:查询会变慢吗?如何避免?

一、Redis数据过多引发的五大隐患(附系统交互图) #mermaid-svg-X83bpHUu830QXKUt {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-X83bpHUu830QXKUt .error-icon{fill:#552222;}#mermaid-svg-…

网络与信息安全有哪些岗位:(3)安全运维工程师

安全运维工程师是企业安全防线的 “日常守护者”,既要确保安全设备与系统的稳定运行,又要实时监控潜在威胁,快速响应并处置安全事件,是连接安全技术与业务运营的关键角色。其核心价值在于通过常态化运维,将安全风险控制…

鱼皮项目简易版 RPC 框架开发(三)

本文为笔者阅读鱼皮的项目 《简易版 RPC 框架开发》的笔记,如果有时间可以直接去看原文, 1. 简易版 RPC 框架开发 前面的内容可以笔者的前面两个篇笔记 鱼皮项目简易版 RPC 框架开发(一) 鱼皮项目简易版 RPC 框架开发(…

嵌入式Linux:注册线程清理处理函数

在 Linux 多线程编程中,线程终止时可以执行特定的清理操作,通过注册线程清理函数(thread cleanup handler)来实现。这类似于使用 atexit() 注册进程终止处理函数。线程清理函数用于在线程退出时执行一些资源释放或清理工作&#x…

【Git】Linux-ubuntu 22.04 初步认识 -> 安装 -> 基础操作

文章目录Git 初识Git 安装Linux-centosLinux-ubuntuWindowsGit 基本操作配置 Git认识工作区、暂存区、版本库添加文件 -- 场景一查看 .git 文件添加文件 -- 场景二修改文件版本回退撤销修改情况一:对于工作区的代码,还没有 add情况二:已经 ad…