进程间通信 之 共享内存

目录

什么是共享内存?

共享内存的系统调用接口

共享内存


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

共享内存区是最快的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

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

共享内存

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

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

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

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

相关文章

知识学习app

管理端: (1)登录 (2)首页数据报表:1.数据概括2.一周数据走势 (3)内容管理: 1.分类管理:新增,修改,删除,排序 2.八股文&…

基础监控理论

文章目录 监控流程架构体系监控分类 监控发展和技术企业中监控发展阶段通用技术和工具 监控流程架构体系 监控流程架构体系是确保信息系统健康、稳定运行的重要组成部分,它包括监控系统的设计、搭建、数据分析、数据采集、稳定性测试、自动化集成、部署上线以及图形…

LAMP 世界上使用最广泛的框架(安装LAMP框架)快照

说是框架就不只是一个东西。L:Linux,一种操作系统类型,专为服务器领域服务. A:Apache,web 服务器。 M:MySQL,数据库,存储项目的元数据,真实数据会存放在硬盘中。 P:PHP,一种编程语言&#xff0…

mongoDB7.0.6版安装与使用(最新版踩坑记录)

这里写自定义目录标题 0.前言1.MongoDB下载与安装2.启动服务及验证3.命令行访问4.navicat访问5.停止服务 0.前言 本文总结了最近版mongoDB下载安装的过程及简单的应用,整个过程不涉及修改配置文件,甚至不用设置用户名密码也不用登录认证,在进…

Knife4j的相关知识点!!

一、基础概念 knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案,前身是swagger-bootstrap-ui,取名kni4j是希望它能像一把匕首一样小巧,轻量,并且功能强悍! Knif4j(原名为 Swagger-Bootstrap-UI)是一款基于 Swagger 实现的文档管理工具&am…

Linux命令之Tmux

1. Tmux是什么? Tmux是一个终端复用器(terminal multiplexer),属于常用的开发工具,学会了之后可以大大的提高工作效率。 1.1 基本概念 在使用tmux之前我们先了解关于tmux的几个名词: session&#xff0c…

[Qt] 点击QTableWidget item项后键盘输入导致崩溃

复现场景 Qt版本 5.9.8 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget) {ui->setupUi(this);ui->tableWidget->setRowCount(1);ui->tableWidget->setColumnCount(2);Q…

【数据结构取经之路】栈

目录 引言 栈的性质 顺序栈 栈的基本操作 初始化 销毁 插入 删除 判空 取栈顶元素 栈的大小 完整代码: 引言 栈(stack),可以用数组实现,也可以用链表实现。用数组实现的栈叫顺序栈,用链表实现的栈叫链式栈&#…

PriorityQueue集合源码分析

PriorityQueue集合源码分析 文章目录 PriorityQueue集合源码分析前置知识一、字段分析二、构造函数分析三、方法分析四、总结 PriorityQueue 优先级队列,是基于堆的结构来构建的。而堆是基于完全二叉树来实现的,而二叉树除了可以用节点来实现也可以用数组…

移动WEB开发之流式布局

一、移动端基础 1、浏览器 总结:兼容移动端主流浏览器,处理webkit内核浏览器即可。 2、移动端调试方法 Chrome devtools(谷歌浏览器)的模拟手机调试 搭建本地web服务器,手机和服务器一个区域网内,通过手机…

SCI一区 | Matlab实现GWO-TCN-BiGRU-Attention灰狼算法优化时间卷积双向门控循环单元融合注意力机制多变量时间序列预测

SCI一区 | Matlab实现GWO-TCN-BiGRU-Attention灰狼算法优化时间卷积双向门控循环单元融合注意力机制多变量时间序列预测 目录 SCI一区 | Matlab实现GWO-TCN-BiGRU-Attention灰狼算法优化时间卷积双向门控循环单元融合注意力机制多变量时间序列预测预测效果基本介绍模型描述程序…

框架篇常见面试题

1、Spring框架的单例bean是线程安全的吗? 2、什么是AOP? 3、Spring的事务是如何实现的? 4、Spring事务失效的场景 5、SpringBean的声明周期 6、Spring的循环依赖 7、SpringMVC的执行流程 8、SpringBoot自动配置原理 9、Spring常见注解

解决MySQL “Lock wait timeout exceeded; try restarting transaction“ 错误

在处理MySQL数据库时,我们偶尔会遇到一个棘手的错误消息:“Lock wait timeout exceeded; try restarting transaction”。这通常表明我们的一个事务在尝试获取资源时被阻塞了太长时间。在并发环境中,多个事务同时竞争相同的资源可能会导致这种…

安卓手机切换国内IP地址的几种方法详解

随着互联网的普及和移动设备的广泛使用,IP地址已经成为了日常生活中不可或缺的一部分。IP地址不仅可以帮助大家在互联网上找到目标设备,还可以为网络安全提供一定的保障。然而,在某些情况下,可能需要切换国内IP地址,例…

SpringCloud Bus 消息总线

一、前言 接下来是开展一系列的 SpringCloud 的学习之旅,从传统的模块之间调用,一步步的升级为 SpringCloud 模块之间的调用,此篇文章为第八篇,即介绍 Bus 消息总线。 二、概述 2.1 遗留的问题 在上一篇文章的最后,我…

源码部署LAMP架构

LAMP 文章目录 LAMP1. lamp简介2. web服务器工作流程2.1 cgi与fastcgi2.2 httpd与php结合的方式2.3 web工作流程 3. LAMP平台构建3.1 安装httpd3.2 安装mysql3.3 安装php3.4 验证 1. lamp简介 有了前面学习的知识的铺垫,今天可以来学习下第一个常用的web架构了。 …

腾讯云服务器按月收费价格表,优惠价格5元一个月起

2024腾讯云服务器多少钱一个月?5元1个月起,腾讯云轻量服务器4核16G12M带宽32元1个月、96元3个月,8核32G22M配置115元一个月、345元3个月,腾讯云轻量应用服务器61元一年折合5元一个月、4核8G12M配置646元15个月、2核4G5M服务器165元…

● 647. 回文子串 ● 516.最长回文子序列 ● 动态规划总结篇

● 647. 回文子串 1.dp数组含义。 之前的题目,差不多都是求什么就怎么定义dp数组,最后返回dp的最后一个元素。但是这里如果定义一维数组dp[i]是[0,i]范围的回文子串的个数的话,怎么根据dp[i-1]得到dp[i]?发现很难找到递归关系…

窗口函数(sample database classicmodels _No.8 )

窗口函数(sample database classicmodels _No.8 ) 准备工作,可以去下载 classicmodels 数据库具体如下 点击:classicmodels 也可以去 下面我的博客资源下载 https://download.csdn.net/download/tomxjc/88685970 文章目录 窗口函…

Java八股文(RabbitMQ)

Java八股文のRabbitMQ RabbitMQ RabbitMQ RabbitMQ 是什么?它解决了哪些问题? RabbitMQ 是一个开源的消息代理中间件,用于在应用程序之间进行可靠的异步消息传递。 它解决了应用程序间解耦、消息传递、负载均衡、故障恢复等问题。 RabbitMQ …