【Linux】进程间通信——共享内存

文章目录

    • 共享内存的概要
    • 创建共享内存
      • shmget()参数key
      • shmget()参数size
      • shmget()参数shmflg
    • 删除共享内存
    • 挂载共享内存
    • 去关联

共享内存的概要

共享内存允许两个不相关的进程访问同一个逻辑内存。共享内存是在两个正在运行的进程之间传递数据的一种非常有效的方式。不同进程之间共享的内存安排为同一段物理内存。

共享内存是由IPC为进程创建的一个特殊的地址范围,它将出现在该进程的地址空间中。其他进程可以将同一段共享内存连接到它们自己的地址空间中,所有进程都可以访问共享内存中的地址,就好像它们是由用C语言函数malloc()分配的内存一样。如果某个进程向共享内存写入数据,所做的改动将立即影响到可以访问同一段共享内存的任何其他进程。
特别提醒:共享内存并未提供同步机制,也就是说,在第一个进程结束对共享内存的写操作之前,并无自动机制可以阻止第二个进程开始对它进行读取。所以我们通常需要用其他的机制来同步对共享内存的访问,例如信号量。
在这里插入图片描述

在这里插入图片描述

两个进程的PCB各自维护着一个进程地址空间。当两个进程要进行通信时:

操作系统在内存中开辟一个内存块。
通过两个进程的页表,将内存中的内存块映射到两个进程的进程地址空间中。
此时两个进程便建立了连接。
进行通信时,两个进程只需要访问自己的进程地址空间即可,操作系统会通过页表访问内存中的内存块。
所以说,共享内存就是让不同的进程,看到同一块内存块。

所以说,共享内存就是让不同的进程,看到同一块内存块。

在维持通信关系中,还涉及到几个概念:

挂接:将内存中创建好的内存块映射到进程的地址空间中。
去关联:不想通信时,取消进程和内存的映射关系。
注意: 去关联后,共享内存仍然存在,只是和去关联的进程没有了映射关系。

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

创建共享内存

#include <sys/shm.h>
 
void *shmat(int shm_id, const void *shm_addr, int shmflg);
int shmctl(int shm_id, int cmd, struct shmid_ds *buf);
int shmdt(const void *shm_addr);
int shmget(key_t key, size_t size, int shmflg);

shmget()函数用来创建共享内存,它的原型为:

int shmget(key_t key, size_t size, int shmflg);
创建成功返回一个非负整数,即共享内存标识符;失败返回-1。

共享内存多了,就需要有一个标识,让要通信的进程找到正确的共享内存。

shmget()参数key

key值就是共享内存的标识,让想要通信的进程双方看到同一块公共资源。

系统中既然存在很多个共享内存,操作系统势必要将它们管理起来,管理也是使用先描述再组织的方式。因此管理共享内存并不是在管理内存块本身,而是在管理共享内存对应的结构体
在这里插入图片描述
问题又来了,怎么保证这个key值是唯一的呢?

从shmget函数的声明中可以看到,这个key值是我们传给操作系统的,也就是用我们传的key值来标定共享内存。

ftok()函数来生成一个独一无二的key值。
在这里插入图片描述
在这里插入图片描述

shmget()参数size

size是用来指定开辟的共享内存是多大的,以字节为单位。

一般指定的大小是4KB的整数倍。
也可以是任意值。
操作系统在开辟共享内存的时候是以4KB为单位的。每次开辟的共享内存,最小也是4KB的。

假设我们指定4097字节大小的共享内存,但是在内存中实际开辟的共享内存是2*4KB的。
但是在使用的时候只能使用4097字节的空间,剩下的空间用户无法使用,操作系统也不会用,就浪费掉了。

shmget()参数shmflg

这是一个标志位,和之前使用的open用法相似,也是一个int类型的数据,根据比特位不同,用法也不同。

常用的两个选项:

IPC_CREAT:创建共享内存,如果不存在,创建新的,如果存在,获取相关信息。
IPC_EXCL:无法单独使用,必须与其他标志组合使用。
IPC_CREAT | IPC_EXCL:创建共享内存,如果不存在,则创建,如果存在,错误返回。

在这里插入图片描述
在这里插入图片描述

例如:
在语言模型中,编码器和解码器都是由一个个的 Transformer 组件拼接在一起形成的。

删除共享内存

指令:ipcrm -m shimd
功能:删除指定shimd标识的共享内存。

在这里插入图片描述

shmid:获取共享内存后返回的标识符。
cmd:指定控制共享内存的方式。
buf:描述共享内存的数据结构指针。

在这里插入图片描述

挂载共享内存

shmat是让进程和共享内存挂接:这里是引用
shmid:创建共享内存后返回的标识符。
shmaddr:指定共享内存映射到进程地址空间中的地址,一般设置成NULL,让系统自动来设置。
shmflg:不用管它是啥,直接给0。
返回值:共享内存映射到进程地址空间中的地址。不成功返回-1,但是是void*类型的。

在这里插入图片描述
在这里插入图片描述
在运行的时候发现报错了,说我们没有权限,再查看共享内存,发现确实是创建了,但是共享内存的权限是0,也就是我们谁都不能访问。

解决办法就让给共享内存开发相应的权限:
在这里插入图片描述

去关联

shmdt是让进程和共享内存去关联。

在这里插入图片描述

shmaddr:要去关联的共享内存映射在进程地址空间中的起始地址。
返回值:成功返回0,不成功返回-1。

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

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

相关文章

多维时序 | Matlab实现基于VMD-DBO-LSTM、VMD-LSTM、LSTM的多变量时间序列预测

多维时序 | Matlab实现基于VMD-DBO-LSTM、VMD-LSTM、LSTM的多变量时间序列预测 目录 多维时序 | Matlab实现基于VMD-DBO-LSTM、VMD-LSTM、LSTM的多变量时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab实现基于VMD-DBO-LSTM、VMD-LSTM、LSTM的多变量时间…

Eclipse - Formatter

Eclipse - Formatter References Window -> Preferences -> C/C -> Code Style -> Formatter BSD/Allman [built-in] or K& R [built-in] References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

电脑卡住不动了怎么办?三招解救你的电脑!

电脑卡住不动是一种常见的故障&#xff0c;可能会给用户带来困扰。这种情况可能由于多种原因引起&#xff0c;包括软件问题、硬件故障或系统错误。那么&#xff0c;电脑卡住不动了怎么办呢&#xff1f;在本文中&#xff0c;我们将介绍电脑卡住不动的可能原因&#xff0c;并提供…

Itext生成pdf文件,html转pdf时中文一直显示不出来

之前使用freemark模板渲染ftl页面,转出的pdf中&#xff0c;css2的很多样式好像不支持 改造成使用html页面来转pdf&#xff0c;css2的样式可以生效,itext是不支持css3的弹性布局的ITextRenderer pdfRenderer new ITextRenderer();// 添加字体设置ITextFontResolver fontResolve…

微信小程序 点击右上角三个点 当前页面未设置分享

js文件中添加 //用户点击右上角分享朋友圈 onShareTimeline () { },

RSA加密解密(二)——用shell加密后java无法解密的问题

我们需要用shell生成加密原文数据&#xff0c;存入mysql中&#xff0c;然后用java取出mysql中的加密数据并解密出原文。 这个任务中遇到的最大问题是&#xff0c;用shell进行base64编码后的加密数据&#xff0c;无法被java的解密程序解密&#xff0c;会报错。 Exception in t…

访问学者感谢信|人文社科工作者赴北欧访学

编者按&#xff1a;这位访问学者从委托我们申请到获得邀请函只用了一个月时间。为了表达感激之情&#xff0c;其当时就写了这封感谢信&#xff0c;但依据我们的惯例&#xff0c;一般是待申请者出国&#xff0c;一切安排妥当后再发成功案例。所以时至今日&#xff0c;才将该申请…

统计图柱形图绘制方法

统计图柱形图绘制方法 常用的统计图有条形图、柱形图、折线图、曲线图、饼图、环形图、扇形图。 前几类图比较容易绘制&#xff0c;饼图环形图绘制较难。 今提供条形图和柱形图的绘制方法&#xff0c;附加环形图和艺术环图的绘制方法供参考。 本方法采用C语言的最基本功能&…

PCL 计算点云AABB包围盒的体积

目录 一、AABB包围盒二、代码实现三、结果展示四、相关链接本文由CSDN点云侠原创,原文链接。爬虫自重,把自己当个人。 一、AABB包围盒 AABB包围盒又称了 轴对齐包围盒,是点云包围盒里最简单的一种,其计算方法也极其简单。获取包围盒之后,根据包围盒的长宽高进行体积计算即…

电销机器人是如何进行工作的

ai电销机器人&#xff0c;主要是解决电销企业筛选客户问题。 我们会帮你搭建好电销后台&#xff0c;你使用的时候只需要导入客户手机号&#xff0c;设置外呼时间&#xff0c;系统就可以帮你自动拨打电话&#xff0c;并把打出来的意向客户自动推送到你的微信上面。非常方便快捷…

在C++使用OpenCV库创建一个带滚动条的窗口,用于动态调整图像的亮度

QuickDemo.cpp #include<quick_opencv.h>//创建一个带滚动条的窗口&#xff0c;用于动态调整图像的亮度 static void on_track(int position, void* userdata) //回调函数:当滚动条的位置改变时被自动调用的回调函数 //position:滚动条的当前位置; userdata:用户提供的数…

Eclipse 创建 Hello World 工程

Eclipse 创建 Hello World 工程 1. Hello WorldReferences Download and install the Eclipse IDE. 1. Hello World Eclipse -> double click -> Launch 单击蓝色方框 (右上角) 最大化 IDE File -> New -> C Project -> Finish Project name&#xff1a;工程名…

办公记事常用工具:桌面记事本助你高效记事

在繁忙的办公环境中&#xff0c;我常常感到自己的大脑像是一个不停旋转的陀螺&#xff0c;各种待办事项、会议安排和灵感想法在脑海中交织&#xff0c;仿佛随时都要迸发出来。然而&#xff0c;只靠人脑记忆&#xff0c;不仅辛苦&#xff0c;而且容易出错。在这样的背景下&#…

Unity之闪电侠大战蓝毒兽

目录 &#x1f3a8;一、创建地形 &#x1f3ae;二、创建角色 &#x1f3c3;2.1 动画 &#x1f3c3;2.2 拖尾 &#x1f3c3;2.3 角色控制 ​&#x1f3c3;2.4 技能释放 &#x1f3c3;2.5 准星 &#x1f4f1;三、创建敌人 &#x1f432;3.1 选择模型 &#x1f432;3.…

基于Arduino UNO设计一个温控制系统

目录 概述 1 硬件结构 1.1 整体硬件介绍 1.2 硬件连接结构 2 软件设计 2.1 软件功能介绍 2.2 关于Arduino的一些知识点 2.2.1 定时器 2.2.2 PWM 2.3 代码实现 2.3.1 编译工具 2.3.2 详细代码 3 测试 3.1 温度数据监控 3.2 温控测试 概述 本文介绍如何使用Ardui…

深度学习(16)--基于经典网络架构resnet训练图像分类模型

一.项目介绍 使用PyTorch工具包调用经典网络架构resnet训练图像分类模型&#xff0c;用于分辨不同类型的花 二.项目流程详解 2.1.引入所需的工具包 import os import matplotlib.pyplot as plt # %matplotlib inline import numpy as np import torch from torch import nn …

三防平板丨平板终端丨加固平板丨户外勘测应用

随着科技的不断发展&#xff0c;现代勘测业也在不断升级。相较于传统的勘测设备&#xff0c;三防平板在户外勘测中有着广泛的应用。那么&#xff0c;三防平板在户外勘测中究竟有哪些优势呢&#xff1f; 首先&#xff0c;三防平板具备极强的防水、防尘、防摔能力。在野外勘测中&…

android studio模拟器不能打开

Andriod:The selected AVD is currently running in the Emulator. Please exit the emulator instance… 1.点击 2.删除下面文件 3.重新打开即可 参考

【XR806开发板试用】 UART串口通信篇

目录&#xff1a; 一. 环境配置 二. 串口通信 三. oled显示 总结&#xff1a;源码中有头文件及例子等。 一.环境配置 在https://aijishu.com/a/1060000000286755中已经写好。 二.UART串口通信 2.1 简单介绍 通用异步收发传输器&#xff08;Universal Asynchronous Receiv…

[Angular 基础] - 视图封装 局部引用 父子组件中内容传递

[Angular 基础] - 视图封装 & 局部引用 & 父子组件中内容传递 之前的笔记&#xff1a; [Angular 基础] - Angular 渲染过程 & 组件的创建 [Angular 基础] - 数据绑定(databinding) [Angular 基础] - 指令(directives) 以上为静态页面&#xff0c;即不涉及到跨组…