【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

AppFlowy 终极安装配置完整教程:快速搭建个人AI知识库

AppFlowy 终极安装配置完整教程:快速搭建个人AI知识库 【免费下载链接】AppFlowyAppFlowy 是 Notion 的一个开源替代品。您完全掌控您的数据和定制化需求。该产品基于Flutter和Rust构建而成。 项目地址: https://gitcode.com/GitHub_Trending/ap/AppFlowy 还在为寻找完美的知识管理工具而烦恼吗?想要一个既强大又完全掌控数据的协作平台?AppFlowy作为Notion的开源替代品,为您提供AI协同工作空间,让项目管理、知识整理和团队协作变得前所未有的简单高效!🎯 📋 环境准备:搭建完美开发基础 在开始安装之前,请确保您的系统满足以下基本要求: 系统要求 * 操作系统:macOS 10.15+、Windows 10+ 或 Linux Ubuntu 18.04+ * 内存:建议8GB以上RAM * 存储空间:至少5GB可用空间 * 网络连接:稳定的互联网连接用于下载依赖 必备工具安装 首先需要安装Flutter和Rust开发环境: Flutter SDK安装:

By Ne0inhk

Ubuntu 24.04 LTS WSL 下载地址

地址可能会变,但是进入官网后,就按照链接的文件夹目录,一个一个找就可以找到的(亲测:清华大学镜像地址是可以的) https://mirrors.tuna.tsinghua.edu.cn/ubuntu-releases/noble/ 一、Ubuntu 官方 WSL 稳定版(.wsl,双击/导入都稳) * Ubuntu 24.04.2 LTS WSL 官方稳定版(x64) https://releases.ubuntu.com/noble/ubuntu-24.04.2-wsl-amd64.wsl 二、国内清华镜像(下载最快、最稳) * 清华镜像 Ubuntu 24.04.2 WSL 稳定版(

By Ne0inhk
Ubuntu 22.04 安装 Docker 完整步骤(附镜像加速配置)

Ubuntu 22.04 安装 Docker 完整步骤(附镜像加速配置)

Ubuntu 22.04 安装 Docker 完整步骤(附镜像加速配置) 摘要 Docker 作为容器化技术的核心工具,凭借轻量、可移植、隔离性强的特性,已成为开发者部署应用、运维人员管理服务的必备工具。Ubuntu 22.04 LTS 作为长期支持版本,具备稳定、兼容的优势,是 Docker 部署的优选系统。本文将从环境准备、Docker 核心组件安装、配置验证、镜像加速优化、常见问题排查五个维度,提供详细且可复现的完整步骤,包含规范代码段、操作流程图解及实用技巧,同时规避 Ubuntu 22.04 系统下的安装陷阱,帮助新手快速上手 Docker 部署,助力开发者提升应用交付效率。无论是个人开发测试场景,还是小型生产环境部署,都能通过本文内容实现 Docker 的快速落地与优化。 🚀 个人主页 :有点流鼻涕

By Ne0inhk
Flutter for OpenHarmony:Flutter 三方库 os_detect — 精准洞察鸿蒙系统的底层脉络(适配鸿蒙 HarmonyOS Next ohos)

Flutter for OpenHarmony:Flutter 三方库 os_detect — 精准洞察鸿蒙系统的底层脉络(适配鸿蒙 HarmonyOS Next ohos)

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net。 Flutter for OpenHarmony:Flutter 三方库 os_detect — 精准洞察鸿蒙系统的底层脉络(适配鸿蒙 HarmonyOS Next ohos) 在进行 Flutter for OpenHarmony 跨平台开发时,我们经常需要处理“差异化”的需求。有的功能可能只在真正的 OpenHarmony 原生环境下运行(如特定的 N-API 调用),而在 Web 或其他桌面模拟器环境下则需要进行降级处理。 传统的 Platform.isAndroid 或 kIsWeb 在处理日渐复杂的鸿蒙生态环境时,往往显得力不从心。os_detect 库提供了一套更轻量、更可靠的系统环境感知方案,能帮助我们精准识别应用正跑在哪个“灵魂”之下。 一、为什么需要系统环境检测?

By Ne0inhk