SystemV

一、共享内存
1、直接原理
进程间通信的本质是:先让不同的进程,看到同一份资源!!
我们要把这句话奉若圭臬一般
到了共享内存了支持双向通信能读也能写,但是一般都是一个读一个写
要想通信先看到同一个份资源,则
OS帮助申请内存,通过页表挂接到进程地址空间中,给应用层返回起始虚拟地址
如果要释放共享内存:先去关联,再释放共享内存

上面的操作都是进程直接做的吗?不是。直接由操作系统来做。
因为不能让进程直接malloc,你这样申请了那这块空间就是你的,会破坏了进程的独立性
所以必须利用系统调用,这样创建出来的共享内存就不属于进程私有的
在这里插入图片描述

操作系统要不要管理所有的共享内存呢??先描述,在组织
内核结构体描述共享内存,就得有结构体,这个共享内存多大,谁申请的,当前几个进程和我关联…
然后把所有的结构体用链表数组管理起来
所以在OS层面上,对共享内存的管理行为,变成对某种数据结构的增删查改

接下来要学习共享内存,要么就应用层面上学,系统调用接口搞懂
往底层学,就要找对应的先描述在组织是怎么做的!

在释放共享内存时,为什么先去关联,再释放共享内存?
因为共享内存的管理属性结构体中同样也维护了这块内存的引用计数,有多少个进程引用了它
万一别的进程还在引用着你难道直接释放吗?不可能
所以利用属性中引用计数,让引用计数–,等引用计数–到0在释放
共享内存的这块物理内存只是单纯保存数据,引用计数放在属性结构体中

2、直接代码
在物理内存中的这块共享内存呢,如果有人创建出来了,别人下一次就不需要再创建了直接获取就行了
也就会有如何创建,如何获取的概念
系统调用接口shmget
在这里插入图片描述

OS中会有很多共享内存,你怎么保证让不同的进程看到同一个共享内存呢??
shmget参数中的key,有进程用这个key创建,你拿着这个key去OS中 的共享内存中去获取,找到了那你们两个不就看到的是同一个内存吗
所以谈谈key:
1.key是一个数字,这个数字是几,不重要。关键在于它必须在内核中具有唯一性,能够让不同的进程进行唯一性标识
2.第一个进程可以通过key创建共享内存,第二个之后的进程,只要拿着同一个key就可以和第一个进程看到同一个共享内存了!
3.对于一个已经创建好的共享内存,key在哪?key在共享内存的描述对象中!
4.第一次创建的时候,必须有一个key了。怎么有?
利用算法ftok来生成一个冲突率小的key
在这里插入图片描述

这个Key值干嘛那么费劲让用户去设置,设置完成还有可能出现冲突,让OS生成一个key行不行?
OS不清楚哪个进程和哪个进程要通信,只有用户最清楚
这个key如果第一次创建共享内存由OS生成,并且我这个进程也拿到了key,但是另一个进程怎么知道对应的共享内存的key是多少呢?那有人说你把这个key传给另一个进程不就行了,可是我们正在解决的就是进程间通信的问题,这不就鸡生蛋,蛋生鸡了吗
所以与其说key由用户自由指定,不如说用户约定的,只要他们两个约定了同一个key,OS有属性Key相同的共享内存,那他们两个进程一定能找到
所以不需要系统随机指定key,因为系统随机不解决把这个key传递给另一个进程的目的,我们通过约定的方式让他们两个形成同一个key。所以必须由用户层下达给OS
pathname 和 proj_id让那几个进程看到,那哪几个进程就能通信!

  1. key —类似----路径---- 唯—

Key vs shmid
在这里插入图片描述
key也就是在创建时用,往后就都不用了,控制共享内存都用shmid
key是给OS用的
共享内存标识符shmid是用户层用它控制共享内存的

现象
创建共享内存的进程退了,可是利用
ipcs -m 查OS共享内存发现 共享内存仍然存在
在这里插入图片描述

说明
共享内存的生命周期是随内核的!
用户不主动关闭,共享内存会一直存在。
除非内核重启(用户释放)
因为你通完信走了,如果关闭了,上面还有数据的话,下次还想用就用不了了。
所以创建好一直存在,你想用就挂接,不用用户直接释放(ipcrm -m)

那释放用key还是shmid呢?
一定是shmid,因为命令行也属于用户层并不属于OS,key是给OS用的

3、共享内存的特性,扩展代码

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

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

相关文章

Lifecyle的原理

1、Lifecycle是典型的观察者模式,被观察者的继承关系如上图所示。 2、LifeCycleRegistry是Lifecycle的子类。 3、观察者通过LifeCycle对象的addObserver注册监听生命周期的变化,通过removeObserver移除监听生命周期的变化。 4、Activity或Fragment的生命…

HDFS的Shell操作

文章目录 一、HDFS的Shell介绍二、了解HDFS常用Shell命令(一)三种Shell命令方式(二)FileSystem Shell文档(三)常用HDFS的Shell命令 三、HDFS常用命令操作实战(一)创建目录&#xff0…

深度学习之基于Pytorch的昆虫分类识别系统

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介系统架构技术亮点 二、功能三、系统四. 总结 一项目简介 # 深度学习基于 Pytorch 的昆虫分类识别系统介绍 深度学习在图像分类领域取得了显著的成就&#…

windows上 adb devices有设备 wsl上没有

终于解决了!!!! TAT,尝试了很多种办法。 比如WSL中的adb和Windows中的adb版本必须一致,一致也没用,比如使用 ln 建立链接也没用。 这个解决办法的前提是windows中的abd是好用的。 ●在windows…

计算机显示msvcp140.dll丢失的解决方法,实测有效的5个方法分享

在日常的电脑操作中,常常遭遇某些错误讯息,如“缺少xxx.dll文件”,这些dll文件即为动态链接库文件,内含诸多可执行的程序码及数据。当启动某款应用时,系统将会自动调用与其相关的dll文件,其中msvcp140.dll便…

pycharm 控制台中文乱码处理

今天使用pycharm,发现控制台输出又中文乱码了,看网上很多资料说把编码改为UTF-8,设置为并未生效,特此在此记录下本地设置。 1. 修改文件编码:Setting -> Editor ->File Encodings,修改配置如下: 2. …

深入了解Java 8 新特性:Stream流的实践应用(一)

阅读建议 嗨,伙计!刷到这篇文章咱们就是有缘人,在阅读这篇文章前我有一些建议: 本篇文章大概一万多字,预计阅读时间长需要10分钟(不要害怕字数过多,其中有一大部分是示例代码,读起…

Kotlin 核心语法,为什么选择Kotlin ?

Kotlin 是一个基于 JVM 的新的编程语言,由 JetBrains 开发。与Java相比,Kotlin的语法更简洁、更具表达性,而且提供了更多的特性。 Kotlin是使用Java开发者的思维被创建的,Intellij作为它主要的开发IDE。对于 Android开发者&#…

用百度AI大模型给头像换风格

心血来潮想尝试尝试AI小应用,给图片加个风格(例如微信头像),于是有了这篇简短的教程 目录 1. 领取免费资源2. 在应用列表创建应用3. 在线API调试4. 效果对比 1. 领取免费资源 网站:百度智能云 百度给提供了很多AIGC的…

手搓js轮播图_JavaScript进阶

手搓js轮播图 逻辑解析html结构图片切换方法圆点导航切换效果左右箭头点击切换圆点导航点击切换自动播放,介入暂停 完整代码 逻辑解析 css的样式我就不再进行讲述,如果有需求可以评论区告诉我,我再出一篇文章进行详细讲解 js轮播图最主要的核…

执行npm的时候报权限问题的解决方案

我们在执行npm操作的过程中,会出现以下权限问题,解决方案: 管理员身份 运行cmd 切换目录到要执行命令的文件下 再进行npm操作即可

openGauss学习笔记-129 openGauss 数据库管理-参数设置-查看参数值

文章目录 openGauss学习笔记-129 openGauss 数据库管理-参数设置-查看参数值129.1 操作步骤129.2 示例 openGauss学习笔记-129 openGauss 数据库管理-参数设置-查看参数值 openGauss安装后,有一套默认的运行参数,为了使openGauss与业务的配合度更高&…

轿车5+1汽车变速器变速箱同步器操纵机构机械结构设计CAD汽车工程

wx供重浩:创享日记 对话框发送:汽车变速器 获取完整论文报告说明书工程源文件 变速器工程图 操纵机构3D图 一、机械式变速器的概述及其方案的确定 1.1 变速器的功用和要求 变速器的功用是根据汽车在不同的行驶条件下提出的要求,改变发动机…

【paddlepaddle】

安装paddlepaddle 报错 ImportError: /home/ubuntu/miniconda3/envs/paddle_gan/bin/../lib/libstdc.so.6: version GLIBCXX_3.4.30 not found (required by /home/ubuntu/miniconda3/envs/paddle_gan/lib/python3.8/site-packages/paddle/fluid/libpaddle.so) 替换 /home/ubu…

【日常总结】Swagger-ui 导入 showdoc (优雅升级Swagger 2 升至 3.0)

一、场景 环境: 二、存在问题 三、解决方案 四、实战 - Swagger 2 升至 3.0 (Open API 3.0) Stage 1:引入Maven依赖 Stage 2:Swagger 配置类 Stage 3:访问 Swagger 3.0 Stage 4:获取 js…

使用sonar对webgoat进行静态扫描

安装sonar并配置 docker安装sonarqube,sonarQube静态代码扫描 - Joson6350 - 博客园 (cnblogs.com) 对webgoat进行sonar扫描 扫描结果 bugs Change this condition so that it does not always evaluate to "false" 意思是这里的else if语句不会执行…

3.9-Dockerfile实战

这一节介绍怎么将python程序打包成一个image,然后运行为一个container。 首先,创建/home/python/目录 mkdir /home/python/ 然后创建app.py文件。 vim app.py app.py文件的内容如下: from flask import Flaskapp Flask(__name__)app.route(…

【Linux】 find命令使用

find find命令是一种通过条件匹配在指定目录下查找对应文件或者目录的工具。匹配的条件可以是文件名称、类型、大小、权限属性、时间戳等。find命令还可以配合相关命令对匹配到的文件作出后续处理。 语法 find [路径...] [表达式] [path...]为需要查找文件所指定的路径。如果…

linux 开发板以太网通过Ubuntu上外网方法

在开发板嵌入式设备,有一个mgbe网卡,用网线与连接soc的网卡,和外接网卡,将网卡usb接口插入电脑,选择接入到Ubuntu系统 在Ubuntu将能识别到这个外接网卡,这样就可以通过Ubuntu和soc通讯了, 如下…