探索共享内存:解锁并发编程的潜力

文章目录

  • 序言
  • shm 原理
  • 对shm的理解
  • 通过代码认识shm
  • 调用shmget方法实现

序言

system V版本
指定的一种规则(俗话说一流公司定规则,二流公司重服务,三流公司重技术).这个规则虽然有很多种(消息队列,共享内存等只是比较出名的几个).但是在内核的相关技术解决上是类似的,因为都是基于同一套标准

shm 原理

它是进程间通信的前提,必须让不同的进程看到同一份资源(这份资源由OS提供)

以父进程创建子进程为例:
在这里插入图片描述

对shm的理解

上述两个进程被加载进内存,共享同一块内存
但实际内存中,并不只存在这一对父子进程,还有其他的进程也有共享内存,所以在OS中会存在一张共享内存管理表
对上述内容的理解:
1.往后对共享内存的管理就变成了对数据结构的增删查改
在这里插入图片描述

2.共享内存具有唯一的标识,来保证第二个参与共享内存的进程看到的就是期望的那个共享内存---->怎么确定这个标识?怎么给另一个进程?
1.实现一个共享内存创建
利用shmget()函数实现在这里插入图片描述这个第一个参数类型,第一个参数代表什么意思呢?

ftok函数约定生成一个key_t的数,key_t本质是int

shmflg 即能创建,又能获取:
提供两个宏
IPC_CREAT:shm不存在,就创建,存在就获取并返回,只是读取设置0也可以(一般用于获取)
IPC_EXCL:不单独使用
IPC_EXCL | IPC_CREAT:shm 不存在就创建,存在就出错返回(一般用于创建)(主要是保证创建的共享内存是全新的)

2.识别给另一个进程 at—>attach
在这里插入图片描述

3.去掉进程的共享内存关联dt —> detach
在这里插入图片描述
页表映射部分的函数
通过页表将虚拟地址空间和物理内存的共享区进行映射

这个函数的第二个参数:

指定虚拟内存地址,但是不了解实际使用情况,所以一般为NULL

第三个参数:

不深究(实际表示写还是读,但是由权限码来控制),设为0即可

应用:

在这里插入图片描述运行查看结果:
在这里插入图片描述在sleep(5)看到了这个共享内存被server这个程序使用,所以被使用的进程数为1
当sleep结束后,程序退出,被调用进程数量就回到了0

怎么去掉这个关联的共享内存(本质就是修改页表)?
参数就是shmat的那个返回值
在这里插入图片描述
去除关联
从进程的地址空间中删除
此外,这个函数的返回值是返回一段地址空间,类似malloc的返回值

4.控制这个接口(改和查)

在这里插入图片描述
cmd参数:要做哪方面的控制,他提供了几个宏,其中使用演示:IPC_RMID(删除)
struct shmid_ds *buf参数:是OS的共享内存结构返回给上层用户的一个struct,暂时不用,设置为0

在这里插入图片描述

通过代码认识shm

通过写代码的认识共享内存

所有的 进程间通信,只有匿名管道是只允许血缘关系的进程间通信,其他进程间通信都是两个不相干进程间就能实现通信

首先两个进程之间怎么找到这个共享内存?

约定一个数字假设是1234,将这个1234在创建共享内存时就加载到struct shm结构体当中,未来要找这个共享内存只需要找这个对应的数字即可
这个数字可能与系统的共享内存的数字 冲突,所以利用内置的算法函数生成一个较低概率的数字

在这里插入图片描述ftok的演示结果
在这里插入图片描述
以下是源码:
在这里插入图片描述在这里插入图片描述
这个key是自己约定出来的

调用shmget方法实现

1.开辟共享内存,2.将shmid存入结构体内
在这里插入图片描述
结果:
在这里插入图片描述

可以看到不存在就创建全新的共享内存,存在就出错返回,(client,server里面是生成同一个shmid)
使用ipcs -m查看创建的共享内存

在这里插入图片描述
结论:

共享内存(IPC资源)的生命周期是随内核的

如何进行删除共享内存?

首先理解一下shmid和key的区别?
key只用来标识共享内存的唯一性
shmid用来操作这个共享内存
删除共享内存:
ipcrm -m shmid号

在这里插入图片描述
转16进制的方法:
在这里插入图片描述

sizeof(buf)用于限制 snprintf 函数写入数据的最大长度,以保证程序的安全性

cliet.cc
在这里插入图片描述
server.cc
在这里插入图片描述
两个进程如何知道他们在访问同一块内存?在命名管道是通过绝对路径看到同一份资源,在共享内存时通过key看到同一份资源
特殊性:共享内存没有同步机制,
由用户自己提供同步机制,(以前学过的管道实现)
server部分:
创建管道,打开管道,从管道读取
client:
打开管道,向管道内写入
在这里插入图片描述
如何,移除共享内存中的内容
对于共享内存中的数据,不需要进行实际的删除,让读的数据读完向后走,不在再能访问这个位置,就当是删除了
在这里插入图片描述
调整代码实现退出客户端和服务端后删除共享内存
unlink删除指定的文件:

在这里插入图片描述
共享内存的特点:

1.共享内存是裸露给所有的使用者的,一定要注意安全问题
2.共享内存是所有进程间通信最快的方式
3.共享内存可以提供较大的空间

在这里插入图片描述
场景应用,共享内存相比较管道,少了几次拷贝?

首先数据会进入管道,通过write函数进入管道,再从管道通过read函数进入目标进程的缓冲区.
而共享内存会省去这两步,直接通过A—>共享内存---->B的过程

IPC_STAT的使用

创建关联的时间戳

能获取这个属性,意味着一定维护(描述)了这个共享内存
即:为什么能找到同一块共享内存,他们被OS所维护

创作不易,有用请观众姥爷来个三连支持一下~~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/619282.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

吴恩达 深度学习 神经网络 softmax adam 交叉验证

神经网络中的层:输入层(layer 0)、隐藏层、卷积层(看情况用这个)、输出层。(参考文章) 激活函数: 隐藏层一般用relu函数; 输出层根据需要,二分类用sigmoid&…

Selenium 自动化 —— 一篇文章彻底搞懂XPath

更多关于Selenium的知识请访问“兰亭序咖啡”的专栏:专栏《Selenium 从入门到精通》 文章目录 前言 一、什么是xpath? 二、XPath 节点 三. 节点的关系 1. 父(Parent) 2. 子(Children) 3. 同胞(S…

[Algorithm][回溯][全排列][子集] + 回溯原理 详细讲解

目录 0.原理讲解1.全排列1.题目链接2.算法原理详解3.代码实现 2.子集1.题目链接2.算法原理详解3.代码实现 0.原理讲解 回溯算法通常⽤于解决组合问题、排列问题和搜索问题等回溯算法的基本思想: 从⼀个初始状态开始,按照⼀定的规则向前搜索,…

怎么下载抖音直播视频 怎么解析直播间链接的视频录制保存

尊敬的读者们,你们好!今天我们将探讨一个非常实用的技巧——如何下载直播视频。随着网络技术的发展,直播视频已经成为我们日常生活中不可或缺的一部分。无论是观看比赛、欣赏音乐会还是探索新的美食,直播视频都为我们提供了更直观…

【qt】最快的开发界面效率——混合编程

混合编程 一.准备工作1.创建项目2.添加项目资源 二.ui界面设计1.menuBar菜单栏2.action ▲3.toolBar工具栏4.中心组件 三.代码界面设计1.toolBar添加组件2.statusBar状态栏添加组件 四.完成界面的功能1.对action配置信号槽2.对action转到信号槽3.代码添加的组件手动关联槽函数 …

YOLOv8+CLIP实现图文特征匹配

本文通过结合YOLOv8s的高效物体检测能力与CLIP的先进图像-文本匹配技术,展示了深度学习在处理和分析复杂多模态数据中的潜力。这种技术的应用不仅限于学术研究,还能广泛应用于工业、商业和日常技术产品中,以实现更智能的人机交互和信息处理。…

第四届微调——炼丹

学习地址:Tutorial/xtuner/README.md at main InternLM/Tutorial GitHub 笔记 微调是一种在已有的预训练模型基础上,通过使用新的数据对模型进行进一步优化和调整的技术手段。它的目的是使模型能够更好地适应特定的应用场景和任务需求,进一…

IDEA切换分支

方法一 1、选择要切换分支的module 2、右键,选择git 3、再点击branches 4、可以看到当前module的本地分支(local Branches)及远程分支(Remote Branches)列表。点击你要切换到的分支,Checkout即可。 方法二 1、点击…

MFC编程之设计美丽的对话框

目录 写在前面: Part 1:美美的设计一下计算器的布局 1.描述文字: ​编辑 2.ID: Part 2:美美熟悉一下计算器的工作流程 Part 3:美美设计一下控件功能 1.edit control: 2.相关变量初始化&…

Copilot for Microsoft 365 扩充新增 16 种语言

最近,微软公司发布公告,进一步扩大 Copilot for Microsoft 365 语言支持,新增 16 种,支持的语言总数达到 25 种。 新支持的语言如下: 阿拉伯语 捷克语 丹麦语 荷兰语 芬兰语 希伯来语 匈牙利语 韩语 挪威语&am…

Java面试之分布式篇

分布式锁的实现方案 (1)用数据库实现分布式锁比较简单,就是创建一张锁表,数据库对字段作唯一性约束。加锁的时候,在锁表中增加一条记录即可;释放锁的时候删除锁记录就行。如果有并发请求同时提交到数据库&…

二分判定+选插冒排序+归并快速堆希尔+计数排序

二分力扣题 一&#xff1a;搜索二维矩阵 74. 搜索二维矩阵 按照题意&#xff1a;直接利用二维数组转换成一维数组进行求解 方法一&#xff1a;普通等于的二分查找 class Solution { public:bool searchMatrix(vector<vector<int>>& matrix, int target) {t…

Shell编程之循环语甸与函数

for 遍历循环 1&#xff09;for 变量 in 取值列表 for i in $(seq 1 10) do 命令序列 .... done 2&#xff09;for ((变量初始值; 变量范围; 变量的迭代方式)) for ((i1; i<10; i)) do 命令序列 .... done IFS for循环取值列表分隔符 set | grep IFS …

SSH常用功能介绍-高级功能

一、介绍 SSH&#xff08;Secure Shell&#xff09;是一种用于远程登录和执行命令的网络协议&#xff0c;它提供了加密的连接&#xff0c;保证了数据的安全性。除了基本的远程登录功能外&#xff0c;SSH还提供了许多高级功能&#xff0c;以下是一些常用的高级功能介绍&#xf…

Redis集群安装

将Redis安装包分别上传到3个文件夹&#xff0c;并解压缩 #编译并指定安装目录 cd /root/usr/local/redis-cluster/redis-7001/redis-6.2.6/ make make PREFIX/root/usr/local/redis-cluster/redis-7001 install # cd /root/usr/local/redis-cluster/redis-7002/redis-6.2.6/ m…

FreeRTOS二值信号量

目录 一、信号量的概念 1、信号量的基本概念 2、信号量的分类 二、二值信号量简介 三、二值信号量相关API 1、创建二值信号量 2、释放二值信号量 3、获取二值信号量 四、二值信号量实操 1、实验需求 2、CubeMX配置 3、代码实现 一、信号量的概念 1、信号量的基本概…

使用 CloudFlare 后如何才能不影响搜索引擎蜘蛛爬虫

今天,明月给大家再次详细讲解一下,明月在使用 CloudFlare 后如何才能不影响搜索引擎蜘蛛爬虫对站点的抓取,因为这是很多首次使用 CloudFlare 的站长们容易忽略和触犯的问题,并不是 CloudFlare 不友好,而是 CloudFlare 的防火墙(WAF)实在是太给力。其实在【CloudFlare 如…

IDEA及Maven配置代理及Maven中央仓库配置详解

一、配置代理 首先&#xff0c;需要本地开启代理入口&#xff0c;如图。 这个跟你使用代理软件有关。像我使用的是qv2ray。 其次&#xff0c;idea配置代理&#xff0c;如图。 1.1 idea配置代理 打开Settings&#xff0c;如图 1.2 maven配置代理 maven配置代理&#xff0c;修…

2024湖南理工学院程序设计竞赛(同步赛) G. 区间递减(思维题 分类讨论 ST表)

题目 https://ac.nowcoder.com/acm/contest/82672/G 思路来源 出题人 涼風青葉7代码 题解 注意到三种情况即可&#xff0c; 第一种情况&#xff0c;10 9 8 1 2&#xff0c;保留1 第二种情况&#xff0c;6 5 10 9 4 4&#xff0c;保留5 4 4 第三种情况&#xff0c;6 5 4&…

基于Springboot的校园疫情防控管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的校园疫情防控管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系…