什么是行业网站?/营业推广的目标通常是

什么是行业网站?,营业推广的目标通常是,番禺网站制作设计,做冻品的网站目录 共享内存的原理 共享内存的创建 代码实现创建 共享内存的管理指令 我们今天来学习共享内存!!! 共享内存的原理 两个进程同时使用内存中开辟的共享空间进行通信就是建立并使用共享内存进行进程间的通信。System V 共享内存&#xf…

目录

共享内存的原理

共享内存的创建

代码实现创建

共享内存的管理指令


我们今天来学习共享内存!!!

共享内存的原理

两个进程同时使用内存中开辟的共享空间进行通信就是建立并使用共享内存进行进程间的通信。System V 共享内存(Shared Memory)允许不同的进程共享一块内存区域。

那它和命名管道有什么区别呢?

所以共享内存不是文件,这个本质区别!!!

接下来我们讲一下共享内存通信的原理:

两个进程通过各自的mm_struct和页表的映射,映射到各自的物理内存上的一块空间形成物理地址(空间的头地址),那两个进程要进行通信就需要同一个共享内存,所以为了实现通信,内存创建一个共享内存(本质不是由操作系统创建,应该是其中一个进程要求然后自己先创建了),我们暂且任务需要OS创建,这个共同的内存通过页表映射到各自进程的虚表的共享区然后这个过程叫挂接到进程的地址空间中,解除共享状态就是去关联。管道如果只读打开的话会卡在创建管道的之前,而共享内存就没有这个问题。

共享内存的创建

使用shmget函数创建共享内存空间。

作为一个系统函数,三个参数,我们先看返回值以及参数说明吧。

size就是设置共享内存的字节大小,shmfig就是创建这个共享内存的创建标志,这个参数只能有以下三种传递方式:

前面这个key,类型就是这样的,这个是用来标志共享内存的唯一标识符,这个一般是用户自己传进去的,也就是进程创建时自己提供,为什么不能操作系统直接提供呢?

共享内存在任何时刻可以在OS内部存在多个,那么个的共享内存操作系统肯定是需要管理的,怎么管理呢先描述再组织,又是这句话,共享内存=共享内存的内核数据结构+内存块,操作系统将这个struct shm加载到操作系统中时,如果自行创建key那进程A进来创建共享内存得到操作系统的key,进程B要与之通信,可是如果此时进程B还没有创建怎么办,A和B毫不相干,这样进程B进入操作系统就不知道key值不知道要访问哪个共享内存了,如果这个是由jincA创建的key那到时候A只需要将其放在AB的共享区(都能看到的区域)这样B就可以看到了!!!这个A创建的过程本质还是让不同的进程看到同一份资源。

这个key值是随便创建的吗,A进程随便给key不会和其他进程冲突吗,会,所以操作系统认为你既然自己创建不好,我就自己提供一个函数创建一个key给你用。

ftok 是一个 System V IPC 中的函数,用于根据指定的路径名和一个项目ID(通常是一个字符)生成一个唯一的键值(key_t)。这个键值通常用于共享内存、消息队列或信号量等 IPC 资源的标识符。

ftok根据你传入的公共路径(会被解析成数字)和公共项目的ID进行联合根据某种算法得出唯一key值

这种算法得出的key值原则上还是会有极小概率的冲突,可以忽略不计的,就是比自己创建准。

代码实现创建

依旧是创建两个进程和之前一样,然后都可访问公共头文件comm.hpp,makefile里面就是能同时编译两个.cc,和上一篇博客里面写的一样的。

我们得先创建一个key,所以先使用ftok进行创建,默认server.cc里面进行创建,然后知道了公共路径和id就知道了key,这个公共路径是随便起的自己系统里有这个路径就行,id也是随便起的,我们这里使用16进制数,所以将公共路径和id写入公共.hpp让两个进程都可以看到。

我们这个key值非常大,并且由于路径和id一致所以没次运行都是一样的。

那光有key不行呀,我们是不是还要判断创建key成功了没有,并且有了key之后就可以创建shm了对吧,创建共享内存的地点还是在server,不过创建多大字节的空间就需要公共出来。

由于每次创建的都是最新的,已经存在了共享内存就会报错!!!

这个我们的使用代码进行创建的流程就完了,至于实现通信就是下节课的事了,由上面可以看到第一次运行了之后由于server进程结束就退出了,但是第二次运行时那个共享空间还在内核里面,所以共享内存的生命周期是不随单个进程的,而是随着操作系统的生命周期,所以要销毁管道只能是将两个互通的进程都关掉然后操作系统认为这个内存没有意义了,就自己释放了,这个过程属于用户让操作系统释放,方法2是让OS自己重启,make clean是代码层面的释放,我们还可以使用指令创建,释放。

共享内存的管理指令

ipcs指令可以看到各自通信模式,有消息队列,共享内存和管道,由于我们之前没有释放共享内存所以就显示有一个,

nattch是该共享内存的附加进程数,就是有多少个进程在进行通信,当 nattch == 0 时,意味着当前没有任何进程使用该共享内存,但内存段仍然存在,直到 shmctl(IPC_RMID) 删除它。因为我们只是创建还没有使用所以是0。

ipcs -m选项直接可以看到共享进程。

ipcrm 是 Linux 上的 IPC(进程间通信)资源管理命令,用于删除共享内存、信号量或消息队列。其中,ipcrm -m 用于删除共享内存段

可以看到要删除一个共享内存需要-m之后再指定上可以标志该内存段的ID,就是删除这个指定的内存段,为什么不使用key而使用shmid(shmget的返回值)。

还有一个原因是key也是有可能重复的对吧,即使使用了那种算法。

这个shmid有点像文件描述符对吧,shmid可以指明一个独一的共享内存。

如果我们一直创建共享内存然后删掉,再创建,发现这个shmid从0开始自增到n,n可以等于2.。。。,所以这个shmid就是数组的下标,我们可以认为shmid数组表的下标存放了shmid值,然后内容指向了共享内存,这个结构和文件描述符表是大致一样的,但是文件的是从3开始创建的,所以共享内存这部分和它又有所不同(后面会细讲)。

接着讲指令创建:

shmctl() 是 Linux System V 共享内存管理函数,用于获取共享内存信息、修改权限、删除共享内存等

这个函数的功能有点多,可以用于创建共享内存等等。

就是将指定唯一的shmid的共享内存创建/修改/删除,到底执行哪一种就取决于cmd的传入,这个cmd是像flag有特定传入限制的(有提供不需要自己写),然后如果是创建/修改就需要使用buf,删除填个nullptr就可以了,不关心buf指向的共享内存的信息。

buf指针指向struct shmid_ds这个装有共享内存信息的结构体,用于修改/创建。我就说共享内存空间有类似于PCB的内核数据结构吧。

我们进行函数级的删除,再使用ipcs -m进行追踪。

删除成功!!!

咦不对呀,这个shmctl不是指令呀,怎么写在这里,我后学的这个还不行吗???

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

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

相关文章

3.10[A]cv

核心模块: rasterizer:光栅化器,负责三角形遍历和像素绘制Shader:包含顶点着色器和多种片元着色器Texture:纹理处理模块 顶点着色器的计算量一般远小于片元着色器。因为组成三角形的顶点相对有限,而片元需…

mac使用Homebrew安装miniconda(mac搭建python环境),并在IDEA中集成miniconda环境

一、安装Homebrew mac安装brew 二、使用Homebrew安装miniconda brew search condabrew install miniconda安装完成后的截图: # 查看是否安装成功 brew list环境变量(无需手动配置) 先执行命令看能不能正常返回,如果不能正常…

WWDG窗口看门狗原理

WWDG(窗口看门狗)在窗口期喂狗 作用: 原理: 框图 WWDG寄存器: WWDG_CR控制寄存器 WWDG_CFR配置寄存器 状态寄存器WWDG_SR 超时时间计算公式 最小最大超时值 HAL配置函数: 1. IWDG 和 WWDG 的区别 IWDG&…

无公网IP也能远程控制Windows:Linux rdesktop内网穿透实战

文章目录 前言1. Windows 开启远程桌面2. Linux安装rdesktop工具3. Win安装Cpolar工具4. 配置远程桌面地址5. 远程桌面连接测试6. 设置固定远程地址7. 固定地址连接测试 前言 如今远程办公已经从一种选择变成了许多企业和个人的必修课,而如何在Linux系统上高效地访…

Pygame实现射击鸭子游戏3-2

2 鸭子类Target的创建 2.1 __init__()函数 Target类的__init__()函数代码如图5所示。 图5 __init__()函数代码 其中,第18行将Target类声明为pygame.sprite.Sprite类的子类;第19行代码中,__init__()函数的img_path参数表示鸭子图片的文件名…

五、OpenGL中Shader与C++数据传输

文章目录 一、概述二、Shader 代码文件的基本格式三、Shader的向量语法介绍四、Shader之间的数据传输五、Shader与C的数据传输uniform六、完整示例 一、概述 在 OpenGL 中,Shader(着色器)使用 GLSL(OpenGL Shading Language&…

【3DMAX插件】3DMAX建筑大师插件MasterBuilder使用方法

3DMAX建筑大师插件是一款专为3DMAX设计的程序化(参数化)建筑建模工具,其最大特点是能够一键生成建筑模型,极大地提升了工作效率。该插件配备了多种结构控制选项,涵盖阳台、门窗、栏杆、楼顶水塔等附属建筑元素&#xf…

隐私保护在 Facebook 用户身份验证中的应用

在这个数字化的时代,个人隐私保护成为了公众关注的焦点。社交媒体巨头 Facebook 作为全球最大的社交平台之一,拥有数十亿用户,其在用户身份验证过程中对隐私保护的重视程度直接影响着用户的安全感和信任度。本文将探讨 Facebook 在用户身份验…

Swift Package Manager (SPM) 创建并集成本地库

在macOS 项目中,使用 Swift Package Manager (SPM) 创建并集成本地库的完整步骤。 创建一个macos应用程序,选择 swift、oc、swiftui都可以。 创建好应用之后,开始创建SPM本地库。 打开终端app,进入项目根目录,逐次输…

渗透测试之利用sql拿shell(附完整流程+防御方案)【下】

导读: 时刻保持谦逊,始终保持学习,探寻事物的本质,不要把事情复杂化 话不多说,书接上回 三、利用日志getshell 利用条件: 拥有网站的写入权限知道网站的绝对路径数据库日志开启 实际操作: (1)查看数据库日志是否开启以及路径 show variables like %general%; (2…

【HarmonyOS Next之旅】DevEco Studio使用指南(二)

目录 1 -> 工程模板介绍 2 -> 创建一个新的工程 2.1 -> 创建和配置新工程 2.1.1 -> 创建HarmonyOS工程 2.2.2 -> 创建OpenHarmony工程 1 -> 工程模板介绍 DevEco Studio支持多种品类的应用/元服务开发,预置丰富的工程模板,可以根…

猫耳大型活动提效——组件低代码化

1. 引言 猫耳前端在开发活动的过程中,经历过传统的 pro code 阶段,即活动页面完全由前端开发编码实现,直到 2020 年接入公司内部的低代码活动平台,满足了大部分日常活动的需求,运营可自主配置活动并上线,释…

深度学习系列79:Text2sql调研

参考 https://github.com/topics/text-to-sql 这里是一些资源:https://github.com/eosphoros-ai/Awesome-Text2SQL/blob/main/README.zh.md 这里是综述文章:https://zhuanlan.zhihu.com/p/647249972 1. 数据集 Spider: 一个跨域的复杂text2sql数据集&a…

Linux 系统负载过高的排查思路

技术探讨:Linux系统负载过高的排查思路 在Linux服务器运行过程中,如果系统负载过高,可能会导致性能下降和服务不稳定。以下是针对Linux系统负载过高问题的排查思路和解决方法: 1. 查看系统负载: 使用uptime或top命令查…

【互联网性能指标】QPS/TPS/PV/UV/IP/GMV/DAU/MAU/RPS

📕我是廖志伟,一名Java开发工程师、《Java项目实战——深入理解大型互联网企业通用技术》(基础篇)、(进阶篇)、(架构篇)清华大学出版社签约作家、Java领域优质创作者、CSDN博客专家、…

Java高频面试之集合-08

hello啊,各位观众姥爷们!!!本baby今天来报道了!哈哈哈哈哈嗝🐶 面试官:详细说说CopyOnWriteArrayList CopyOnWriteArrayList 详解 CopyOnWriteArrayList 是 Java 并发包(java.util…

痉挛性斜颈需要做手术吗?

痉挛性斜颈的治疗是一个涉及多种医学知识的话题,让我们从多方面分析这个问题,来谈谈是否需要进行手术。 首先,我们要明确痉挛性斜颈是一种什么疾病。痉挛性斜颈是一种颈部肌肉异常收缩的疾病,可能导致头部持续或间歇性地向一侧旋…

AOT是什么?

https://www.bilibili.com/video/BV1Es4y1q7Bf?spm_id_from333.788.player.switch&vd_source12d5954938d20d50645e227a6a728c76&p87常规的java代码是即时解释执行的,只有热点代码才会提前编译成二进制,并且将java代码放到别的电脑执行时得安装j…

【JavaWeb学习Day23】

Maven高级 分模块设计与开发 分模块设计:将一个大项目分成若干个子模块,方便项目的维护、扩展,也方便模块间的相互引用,资源共享。 策略: 1.策略一:按照功能模块拆分,比如:公共组…

⭐LeetCode周赛 3468. 可行数组的数目——暴力与数学⭐

⭐LeetCode周赛 3468. 可行数组的数目——暴力与数学⭐ 示例 1: 输入:original [1,2,3,4], bounds [[1,2],[2,3],[3,4],[4,5]] 输出:2 解释: 可能的数组为: [1, 2, 3, 4] [2, 3, 4, 5] 示例 2: 输入&…