【Linux:文件 + 进程】进程间通信进阶(2)

【Linux:文件 + 进程】进程间通信进阶(2)

头像

🎬 个人主页艾莉丝努力练剑
专栏传送门:《C语言》《数据结构与算法》《C/C++干货分享&学习过程记录
Linux操作系统编程详解》《笔试/面试常见算法:从基础到进阶》《Python干货分享

⭐️为天地立心,为生民立命,为往圣继绝学,为万世开太平


🎬 艾莉丝的简介:

在这里插入图片描述

文章目录


在这里插入图片描述

7 ~> 消息队列

7.1 消息队列的概念

这个消息队列是系统层面的概念,不是组件级别的,和未来组件里的消息队列不是一个东西。

所谓的消息队列,就是在操作系统里面维护一个队列结构。

7.2 消息队列的原理

  • 消息队列——操作系统提供的IPC结构。

也会存在一个由用户设置的key值(A、B进程都能够看到),约定好的。

双方通过往消息队列里面插入节点来进行通信。

消息队列在内核中也要存在一个描述结构体。

在这里插入图片描述


消息队列也有自己的结构体,看到自己的键值。

消息队列和共享内存都是系统级的IPC。

如果这个数据节点只有数据,操作系统怎么区分这是A的还是B的?

必须保证这种数据块是有类型的数据块!

  • 消息队列是一种一个进程给另一个进程发送有类型数据块的方式!

我们需要的系统调用:

在这里插入图片描述

7.3 消息队列的接口

在这里插入图片描述


在这里插入图片描述

7.4 消息队列的一些命令

  • 查看消息队列
在这里插入图片描述
  • 删除消息队列
在这里插入图片描述

8 ~> 信号量

在共享内存那里我们知道,使用共享内存的时候,共享内存没有保护机制,信号量可以保护共享内存。

在这里插入图片描述
  • 在共享内存这里先谈理论部分,在线程那里再谈别的。
  • 这里我们重点理解信号量是什么的问题!

8.1 概念补充

在这里插入图片描述

当你学了管道,可能对“看到同一份资源”没有强烈的感觉;但是学了信号量就可以了——

  • 多进程通信,最重要的是让不同的进程看到同一份资源

解决方案:不同的进程看到同一份资源 -> 新的问题也就从这里展开了!

新的解决方案引入新的问题(硬币也有正反、有钱了解决了现在的问题但是又有一大批人来借钱了、……)。

  • 问题:对同一个进程进行访问的时候会出现并发访问出现错误的问题!

比如刚才的两个写端的互相清空覆盖的现象(同时打开两个写端)——互相干扰。

8.1.1 共享资源和临界资源

我们现阶段是处在“并发访问出现错误”的阶段。

  • 我们把多个执行流(进程)能够看到的公共资源叫做共享资源
  • 把被保护起来的资源叫做临界资源。

8.1.2 互斥和同步

  • 任何时刻只允许一个执行流访问资源,就叫做互斥

只允许我一个人访问,比如ATM机器取钱、上厕所关门等等——不想被别人打扰,就是互斥访问——

在这里插入图片描述


ATM机就是这个临界资源,有了顺序性,就是同步。

让多个进程执行的时候一定要有顺序,按顺序执行——同步。

一个进程在等另一个进程。

  • 互斥与同步 + 共享资源 = 临界资源(被保护的共享资源)

8.1.3 和程序员有什么关系?

在这里插入图片描述


不管是同步、互斥,共享资源、临界资源,上面这些工作具体和程序员有什么关系?我程序员就是个写代码的啊!

  • 为了更好地理解,再举一个例子
在这里插入图片描述
  • 父子进程打印内容错乱、没有规律,一会儿打父进程的、一会儿打子进程的。

大家有没有遇到过父子进程都往同一个显示器上面打印消息的时候,发生错乱的这种情况?

这是因为Linux下一切皆文件,stdout其实是一个共享资源,我们父子进程向它打印的时候,这个共享资源是没有被保护起来,所以会出现这种现象,我们要保护的话需要同步与互斥这种机制。所以并发错乱的问题我们早就遇到过了。

  • Linux下一切皆文件,显示器也是文件(设备文件),在这里属于共享资源,这里的显示器是没有被保护的(数据不一致,这里先不说),为了防止【错乱】,要通过同步和互斥来保护显示器这个共享资源。
在这里插入图片描述


在这里插入图片描述

为什么突然说这个?

在这里插入图片描述

8.1.4 临界区和

一定要记住,所谓的共享资源,站在程序员的视角,将来程序员也是通过代码访问共享资源的!

未来程序员所写的代码,有的代码是会访问共享资源,同样的,有的代码不会访问共享资源。

  • 把访问公共资源的代码叫做【临界区】,把不访问公共资源的代码叫做【非临界区】。

在进入临界区之前,进行加锁;离开时,解锁。

  • 通过加锁、解锁——写代码的方式要改,把临界资源保护起来
在这里插入图片描述

8.1.5 保护访问公共资源的代码

  • 保护访问公共资源的代码
在这里插入图片描述

8.1.6 补充概念思维导图

在这里插入图片描述

8.2 信号量的三个问题

一看到问题,我们就会想到高中语文学习时候的三个问题:

  • 是什么?
  • 为什么?
  • 怎么办?

我们学习信号量的时候也可以迁移这种发问的思想。

8.2.1 (概念)信号量是什么?

很多教材里面喜欢管信号量叫做“信号灯”——被翻译过来的。

  • 信号量:用来实现同步和互斥的一种技术。
  • 场景:公共资源 -> 把公共资源当做整体访问(ATM机器),也有局部使用(电影院看电影,一个座位)。
在这里插入图片描述

8.2.2 信号量的本质

  • 信号量本质:是一个计数器,用来衡量临界资源中,资源数量的计数器,可以想象成一个int count——计数器就是信号量的本质。
在这里插入图片描述

8.2.3 理解

我们基本上没见过电影院放印厅因为座位发生争执的,因为电影院就那么多座位也只会放最多这么多人进来。

座位真正属于你的时候,是什么时候?——买票的时候

只要买到了票,必然有座位。

票卖完了也很正常,说明总票数是一个计数器,本身是有上限的,我们可以通过买票的操作对这个计数器进行减减(--)。

  • 1、买票
  • 2、坐在你的座位上-本质上就是你已经开始访问这个资源了

我只要把票买了,这个座位就是属于我了。相当于我提前预定了,其他人不能占我的位置。换言之我只要买了票,就一定会有一个资源属于我。

所以,买票的本质:对共享资源的一种预定机制!

在我们今天来看我们可以把这个放映厅想成内存块。一个个人就是一个个进程。就像我人要买票,每一个进程也需要对应的操作才能访问,也就是先申请信号量,所以我们进入临界区对这个计数器------>P(),走了++,V()。

在这里插入图片描述

申请信号量这个操作的本质就是对临界区资源进行预定。

我们来写一个不太严谨的伪代码来帮助理解一下:

在这里插入图片描述

8.2.4 补充故事:如果今天电影院的放映厅里面只有一个座位呢

在这里插入图片描述

8.2.5 信号是什么的思维导图

在这里插入图片描述

8.2.6 为什么要有信号量?

  • 因为有问题:并发访问 ~> 信号量 ~> 为了解决多进程访问共享资源产生的并发读写问题
在这里插入图片描述

8.2.7 怎么办?

  • 怎么办:我们就来了解一下信号量的一些接口!
  • 怎么设计信号量?
  • 怎么创建信号量?

我们先来看一下信号量的一些接口——

  • 创建信号量:semget
在这里插入图片描述
  • 操作系统允许创建信号集
在这里插入图片描述
  • 信号量集
在这里插入图片描述
  • 删除信号量的系统调用
在这里插入图片描述
  • 共享内存信号量在操作系统角度是怎么被“先描述再组织”的?

我们先来看看信号量集——

在这里插入图片描述


这个5指的是信号量集里面有五个。

  • 信号量本质是个计数器
在这里插入图片描述
  • 对信号量进行操作的时候用semctl不光是删除操作,包括获取、删除、……
在这里插入图片描述
  • 系统提供的枚举类型的结构体传进去就可以处理初始值
在这里插入图片描述


获取信号量集的信息,信号量集的创建时间什么的——

在这里插入图片描述

这个结构体 struct semid_ds 用于描述 System V 信号量集的关联信息。通过它,你可以获得信号量集的创建时间(sem_ctime),同时还能获取以下信息:

在这里插入图片描述
  • 怎么保证看到的是同一个信号量集?
在这里插入图片描述
  • 信号量这里的op和共享内存那里一样,通常是+1或者-1,代表要进行什么操作
在这里插入图片描述
  • sembuf 结构体是 semop() 系统调用用来描述单个信号量操作的核心数据结构。它包含的三个成员 sem_numsem_opsem_flg 分别决定了操作的对象、操作的类型以及行为标志。下面详细解释每个成员的作用。

这个sem_num是什么?

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


我们来看一段作为示例的代码片段:

#include<sys/sem.h>// 假设已经通过 semget() 获得了一个信号量集的标识符 semidstructsembuf sb;// 对信号量集索引为 0 的信号量执行 P 操作(获取资源) sb.sem_num =0;// 第 1 个信号量 sb.sem_op =-1;// 想要减少 1 sb.sem_flg = SEM_UNDO;// 进程退出时自动还原if(semop(semid,&sb,1)==-1){perror("semop");// 错误处理}else{// 成功获取资源,可以进入临界区}
总结一下:sem_num:指定操作哪个信号量(索引)。sem_op:定义增减值或等待条件。sem_flg:控制阻塞行为与自动撤销。

这三个成员共同决定了 semop() 如何修改或等待信号量,是实现进程同步与互斥的基础。

最下面这个回滚就不说啦,很麻烦,上面说的了解一下就行。

  • 信号量创建、开辟空间是分开的!

6.2.8 信号量怎么办的思维导图

在这里插入图片描述

结尾

uu们,本文的内容到这里就全部结束了,艾莉丝在这里再次感谢您的阅读!

结语:希望对学习Linux相关内容的uu有所帮助,不要忘记给博主“一键四连”哦!

往期回顾:

【Linux:文件】进程间通信进阶(1)

🗡博主在这里放了一只小狗,大家看完了摸摸小狗放松一下吧!🗡૮₍ ˶ ˊ ᴥ ˋ˶₎ა

Read more

Haversine 距离算法详解(零基础友好版)

作为算法领域的研究者,我会从用途、核心原理、前置知识、公式拆解、代码实现五个维度,给你讲清楚 Haversine 距离算法 —— 它是计算地球表面两点球面直线距离的经典算法,日常用的地图测距、打车软件预估里程,背后都有它的身影。 一、 算法的核心用途 我们生活的地球是一个近似球体,如果要计算两个地点(比如北京到上海)的 “直线距离”,不能直接用平面几何的勾股定理(因为地球表面是曲面)。 Haversine 算法的作用,就是基于两点的经纬度坐标,计算它们在地球球面上的最短距离(这个最短距离也叫大圆距离,即穿过球心的平面切割球面形成的圆弧长度)。 二、 必须掌握的前置知识 在理解公式前,先记住 3 个关键概念: 1. 经纬度的定义 * 纬度 (latitude):衡量地点南北位置,范围是 [-90°, 90°],赤道是 0°,北极是 90°N,南极是 90°S。

By Ne0inhk
Flutter 组件 simplify 的适配 鸿蒙Harmony 实战 - 驾驭路径精简算法、实现鸿蒙端高性能地理足迹渲染与矢量图形优化方案

Flutter 组件 simplify 的适配 鸿蒙Harmony 实战 - 驾驭路径精简算法、实现鸿蒙端高性能地理足迹渲染与矢量图形优化方案

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 组件 simplify 的适配 鸿蒙Harmony 实战 - 驾驭路径精简算法、实现鸿蒙端高性能地理足迹渲染与矢量图形优化方案 前言 在鸿蒙(OpenHarmony)生态的运动健康轨迹展示、高精度室内导航以及大规模矢量地图看板开发中,“路径性能”是决定用户滑动流畅度的核心红线。面对用户运动 1 小时产生的包含数万个(X, Y)坐标点的原始 GPS 序列。如果直接将其交给鸿蒙端的渲染层进行绘制,不仅会引发由于顶点(Vertices)过多导致的 GPU 负载饱和。更会由于频繁的坐标点内存申请(Memory Allocation),产生严重的 UI 掉帧与功耗飙升。 我们需要一种“去重存精、视觉无损”的几何精简艺术。 simplify 是一套专注于极致性能的 Douglas-Peucker 及其增强算法实现。它能瞬间将冗余的、

By Ne0inhk
【C++例题 / 训练】二分算法(模板 & 例题)

【C++例题 / 训练】二分算法(模板 & 例题)

引言 二分也就是二分查找,又叫折半查找。这种算法正如其名,每一次都要分一半。 二分算法可以分为二分查找和二分答案。 以在一个升序数组中查找一个数为例,每次考察数组当前部分的中间元素,如果中间元素刚好是要找的,就结束搜索过程;如果中间元素小于所查找的值,那么左侧的只会更小,不会有所查找的元素,只需到右侧查找;如果中间元素大于所查找的值同理,只需到左侧查找  二分法的使用条件 二分法是适用于解决具有“二段性”(单调性)的问题的方法,通常表现为求解满足某一条件的最大值或者最小值 上下界确定。 我们可以通过上下界的折半来优化查找。二段性: 对某一范围内的数据,存在一个临界点,使得临界点某一侧的所有数据都满足某一性质,另一侧的所有数据都不满足这一性质,就称这一范围内的数据具有二段性。 二段性包括单调性,即区间内有序,这样二分出来的结果是严格大于或者小于或等于target的。 但是,二段性也体现在非单调性上,也称为局部有序,可以参考 162. 寻找峰值 和 33. 搜索旋转排序数组。由这些题我们可以得知,二分法的奥义(本质)不在于单调性,而是二段性。也就是我们能对整体无序但局部有序的

By Ne0inhk

【顶尖无人机企业都在用的避障方案】:TOP 5算法对比及选型指南

第一章:无人机避障技术的发展现状与挑战 近年来,随着无人机在物流、农业、测绘和安防等领域的广泛应用,避障技术作为保障其安全飞行的核心能力,得到了快速演进。现代无人机避障系统普遍融合了多种传感器与智能算法,以实现对复杂环境的实时感知与响应。 主流避障传感器对比 不同类型的传感器在精度、成本和适用场景上各有优劣,常见的组合包括: 传感器类型探测距离优点局限性超声波0.1–5 m成本低,测距稳定易受温度和表面材质影响红外0.1–3 m响应快,体积小易受强光干扰激光雷达(LiDAR)1–100 m高精度,远距离成本高,体积较大立体视觉(Stereo Vision)0.5–20 m可识别纹理与形状依赖光照,计算量大 基于深度学习的动态避障策略 当前前沿研究倾向于将卷积神经网络(CNN)与强化学习结合,实现动态路径规划。例如,使用YOLOv8进行实时障碍物检测,并通过决策网络输出避障指令。 # 示例:使用OpenCV与YOLO进行障碍物检测 import cv2 net = cv2.

By Ne0inhk