1. 并发编程概念铺垫

> 多个执行流【进程】看到同一份资源:共享资源

> 被保护起来的资源叫做临界资源

> 在进程中,涉及临界资源的程序段叫做临界区。【说人话就是程序中访问共享资源的代码】

> 什么是互斥:任何时刻,只允许一个执行流访问资源叫叫作互斥。【比如,一个进程在访问临界资源的时候,另一个进程无法访问,直到前者访问结束解锁,将锁交给后者,后者才能访问临界区!】

> 什么是同步:多个执行流,访问临界资源的时候,具有一定的顺序性,叫做同步。

> 所谓对共享资源的保护,本质上是对共享资源代码的保护【即对临界区的保护】。

2. 认识并理解信号量

什么是信号量呢?信号量本质就是计数器,用来描述临界资源中资源的多少。

我们的进程在访问临界资源时,并不是说,你想访问就访问。其实,临界资源也是分一块一块的,每个进程如果成功访问临界资源,那么这块临界资源就势必会被占用。一旦临界资源被占满了,后来的进程就无法再访问临界资源了。系统又是如何做到这一点的呢?所有进程在访问临界资源之前,都必须要先申请信号量【我们现在可以简单把它理解为一个整形变量的计数器,用来描述临界资源的多少】,一旦申请成功,计数器减减。至此,该进程就可以随时访问系统为其分配的临界资源。但是,如果资源不够,那么该进程就会被阻塞挂起。所以,信号量的本质是对资源的预定机制

细节一:信号量需要被所有进程访问,那么信号量本身就是共享资源。信号量需要被保护起来,那么对于信号量的操作必须是要原子性的。我们把申请信号量,计数器++叫做p操作,进程结束访问临界资源,计数器--叫做v操作。所以,信号量通过PV操作来完成资源的预定机制。【而这两个操作都必须是要原子性的,至于如何保证原子性后面再说】

细节二:只有1和0两态的信号量叫做二元信号量【也就是互斥】

细节三:信号量和通信有什么关系呢?为什么信号量会被归为进程间通信的范畴呢

首先,进程对资源的访问,都必须要先申请信号量,所以进程看到了同一份资源。其次,不只是传递数据才是进程间通信,同步互斥通知也是进程间通信。比如:在进程a申请信号量时,计数器为0,那么进程a申请信号量失败,进程a则阻塞挂起到等待队列中。有朝一日,进程b访问临界资源结束,释放资源,计数器++,进程a看到后被唤醒申请临界资源。在上面这个例子中,进程b通过信号量完成了对进程a的控制

3. 系统如何管理组织ipc

我们前面一直说,系统内部有描述共享内存|消息队列|信号量的结构体对象,我们也可以理解。但是,系统内部是如何管理组织这些结构体对象呢???

不急,我们先来看看一些有关消息队列和信号量的接口:

信号量创建接口:

信号量控制接口:

消息队列创建接口:

 消息队列控制接口:

通过观察以上的接口,我们发现描述这些ipc的结构体对象都有一个共性:就是它们都命名为struct xxxid_ds,并且第一个成员类型都是struct ipc_perm,而且ipc_perm中的第一个成员都是key

因此,我们可以得出一个结论:在Linux内核中,共享内存,消息队列,信号量都用key来唯一区分!并且它们被系统当做了同一种资源。 

事实上,在Linux内核中,有一种全局的数据结构来管理组织ipc,就是struct ipc_ids。其中,entries指针指向ipc_id_ary,ipc_id_ary中有一个结构叫柔性数组

 而该柔性数组中则管理了内核中的所有ipc,无论是共享内存,消息队列还是信号量。但是,系统又是如何区分不同的结构体呢【毕竟柔性数组若是没有相应的类型,我们就这能获得它指向元素的第一个成员】??我们可以这样理解,在创建控制不同类型的ipc时,我们使用的系统调用是不同的,内核中对柔性数组可以因此来区分不同类型的结构体,到时用得到的类型进行强转即可。至此,我们也终于明白了,xxxid为什么在不断的增长,因为他就是柔性数组的下标,我们也不用担心数组下标越界。当下标到达最大值时,管理柔性数组的结构体会对其下标进行回绕。

下面是部分内核图帮我们理解:

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

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

相关文章

Spring Boot全局异常处理详解

原代码:package com.weiyu.exception;import com.weiyu.pojo.Result; import com.weiyu.utils.ErrorFileResponseUtils; import jakarta.servlet.http.HttpServletRequest; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import …

FHE技术将彻底改变在线隐私保护方式

1. 在线隐私的简史 互联网刚刚诞生时,所有的内容都是未加密的。人们通过一个特定的地址访问网站,这个地址以“HTTP”开头。当时,这并不是什么大问题,因为人们在线访问的都是内容,而这些内容本身已经是公开的。但随着电…

Cursor配置Java环境、创建Spring Boot项目

一:配置JDK和Maven cursor默认会读取环境变量JAVA_HOME和MAVEN_HOME,如果没有配置去找默认路径~/.m2/settings.xml也可以手动指定:Ctrl Shift P 输入"Preferences:Open User Settings(JSON)"打开settings.json文件,然…

win11添加无线显示器(两个笔记本实现双屏)

前置条件: 两个笔记本要要支持无线显示器,支持蓝牙; 1、自己重装的win11系统,首先根据网上说明进去的时候,红色显示无无线投屏; 2、安装网上操作,查看自己电脑是否支持无线投屏(是支…

【MAC技巧】Bash/Zsh切换失败的故障排除

【MAC技巧】Bash/Zsh切换失败的故障排除 Troubleshooting to Failure " chsh: no changes made" By JacksonML 在Mac电脑中,终端(Terminal)是常用的命令行工具,对开发和运维至关重要。 依照苹果电脑的系统软件迭代,终端中存有B…

卷积神经网络-卷积的分类

卷积的定义卷积是图像处理中最核心的操作之一,其本质是通过卷积核(滤波器)与图像进行滑动窗口计算(像素值乘积之和),实现对图像特征的提取、增强或抑制。一、二维卷积--针对二维矩阵进行处理1.1单通道见得最…

全网首发:使用GIT下载时崩溃退出,是因为机械硬盘

前面有几篇文章,说是GIT下载会退出。开始以为是虚拟机问题。把家里的虚拟机复制到公司,照样崩溃。后来认为是内存不足。昨天在家里下载代码,也崩溃退出。心里觉得奇怪,试了一次,还是退出。差别在哪里?之前是…

YAML 自动化用例中 GET vs POST 请求的参数写法差异

GET 请求:用 params 传参(附加在 URL 上) config:name: "GET 查询用户信息"base_url: "https://api.example.com"teststeps:- name: "根据 userId 查询用户信息"request:method: GETurl: /api/user/detailpara…

使用 SeaTunnel 建立从 MySQL 到 Databend 的数据同步管道

SeaTunnel 是一个非常易用、超高性能的分布式数据集成平台,支持实时海量数据同步。 每天可稳定高效地同步数百亿数据,已被近百家企业应用于生产,在国内较为普及。 Databend 是一款开源、弹性、低成本,基于对象存储也可以做实时分…

linux服务器换ip后客户端无法从服务器下载数据到本地问题处理

服务器换ip后客户端无法从服务器下载数据到本地,根据上图提示,让用户清理下~/.ssh/known_hosts文件,下载恢复正常。

从0到1实现Shell!Linux进程程序替换详解

目录从0到1实现Shell!Linux进程程序替换详解 🚀引言:为什么进程需要"变身术"?一、程序替换:进程的"换衣服"魔法 🔄1.1 什么是程序替换?1.2 程序替换的原理:内存…

暑期算法训练.2

目录 6.力扣 11.盛水最多的容器 6.1 题目解析: 6.2 算法思路: 6.2.1 暴力解法: 6.2.2 优化算法: 6.3 代码演示: ​编辑 6.4 总结反思: 7.力扣 611.有效的三角形个数 7.1 题目解析: 7.2…

华为OD 消消乐游戏

1. 题意 游戏规则:输入一个只包含英文字母的字符串,字符串中的两个字母如果相邻且相同,就可以消除。 在字符串上反复执行消除的动作,直到无法继续消除为止,此时游戏结束。 输出最终得到的字符串长度。 输入 输入原始…

小白学HTML,操作HTML文件篇(2)

目录 一、添加多媒体 1.添加网页图片 2.添加网页音频 3.添加网页视频 二、创建容器 1. 标签 2.布局 三、创建表格 1.表格标签 2.添加表格表头 3.添加表格标题 一、添加多媒体 在 HTML 网页中可以轻松地使用标签来添加图片、音频、视频等多媒体,而这些多媒体并…

微服务架构中实现跨服务的字段级权限统一控制

结合集中式权限管理、分布式上下文传递、动态策略执行等技术 ​​一、核心架构设计​​ ​​1. 分层控制模型​​ ​​网关层​​:统一校验用户身份与基础权限,拦截非法请求。 ​​服务层​​:基于用户权限动态过滤数据字段,实现业务级控制。 ​​策略中心​​:集中管理权…

【实现100个unity特效之27】使用unity的ShaderGraph实现一个带裁剪边缘光的裁剪效果(2d3d通用)

文章目录普通裁剪效果1、创建一个Lit Shader Graph2、ShaderGraph前置配置3、添加节点4、效果5、修改裁剪方向带边缘色的裁剪1、在裁剪的基础上添加裁剪边缘光2、边缘的亮度3、修改裁剪方向4、效果5、我们可以代码控制它的变化,如下2D3D游戏通用专栏推荐完结普通裁剪…

Android Scoped Storage适配完全指南

Android Scoped Storage适配完全指南关键词:Android、Scoped Storage、适配、存储权限、文件访问摘要:本文将全面介绍Android Scoped Storage的相关知识,从背景出发,详细解释核心概念,阐述其原理和架构,给出…

Typecho集成PHPMailer实现邮件订阅功能完整指南

文章目录 Typecho使用PHPMailer实现文章推送订阅功能详解 1. 背景与需求分析 1.1 为什么选择PHPMailer 1.2 功能需求 2. 环境准备与配置 2.1 安装PHPMailer 2.2 数据库设计 3. 核心功能实现 3.1 邮件服务封装类 3.2 订阅功能实现 3.2.1 订阅表单处理 3.2.2 确认订阅处理 3.3 文…

无线-二层组网-直接转发

文章目录无线二层组网直接转发🏡作者主页:点击! 🤖Datacom专栏:点击! ⏰️创作时间:2025年07月16日08点00分 无线二层组网 直接转发 本地转发中所有的沿途都需要配置对应VLAN的通过&#xff…

gin go-kratos go-zero框架对比

Gin、Go-Kratos 和 Go-Zero 是 Go 语言中三种常见的服务框架,它们在定位、设计理念、复杂度和适用场景上差异较大。下面我们从功能定位、设计理念、优劣对比、使用建议等维度进行深入对比。🧭 一句话总结框架定位Gin轻量级、高性能的 HTTP 路由框架Go-Kr…