共享内存和消息队列

news2024/12/27 13:45:42

共享内存

共享内存指 (shared memory)在多处理器的计算机系统中,可以被不同中央处理器(CPU)访问的大容量内存。由于多个CPU需要快速访问存储器,这样就要对存储器进行缓存(Cache)。任何一个缓存的数据被更新后,由于其他处理器也可能要存取,共享内存就需要立即更新,否则不同的处理器可能用到不同的数据。共享内存是 Unix下的多进程之间的通信方法 ,这种方法通常用于一个程序的多进程间通信,实际上多个程序间也可以通过共享内存来传递信息。

这里可以看到我们进程A和进程B同时去映射到内存中 那么这个内存就叫做共享内存

共享内存的内存确实是物理地址 但是我们只是共享了它的映射关系 而不是对这份内存进行拷贝

个进程在自己的页表中,将该空间和进程地址空间上的共享区的一块地址空间形成映射关系。另外一进程在页表上,将同一块物理空间和该进程地址空间上的共享区的一块地址空间形成映射关系。

因此共享内存相比其他几种方式有着更方便的数据控制能力,数据在读写过程中会更透明。当成功导入一块共享内存后,它只是相当于一个字符串指针来指向一块内存,在当前进程下用户可以随意的访问。缺点是,数据写入进程或数据读出进程中,需要附加的数据结构控制。

进程间通信方式有哪些?
进程间通信(IPC,InterProcess Communication)是指在不同进程之间传播或交换信息。IPC 的方式通常有管道(包括无名管道和命名管道)、消息队列、信号量、共享存储、Socket、Streams 等。其中 Socket 和 Streams 支持不同主机上的两个进程 IPC。

管道

它是半双工的,具有固定的读端和写端;
它只能用于父子进程或者兄弟进程之间的进程的通信;
它可以看成是一种特殊的文件,对于它的读写也可以使用普通的 read、write 等函数。但是它不是普通的文件,并不属于其他任何文件系统,并且只存在于内存中。
命名管道

FIFO 可以在无关的进程之间交换数据,与无名管道不同;
FIFO 有路径名与之相关联,它以一种特殊设备文件形式存在于文件系统中。
消息队列

消息队列,是消息的链接表,存放在内核中。一个消息队列由一个标识符 ID 来标识;
消息队列是面向记录的,其中的消息具有特定的格式以及特定的优先级;
消息队列独立于发送与接收进程。进程终止时,消息队列及其内容并不会被删除;
消息队列可以实现消息的随机查询,消息不一定要以先进先出的次序读取,也可以按消息的类型读取。
信号量

信号量(semaphore)是一个计数器。用于实现进程间的互斥与同步,而不是用于存储进程间通信数据;
信号量用于进程间同步,若要在进程间传递数据需要结合共享内存;
信号量基于操作系统的 PV 操作,程序对信号量的操作都是原子操作;
每次对信号量的 PV 操作不仅限于对信号量值加 1 或减 1,而且可以加减任意正整数;
支持信号量组。
共享内存

共享内存(Shared Memory),指两个或多个进程共享一个给定的存储区;
共享内存是最快的一种 IPC,因为进程是直接对内存进行存取

这个是我在刷面试经历时遇到了其他博主对于c++常面试到中截取到关于共享内存的描述

这里提到了我们的共享内存是最快的一种IPC 也就是进程间通信的方式

其他几种方式在之前的学习中我们也有了解

这就是整个共享内存的流程

和管道类似

我们一端进行写入 然后在另外一端进行读操作

消息队列

消息队列(英语:Message queue)是一种进程间通信或同一进程的不同线程间的通信方式,软件的贮列用来处理一系列的输入,通常是来自用户。

消息队列提供了异步的通信协议,每一个贮列中的纪录包含详细说明的数据,包含发生的时间,输入设备的种类,以及特定的输入参数,也就是说:消息的发送者和接收者不需要同时与消息队列交互。消息会保存在队列中,直到接收者取回它。
 

接下来我们用编程的方式加深对消息队列的了解

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/msg.h>
typedef  struct mess{
    long mtype; //消息类型
    char mtext[128]; //消息内容
}msgdata;

int main(){
    //1. 获取或创建消息队列
    int msgid = msgget((key_t)1234,IPC_CREAT|0600);
    if(msgid == -1) exit(1);
    //2. 从消息队列获取数据
    msgdata data;
    msgrcv(msgid,&data,128,1,0); //读取1号消息
    // b获取消息,不存在1消息,阻塞
    // msgrcv(msgid,&data,128,1,IPC_NOWAIT); //不存在消息当前进程不阻塞。
    // msgecv(msgid,&data,128,0,0); // 0 -> 任意消息类型
    printf("data type: %ld\n",data.mtype);
    printf("data text:%s\n",data.mtext);

    //msgctl(msgid,IPC_RMID,0);
    exit(0);
}
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/msg.h>
typedef  struct mess{
    long mtype; //消息类型
    char mtext[128]; //消息内容
}msgdata;

int main(){
    //1. 获取或创建消息队列
    int msgid = msgget((key_t)1234,IPC_CREAT|0600);
    if(msgid == -1) exit(1);
    //2. 向消息队列发送数据:从键盘获取字符串
    msgdata data;
    data.mtype = 2;
    strcpy(data.mtext,"hello2"); 
    msgsnd(msgid,&data,128,0);
    exit(0);
}

 这里我们要了解消息队列的特点

如果我们在一端规定只读取一号消息

那么我们在另外一端进行写操作时 写入的其他号的消息

是没有办法被读到的

同时还会引发消息队列中读端的阻塞

这就是我们目前学习到的进程间通信的几种方式

包括 管道 消息队列 共享内存以及信号量

 其中管道涉及到了同步 和临界资源和临界区

 

 

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

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

相关文章

某程序员哀叹:有比我更惨的吗?工作6年攒了200万,高位接盘买了600万的房子,现在房子跌了100多万,每个月还要还2万房贷!...

最近这几年&#xff0c;“人间惨事”层出不穷&#xff0c;许多网友都在网上比惨&#xff0c;今天的故事主角是一位程序员。这位程序员哀叹&#xff1a;有比我更惨的吗&#xff1f;工作6年攒了200多万&#xff0c;凑了300万首付&#xff0c;在杭州未来科技城高位接盘买了600万的…

JavaScript普通函数与箭头函数有怎样的区别?

比较点 普通函数 箭头函数 具体案例 简写 / 箭头函数如果没有参数&#xff0c;同时函数体的返回值只有一句&#xff0c;则{}和return都可以省略。 1、函数简写 this指向 this总是指向调用它的对象&#xff0c;如果作为构造函数&#xff0c;它指向创建的对象实例 箭头…

【MySQL】深入理解数据库事务

文章目录优秀借鉴1、事务由来2、何为ACID2.1、Atomicity原子性2.2、Consistency一致性2.3、Isolation隔离性2.4、Durability持久性3、聊回事务3.1、概念3.2、语法3.2.1、开启事务3.2.2、提交事务3.2.3、回滚事务4、隔离级别4.1、引入4.2、并发问题4.2.1、脏读4.2.2、不可重复读…

Spring Cloud alibaba 使用Nacos配置中心

依赖管理 Spring Cloud Alibaba BOM 包含了它所使用的所有依赖的版本 请将下面的 BOM 添加到 pom.xml 中的 部分。 这将允许我们省略任何Maven依赖项的版本&#xff0c;而是将版本控制委派给BOM。 <dependencyManagement><dependencies><dependency><gr…

2022年底了,你们公司还好吗?我这里不太好

以下这些也是和几个朋友聊天的时候慢慢聊出来的&#xff0c;不一定真实啊&#xff0c;当做大家开发累了以后的一点调味剂吧 一、宇宙厂 1.宇宙人员成本优化计划&#xff0c;随着各个业务确认了优化目标&#xff0c;将在接下来陆续开展。 某中台确认了指标&#xff0c;将在“在职…

力扣刷题记录——121买卖股票的最佳时机 和125. 验证回文串

本专栏主要记录力扣的刷题记录&#xff0c;备战蓝桥杯&#xff0c;供复盘和优化算法使用&#xff0c;也希望给大家带来帮助&#xff0c;博主是算法小白&#xff0c;希望各位大佬不要见笑&#xff0c;今天要分享的是——《121.买卖股票的最佳时机和125. 验证回文串》。 目录 12…

QT学习 控件(一):按钮类

文章目录Qt控件&#xff1a;按钮QPushButtonQToolButtonQCommandLinkButtonQRadioButtonQCheckBoxQButtonGroupQt控件&#xff1a;按钮 QAbstractButton的信号&#xff1a; void clicked(bool checked false) &#xff1a; 是否选中按钮void pressed()&#xff1a; 点击按钮v…

嵌入式C语言面向对象编程 --- 继承

上一篇文章主要讲述了 C 语言面向对象编程 – 封装的简单概念和实现,本篇文章继续来讨论一下,如何使用 C 语言实现面向对象编程的另一个重要特性:继承。 继承就是基于一个已有的类(一般称作父类或基类),再去重新声明或创建一个新的类,这个类可以称为子类或派生类。子类…

ES文件浏览器 如何提取盒子已安装(内置)软件APK 教程

ES文件浏览器( ES File Explorer)是一款功能强大免费的本地和网络文件管理器。 主要功能&#xff1a;文件管理&#xff1a;多种视图列表和排序方式&#xff0c;查看并打开各类文件&#xff0c;在本地SD卡、局域网、OTG设备之间任意传输文件。多选、复制、粘帖、剪贴板、查看属性…

海豚dolphinscheduler 通过shell 调用.sql文件 传参

1. 准备sql文件 1.1 资源中心--创建文件 1.2 文件格式选择 sql, 文件内容 填要执行的sql内容 1.3 点击创建保存 2.shell调用.sql文件 2.1 拖拽一个shell 节点 2.2 编辑shell节点 hive -e&#xff1a;后面跟hivesql字符串 例如&#xff1a;hive -e "select * from studen…

【十天成为红帽工程师】第七天 Ansible的模块使用

目录 一、ansible的配置文件和清单文件 二、ansible的模块 三、实际操作命令 一、ansible的配置文件和清单文件 &#xff08;一&#xff09;看ansible的配置文件 1、命令&#xff1a;ansible --version 2、一般的配置文件是&#xff1a;/etc/ansible/ansible.cfg PS&am…

查看磁盘分区

在Window上查看磁盘分区&#xff0c;既可以使用diskpart list vol命令&#xff0c;也可以使用diskmgmt.msc命令&#xff0c;下面分别介绍这2种命令查看方式。 1、diskpart方式 按WinR --> 输入: cmd --> diskpart --> list vol&#xff0c;如下图所示: ## 按WinR, …

借助 Material Design,帮助您打造更好的无障碍应用 (中篇)

随着时代的发展&#xff0c;"无障碍体验" 对开发者的意义也愈发重大&#xff0c;在上一篇文章中&#xff0c;我们为您介绍了辅助技术&#xff0c;层次结构&#xff0c;颜色和对比度等内容。本文将进一步为您介绍无障碍布局和排版、文案等相关的内容。布局和排版Mater…

【Java面经】一次颇为进阶的面试记录

工作之余又参加了一次面试&#xff0c;对我来说比之前的面试难度都提了一个度&#xff0c;面试官从公司场景引申聊到高并发和Redis的很多问题。 可惜我太菜了回答不上来&#xff0c;只能回答基础的问题。面完就是凉凉的味道。。 Redis相关 Redis的String是怎么实现的&#xff…

盘点项目管理工具DHTMLX Gantt 的常见问题

DHTMLX Gantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表。可满足项目管理应用程序的大部分开发需求&#xff0c;具备完善的甘特图图表库&#xff0c;功能强大&#xff0c;价格便宜&#xff0c;提供丰富而灵活的JavaScript API接口&#xff0c;与各种服务器端技术&am…

vue中集成省市区街四级地址组件

大家好&#xff0c;我是雄雄。 前言 省市区地址大家应该都不陌生吧&#xff0c;网上买个东西&#xff0c;得填地址。中午定个饭&#xff0c;得写地址&#xff1b;叫个货拉拉叫个跑腿&#xff0c;是不是也得写地址。 但是选择地址的时候&#xff0c;不同场景下选择的范围不同&…

【C分支与循环】详解分支与循环

分支与循环前言一、什么是语句&#xff1f;二、分支语句&#xff08;选择结构&#xff09;&#xff08;一&#xff09;概念&#xff08;二&#xff09;if语句1.概念2.例子&#xff08;1&#xff09;单分支&#xff08;2&#xff09;双分支&#xff08;3&#xff09;多分支&…

vulnhub DC系列 DC-1

目录 下载地址 漏洞分析 信息收集 漏洞尝试 漏洞利用 flag1 flag2 flag3 flag4 提权 下载地址 DC-1.zip (Size: 733 MB)Download: http://www.five86.com/downloads/DC-1.zipDownload (Mirror): https://download.vulnhub.com/dc/DC-1.zip使用方式:ova文件直接使用vm…

nacos安装与使用

nacos安装与使用nacos下载安装下载方式 一&#xff1a;下载方式 二&#xff1a;版本&#xff08;2.0.3&#xff09;nacos启动在项目中注册nacos服务nacos下载安装 下载方式 一&#xff1a; nacos官网下载 下载方式 二&#xff1a;版本&#xff08;2.0.3&#xff09; 链接&a…

【Flask框架】——28 Flask_SQLAlchemy

Flask-SQLAlchemy Flask-SQLAlchemy的使用对SQLAlchemy进行了封装和优化&#xff1a; Flask-SQLAlchemy是Flask框架的一个插件&#xff1b; Flask-SQLAlchemy是对SQLAlchemy进行了一个简单的封装的一个插件&#xff0c;使得我们在Flask中使用sqlalchemy更加的简单。 1.安装…