进程间通信 之 共享内存

news2024/11/30 10:55:11

目录

什么是共享内存?

共享内存的系统调用接口

共享内存


进程间通信的本质及前提:让不同的进程看到同一份资源!

共享内存区是最快的IPC形式。一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据。

什么是共享内存?

一个 进程 A 通过系统调用 shmget 在物理内存中开辟一块空间,并通过页表映射到进程地址空间中,其他的进程也通过调用 shmget,并设置不同参数,就可以实现在物理内存中找到 进程 A 开辟的空间,并将这块空间通过页表映射到自己的进程地址空间中。自此,这多个进程通过访问自己的进程地址空间,就可以访问这块物理内存中的空间,也就实现了让不同的进程看到同一份代码!

那么其他进程是如何做到可以找到进程 A 创建的共享内存的呢?

因为操作系统中一定会允许存在多个共享内存,所以操作系统也要对这些共享内存做管理,因此一定会有描述这些共享内存的结构体,而每个独一的共享内存都会有一个标识 key,这也是创建和寻找它的唯一标志,这个 key 参数会在 shmget 调用中使用。所以其他的进程只需要在访问共享内存的时候使用 key,就能找到进程 A 当时创建的共享内存,进而进行访问。

共享内存的系统调用接口

shmget 接口:创建/获取共享内存

int shmget(key_t key, size_t size, int shmflg);

 一个随机并不重复的 key 值可以通过 ftok 接口产生

size 是需要创建的共享内存的大小,shmflg 创建/获取共享内存时传入的标志位。

其中,参数shmflg可以为 IPC_CREAT 和 IPC_EXCL || IPC_CREAT 

  • IPC_CREAT:shm 如果不存在,就创建,如果存在,就获取!通常用于获取时用。
  • IPC_EXCL || IPC_CREAT:shm 如果不存在就创建,如果存在就出错返回,这样可以保证创建的共享内存是全新的!通常用于创建时用。IPC_EXCL 不能单独使用。

创建共享内存 

int shmid = shmget(key, 4096, IPC_EXCL || IPC_CREAT);

获取共享内存: 

 

int shmid = shmget(key, 4096, IPC_CREAT);

如图,创建/获取 共享内存的工作就完成了。

shmat 接口:将共享内存映射到进程地址空间中

void *shmat(int shmid, const void *shmaddr, int shmflg);

这个接口有点像C语言中的 malloc 函数,都是在进程地址空间中申请一块空间,并返回 void* 类型的指向对应空间的指针,如果要这块内存的话,就需要将 void* 强转为对应数据类型的指针。

其中,shmaddr 参数是映射到地址空间中的地址,可以自己设置,也可以直接传 nullptr,操作系统会自动分配空间。

shmflg 原理与 shmget 是相同的,这里直接用 0 就行!

shmdt 接口:将共享内存从进程地址空间中移除

int shmdt(const void *shmaddr);

这个接口的使用比较简单,只需要将上一步得到的共享内存在进程地址空间中的起始地址作为参数传给 shmdt 即可将共享内存从进程地址中移除!

shmdt(s);

 shmctl接口:销毁共享内存

int shmctl(int shmid, int cmd, struct shmid_ds *buf);

查看当前共享内存的信息 

ipcs -m

在此之后,就可以在不同进程中访问共享内存中的空间,进而达到通信的目的! 

共享内存

共享内存是进程间通信速度最快的,并且可以提供较大的空间,但共享内存不会提供同步机制,里面的信息是直接裸露给所有使用者的,因此也必须注意共享内存的数据安全问题。

共享内存相对于管道通信不会涉及大量的数据拷贝工作,是一个比较高效的进程间通信模式。

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

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

相关文章

鸿蒙开发实战:【网络管理-Socket连接】

介绍 本示例主要演示了Socket在网络通信方面的应用,展示了Socket在两端设备的连接验证、聊天通信方面的应用。 效果预览 使用说明 1.打开应用,点击用户文本框选择要登录的用户,并输入另一个设备的IP地址,点击确定按钮进入已登录…

【毛毛讲书】【好运】为什么有些人天生就有好运眷顾?

重磅专栏推荐: 《大模型AIGC》 《课程大纲》 《知识星球》 本专栏致力于探索和讨论当今最前沿的技术趋势和应用领域,包括但不限于ChatGPT和Stable Diffusion等。我们将深入研究大型模型的开发和应用,以及与之相关的人工智能生成内容&#xff…

什么是web组态?Web组态软件哪个好用?

随着工业4.0的到来,物联网、大数据、人工智能等技术的融合应用,使得工业领域正在经历一场深刻的变革。在这个过程中,Web组态技术以其独特的优势,正在逐渐受到越来越多企业的关注和认可。那么,什么是Web组态&#xff1f…

轻巧的elasticsearch可视化工具

一、概述 常见的ES可视化工具有: kibanaelasticsearch-headElasticHDDejavucerebroelasticview 一、安装elasticview 在众多ES可视化龚居中,elasticview是一款比较轻量简洁,兼容性较好,可以兼容多个ES版本,不但可以进…

[蓝桥杯 2020 省 AB3] 限高杆

分层图建图典题 #include<bits/stdc.h> using namespace std; using ll long long; #define int long long const int N 6e510; const int inf 0x3f3f3f3f; const int mod 1e97; int e[N],ne[N],w[N],h[N],idx; void add(int a,int b,int c){e[idx] b,ne[idx] h[a]…

外键约束

目录 外键约束 对数据表进行初期设计&#xff0c;暂时不使用外键 验证限制三 验证级联删除 设置级联更新 Oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/135209645 外键约束 外键约束主要是在父子表关系中体现的一种约束操作。…

【二叉树】算法例题

目录 九、二叉树 68. 二叉树的最大深度 ① 69. 相同的树 ① √ 70. 翻转二叉树 ① 71. 对称二叉树 ① 72. 从前序与中序遍历序列构造二叉树 ② 73. 从中序与后续遍历序列构造二叉树 ② 74. 填充每个节点的下一个右侧节点指针 II ② 75. 二叉树展开为链表 ② 76.…

鸿蒙实战开发:【FaultLoggerd组件】讲解

简介 Faultloggerd部件是OpenHarmony中C/C运行时崩溃临时日志的生成及管理模块。面向基于 Rust 开发的部件&#xff0c;Faultloggerd 提供了Rust Panic故障日志生成能力。系统开发者可以在预设的路径下找到故障日志&#xff0c;定位相关问题。 架构 Native InnerKits 接口 Si…

Marin说PCB之电源完整性之直流压降仿真CST--03

本期内容主要讲解的是关于在CST软件上电源直流压降仿真VRM的一些相关参数设置&#xff0c;小编我在之前文章中有说到过如何利用CST仿真电源信号的直流压降&#xff0c;不过有一些问题我这边再去补充一些。 首先就是VRM芯片的设置了&#xff0c;小编我还是按照之前那样设置&…

腾讯云k8s容器服务

1、新建一个集群 这个网址&#xff1a; 登录登录 - 腾讯云 2、选择第一个 3、名字随便起一个&#xff0c;然后基本默认就行 4、 组件配置直接跳过&#xff0c;信息确认&#xff0c;等待集群初始化&#xff0c;等10分钟左右&#xff08;容器服务需要充点钱才行&#xff09; 5…

学习vue3第八节(自定义指令 directive)

1、自定义指令的作用&#xff1a; 自定义指令是用来操作底层DOM的&#xff0c;尽管vue推崇数据驱动视图的理念&#xff0c;但并非所有情况都适合数据驱动。自定义指令就是一种有效的补充和拓展&#xff0c;不仅仅可用于定义任何DOM操作&#xff0c;并且是可以重复使用。 自定义…

杨氏矩阵的查找(复杂度<O(N))

题目&#xff1a; 解释&#xff1a;时间复杂度小于O(N)即不要一个一个的去遍历查找。 思路&#xff1a; 一个33的二维数组如图所示&#xff1a; 一&#xff1a;先找到一个最关键的数字&#xff0c;3&#xff08;下标为0,2&#xff09; 关键数的关键之处在于&#xff08;处于…

过拟合欠拟合

问题&#xff1a;训练数据训练的很好啊&#xff0c;误差也不大&#xff0c;为什么在测试集上面有问题呢&#xff1f; 当算法在某个数据集当中出现这种情况&#xff0c;可能就出现了过拟合现象。 1、 什么是过拟合与欠拟合 欠拟合 过拟合 分析第一种情况&#xff1a;因为机器…

[Python人工智能] 四十三.命名实体识别 (4)利用bert4keras构建Bert+BiLSTM-CRF实体识别模型

从本专栏开始,作者正式研究Python深度学习、神经网络及人工智能相关知识。前文讲解如何实现中文命名实体识别研究,构建BiGRU-CRF模型实现。这篇文章将继续以中文语料为主,介绍融合Bert的实体识别研究,使用bert4keras和kears包来构建Bert+BiLSTM-CRF模型。然而,该代码最终结…

Linux用户、用户组

用户管理命令&#xff1a; 首先要先知道两个配置文件&#xff1a;/etc/group 用户组配置文件/etc/passwd 保存了所有用户的用于读取的必要信息**/etc/shadow **是 Linux 系统中用于存储用户密码信息的文件。这个文件也被称为“影子文件”&#xff0c;因为它包含了 /etc/passwd…

Unity发布webgl设置占满浏览器运行

Unity发布webgl设置占满浏览器运行 Unity发布webgl的时候index.html的模板文件 模板文件路径&#xff0c;根据自己的需求修改。 C:\Program Files\Unity\Hub\Editor\2021.1.18f1c1\Editor\Data\PlaybackEngines\WebGLSupport\BuildTools\WebGLTemplates\Default再桌面新建一个t…

chatgpt大模型基础学习

chatgpt大模型基础学习 1. 吴恩达提示工程2. 大模型说的token是什么 1. 吴恩达提示工程 知乎 https://zhuanlan.zhihu.com/p/626290417?utm_id0 中文版 https://mp.weixin.qq.com/s?__bizMzkwMjQ5MzExMg&mid2247483714&idx1&sn5e905f5ec6196f6dc2187db2a8618f02&…

Jmeter接口测试,一篇足矣。

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号&#xff1a;互联网杂货铺&#xff0c;回复1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 现在对测试人员的要求越来越高&#xff0c;不仅仅要做好…

使用强森算法求任意两点之间最短路径

对于强森算法的算法思想,如果给定的图中是没有负数的边,那么就可以使用迪杰斯特拉算法来进行遍历每个节点,找到它与其他节点的最短路径,而如果给定的图中是存在负数的边,但是不存在负数的环的时候,那么就可以使用算法对边长做一些修改并且可以准确的找到给定的两个节点之…

各种窗函数对脉压结果的影响

雷达导论专栏总目录链接: 雷达导论专栏总目录-CSDN博客 1. 各类窗函数 有几个窗函数的系数可配,配置如下: tukeywin(N,0.75)kaiser(N,2.5)gausswin(N,1.5)taylorwin(N,3,-24)2. 时域加窗 时域加窗时,直接加在匹配滤波函数上:Htw=exp(1j*pi*K*tp.^2).*win;。那么矩形窗就相…