Linux:进程间通信---消息队列信号量

文章目录

      • 1.消息队列
        • 1.1 消息队列的原理
        • 1.2 消息队列的系统接口
      • 2. 信号量
        • 2.1 信号量的系统调用接口
      • 3. 浅谈进程间通信
        • 3.1 IPC在内核中数据结构设计
        • 3.2 共享内存的缺点
        • 3.3 理解信号量

  • 序:在上一章中,我们引出了命名管道和共享内存的概念,了解了他们的底层原理和系统接口的使用,知道了共享内存的特性等,而本章,我将继续深入System V的剩下两种进程间通信的方式:消息队列和信号量!!!

1.消息队列

System V IPC{
System V —消息队列
System V —共享内存
System V —信号量
}
本章将围绕着system V IPC中的消息队列和信号量来讲述

1.1 消息队列的原理

消息队列的原理图:
在这里插入图片描述
消息队列的
1. 必须让不同进程看到同一个队列
2. 允许不同的进程,向内核中发送带类型的数据块

文件缓冲区----管道
内存块----共享内存
队列----消息队列
这些都符合进程间通信的本质:必须让不同进程看到同一份资源!!!

1.2 消息队列的系统接口

要想使用消息队列实现进程间通信,首先就要先将消息队列创建出来。
在这里插入图片描述
第一个参数是通过ftok()函数生成的key,第二个参数是位图参数,和之前的共享内存一样,这个函数可以创建一个新的消息队列

想要修改消息队列的属性,就要调用相关的系统接口。
在这里插入图片描述

向消息队列中发送和得到数据:
在这里插入图片描述
其中,msgsnd是发送数据的系统调用接口,msgrcv是获取数据的系统调用接口

消息队列的管理结构体:
在这里插入图片描述

查看消息队列

ipcs -q 能查看消息队列信息(和ipcs -m查看共享内存一样)

删除消息队列

ipcrm -q +[msgid] 能删除消息队列

2. 信号量

2.1 信号量的系统调用接口

要想使用信号量,和消息队列,共享内存同理,也是要先去申请一个信号量。
在这里插入图片描述

和消息队列,共享内存同理,想要修改信号量的属性,就要调用相关的系统接口。
在这里插入图片描述

信号量的管理结构体:
在这里插入图片描述

3. 浅谈进程间通信

3.1 IPC在内核中数据结构设计

在操作系统中,所有IPC资源,都是整合进操作系统的IPC模块中的!
在这里插入图片描述

共享内存、消息队列和信号量这三个的管理结构体内都有一个ipc_perm的结构体,系统通过一个数组对这样的一个个结构体进行管理,从而对不同的IPC结构体进行管理!!!

通过在struct ipc_perm数组中存入对应IPC结构体中ipc_perm结构体的地址,我们就可以通过这个对这个ipc_perm进行处理为((struct semid_ds * )addr)(以信号量的IPC结构体为例),从而访问到整个IPC结构体中的任意成员!!!(其中,ipc_perm中有一个类型标志位,所以操作系统能区分指针指向的对象的类型,也就知道了这是共享内存的IPC结构体还是消息队列的IPC结构体,还是信号量的IPC结构体)

这种模式与c++中的多态有很大的相似度,对于ipc_perm结构体的复用,就像ipc_perm是基类,其他IPC结构体是子类,而实际上cpp就是基于Linux中的这些模式,而引入的多态的概念!!!

3.2 共享内存的缺点

在这里插入图片描述
当我们的A正在写入,且已经写入了一部分,就被B拿走了,导致双方发送和收到的数据不完整-----数据不一致问题,共享内存会有这样的问题,而管道则没有,因为,管道会有同步互斥的保护机制。

1. A、B看到同一份资源,共享内存,如果不加保护,就会导致数据不一致问题
2. 加锁—互斥访问—任何时刻,都只允许一个执行流访问共享资源—互斥(例如:去ATM机取钱的时候,一台ATM机一次只能有一个人取钱或存钱)
3. 共享的,任何时刻只允许一个执行流访问的资源—临界资源—(管道)一般是内存空间。
4. 访问临界资源的代码—临界区

问题一:多进程,多线程,并发打印,此时显示器上的消息是错乱的,甚至和命令行混在一起,这是为什么?

在多进程、多线程中,显示器是一种共享资源,此时,多进程、多线程往显示器打印内容就会导致数据不一致问题,要想不错乱,就要将这个共享资源变成一种临界资源。

3.3 理解信号量

信号量的本质是一把计数器,类似但不等于一个int cnt = n;是用来描述临界资源中资源数量的多少
例子:当我们看电影时,我们还没去看,但是要先买票(买票的本质就是对资源的预定机制),其中票数计数器,每卖一张票,计数器就要减一。此时放映厅的资源就少一个!!!当票数计数器到0后,资源已经被申请完了。

问题一:我们最怕什么情况?

1. 多个执行流访问同一个资源
2. n个执行流访问n-1个资源

为了解决这种问题,我们就要引入一个计数器!!!
int cnt = 15;
int number = cnt–;申请资源
cnt <= 0;资源就被申请完了,再有执行流申请也不会给了!!!

1. 申请计数器资源成功,就表示我具有了访问资源的权限了。
2. 申请了计数器资源,我当前访问我要的资源了吗?没有!申请了计数器资源是对资源的预定机制。
3. 计数器可以有效保证进入共享资源的执行流的数量
4. 每一个执行流,想访问共享资源的时候,不是直接访问,而是先申请计数器资源,就像是看电影先买电影票

程序员把这样一个计数器叫做信号量!!!

所以,当该票只有一个人能抢到,只有一个人能去看电影时。看电影期间只有一个执行流在访问临界资源—互斥!!!

我们把值只能为1,0两态的计数器叫做二元信号量—本质就是一个锁。
当计数器为1.本质问题:其实就是将临界资源不要分成很多块了,而是当做一个整体,整体申请,整体释放!!!

问题二:要访问临界资源,先要申请信号量计数器资源,但是信号量计数器的本质不也是共享资源吗???所以这个计数器也是不安全的

信号量:
a. 申请信号量,本质是对计数器减减------p操作
b. 释放资源,释放信号量,本质是对计数器进行加加操作------v操作

其中信号量的申请和释放—pv操作–是原子的(一个事,要么不做,要做就做完!)
其中要强调的是,多个信号量和信号量是不同的概念

问题二:信号量凭什么是进程间通信的一种?他也没传送数据啊,不是说他的本质就是个计数器吗?

1. 通信不仅仅是通信数据,互相协同也是
2. 要协同,本质也是通信,信号量首先要被所有的通信进程看到。

总结:

本章节带领大家从原理和系统接口的视角了解了什么是消息队列和信号量,而后对进程间通信的内核数据结构进行了探讨,了解了其中的底层逻辑,最后再次深入了解什么是信号量,希望对大家能有帮助!!!

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

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

相关文章

电子电器架构 --- 车载网关的设计

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 钝感力的“钝”&#xff0c;不是木讷、迟钝&#xff0c;而是直面困境的韧劲和耐力&#xff0c;是面对外界…

华为云Git使用与GitCode操作指南

案例介绍 本文档带领开发者学习如何在云主机上基于GitCode来使用Git来管理自己的项目代码,并使用一些常用的Git命令来进行Git环境的设置。 案例内容 1 概述 1.1 背景介绍 Git 是一个快速、可扩展的分布式版本控制系统,它拥有异常丰富的命令集,可以提供高级操作和对内部…

ESP32开发入门(七):HTTP开发实践

一、HTTP协议基础 1.1 什么是HTTP&#xff1f; HTTP&#xff08;HyperText Transfer Protocol&#xff0c;超文本传输协议&#xff09;是互联网上应用最为广泛的一种网络协议&#xff0c;用于从服务器传输超文本到本地浏览器。它是一种无状态的请求/响应协议&#xff0c;工作…

Python 对象引用、可变性和垃圾 回收(变量不是盒子)

变量不是盒子 1997 年夏天&#xff0c;我在 MIT 学了一门 Java 课程。Lynn Andrea Stein 教授 &#xff08;一位获奖的计算机科学教育工作者&#xff0c;目前在欧林工程学院教书&#xff09;指 出&#xff0c;人们经常使用“变量是盒子”这样的比喻&#xff0c;但是这有碍于理…

局域网常用的测速工具,Iperf3使用教程

目录 下载方式 Windows Linux 使用方法&#xff1a;测试局域网带宽 步骤一&#xff1a;服务端准备 步骤二&#xff1a;客户端发起连接 步骤三&#xff1a;查看结果 参数说明 1. Iperf常用参数&#xff08;测试够用&#xff09; 2. 通用参数&#xff08;Server端和Cli…

《深入理解分布式系统》之认识分布式系统

本文是阅读深入理解分布式系统第一章认识分布式系统时的笔记。 分布式系统的特点 多进程不共享操作系统不共享时钟 分布式系统 由多个可独立运行的子系统组成。每个子系统可以独立选择运行平台。不同的运行平台存在差异&#xff0c;比如操作系统&#xff0c;硬件规格等。由…

UE5 PCG学习笔记

https://www.bilibili.com/video/BV1onUdY2Ei3/?spm_id_from333.337.search-card.all.click&vd_source707ec8983cc32e6e065d5496a7f79ee6 一、安装PCG 插件里选择以下进行安装 移动目录后&#xff0c;可以使用 Update Redirector References&#xff0c;更新下&#xff0…

工业现场ModbusTCP转EtherNETIP网关引领生物现场领新浪潮

生物质发生器是一种能够产生、培养生物的设备。客户现场需要将生物发生器连接到罗克韦尔系统&#xff0c;但是二者协议无法直接通讯&#xff0c;需要通过ModbusTCP转Ethernet/IP网关将两者进行通讯连接&#xff0c;生物质发生器以其独特的工作原理和优势&#xff0c;使得生物的…

宝蓝德中间件部署war包时,配置的绝对路径读取错误。

文章目录 问题场景解决办法宝蓝德是什么&#xff1f;&#xff1f;一、基础环境与依赖配置二、自动化部署工具链三、高可用性与集群配置四、安全与合规性措施五、产品线差异化部署六、典型部署流程示例七、运维与优化 原因1. 明确“当前工作目录”与“绝对路径”的关系2. 问题根…

Java、Python、NodeJS等开发环境安装及配置镜像加速到国内源

文章目录 Java1.Windows1.1 scoop方式安装JDK 2.Linux2.1 apt方式安装JDK2.1.1 切换JDK2.1.2 验证版本2.1.3 原理 Python1.Windows1.1 scoop方式安装Python1.2 uv方式安装Python&#xff08;推荐&#xff09; 2.Linux2.1 apt方式安装Python2.1.1 配置版本切换2.1.2 切换Python2…

Linux系统管理与编程16:PXE自动化安装部署centos7.9操作系统

兰生幽谷&#xff0c;不为莫服而不芳&#xff1b; 君子行义&#xff0c;不为莫知而止休。 0.准备 1&#xff09;防火墙和SELinux systemctl stop firewalld systemctl disable firewalld setenforce 0 sed -i s/^SELINUX.*/SELINUXdisabled/ /etc/selinux/config (很不好的…

MCP(Model Context Protocol)是专为LLM(大语言模型)应用设计的标准化协议

核心定义 MCP&#xff08;Model Context Protocol&#xff09;是专为LLM&#xff08;大语言模型&#xff09;应用设计的标准化协议&#xff0c;通过安全可控的方式向AI应用暴露数据和功能。主要提供以下能力&#xff1a; 标准化的上下文管理安全的功能调用接口跨平台的数据交…

Fiori学习专题三十四:Responsiveness

在这一步中&#xff0c;我们提高了应用程序的响应能力。SAPUI5应用程序可以在手机、平板电脑和台式机设备上运行&#xff0c;我们可以配置应用程序以充分利用每种场景的屏幕状态。幸运的是&#xff0c;像sap.m.Table这样的SAPUI5控件已经提供了许多我们可以使用的功能。 1.修改…

解决 TimeoutError: [WinError 10060] 在 FramePack项目中连接 Hugging Face 超时的问题

#工作记录 以下是针对 TimeoutError: [WinError 10060] 的完整排查方案&#xff0c;适用于 FramePack项目中。 &#xff08;一般该错误的发生原因请重点排查Hugging Face模型仓库受限需要登录的情形&#xff09; FramePack项目参考资料 FramePack部署&#xff08;从PyCharm解…

obj = null; 赋值null之前没有其他引用指向obj对象,那么,当obj=null时,会被垃圾回收机制立即回收吗?

不会立即回收。 具体原因是&#xff1a; 赋值 obj null; 后&#xff0c;对象变成“不可达”&#xff0c;符合垃圾回收条件&#xff0c;但垃圾回收器并不会立刻回收它。垃圾回收是CLR自动控制的非确定性过程&#xff0c;什么时候执行回收取决于系统内存压力、GC策略、分代情况…

【Ubuntu 安装Docker CE-Jenkins】

安装Docker CE(Ubuntu) Install | Docker Docs官网 使用apt仓库安装 DNS配置(可选) #手动替换 sudo vim /etc/systemd/resolved.conf #典型配置如下 [Resolve] DNS8.8.8.8 DNS114.114.114.114 FallbackDNS1.1.1.1 # 备用 DNS#sed替换 sudo sed -i /^#DNS/ {s/#DNS/DNS8.8.8…

5、开放式PLC梯形图编程组件 - /自动化与控制组件/open-plc-programming

76个工业组件库示例汇总 开放式PLC编程环境 这是一个开放式PLC编程环境的自定义组件&#xff0c;提供了一个面向智能仓储堆垛机控制的开放式PLC编程环境。该组件采用苹果科技风格设计&#xff0c;支持多厂商PLC硬件&#xff0c;具有直观的界面和丰富的功能。 功能特点 多语…

内网和外网怎么互通?外网访问内网的几种简单方式

在企业或家庭网络中&#xff0c;经常会遇到不同内网环境下网络互通问题。例如&#xff0c;当公司本地局域网内有个办公OA网站&#xff0c;在办公室内电脑上网可以登录使用&#xff0c;但在家带宽下就无法直接通信访问到。这就需要我们采取一些实用的内外网互通技巧来解决这个问…

使用大语言模型进行机器人规划(Robot planning with LLMs)

李升伟 编译 长期规划在机器人学领域可以从经典控制方法与大型语言模型在现实世界知识能力的结合中获益。 在20世纪80年代&#xff0c;机器人学和人工智能&#xff08;AI&#xff09;领域的专家提出了莫雷奇悖论&#xff0c;观察到人类看似简单的涉及移动和感知的任务&#x…

【计算机视觉】OpenCV实战项目: opencv-text-deskew:实时文本图像校正

opencv-text-deskew&#xff1a;基于OpenCV的实时文本图像校正 一、项目概述与技术背景1.1 核心功能与创新点1.2 技术指标对比1.3 技术演进路线 二、环境配置与算法原理2.1 硬件要求2.2 软件部署2.3 核心算法流程 三、核心算法解析3.1 文本区域定位3.2 角度检测优化3.3 仿射变换…