当前位置: 首页 > news >正文

Linux -- 互斥的底层实现

lock 和 unlock 的汇编伪代码如下:

lock:movb $0,%alxchgb %al,mutexif(al 寄存器的内容>0)return 0;else挂起等待;goto lock;unlock:movb $1,mutex唤醒等待 mutex 的线程;return 0;

我们来理解以下上面的代码。

首先线程 1 申请锁,此时寄存器 %al 中的值为 0,假设内存中 mutex 的值为 1,运行到 xchgb %al,mutex 这行代码时,交换 %al 和 mutex 的值,由于在这个语句中交换的操作是原子的,所以  %al 的值变为 1,mutex 的值变为 0 的整个过程不会被打断交换过程是安全的!此时线程 1 申请锁成功,加锁成功

一段时间后,线程 1 被切走了

CPU 寄存器硬件只有一套,CPU寄存器内部的数据,属于线程的硬件上下文,是线程私有的,所以寄存器 %al 的值 1 被带走了。但是存储在内存中的数据是所有线程共享的,所以 mutex 的值依旧为 0.

此时轮到线程 2 申请锁了,线程 2 也要重复上面的操作,但此时 mutex 的值已经不是 1 了,而是 0,寄存器 %al 内的值依旧为 0,交换完成后,进行 if 判断,发现寄存器 %al 内的值不是大于 0 的,说明互斥锁已经被别的线程申请走了,所以线程 2 被挂起等待,并且回到开头处,循环式的检测锁是否被释放了

线程 1 释放锁时,再次交换 mutex 和 寄存器 %al 的值,mutex 的值被恢复为 1%al 中的值恢复为 0 。当线程 2 申请锁,交换 mutex 和 寄存器 %al 的值,发现寄存器 %al 中的值变为 1 了,if 语句判断结果为真,说明线程 2 申请锁成功,加锁成功!

相关文章:

Linux -- 互斥的底层实现

lock 和 unlock 的汇编伪代码如下: lock:movb $0,%alxchgb %al,mutexif(al 寄存器的内容>0)return 0;else挂起等待;goto lock;unlock:movb $1,mutex唤醒等待 mutex 的线程;return 0; 我们来理解以下上面的代码。 首先线程 1 申请锁&…...

hhdb客户端介绍(57)

技术选型 选择 MySQL 数据库的原因 开源免费: MySQL 作为一款开源数据库,不仅免费提供给用户,还具备强大的功能和灵活性,有效降低了企业的软件许可成本。 卓越的性能: 在处理大规模数据集和高并发访问时,…...

elasticsearch 杂记

8.17快速安装与使用 系统:ubuntu 24 下载地址: https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.17.0-linux-x86_64.tar.gz 解压后进入目录:cd ./elasticsearch-8.17.0 运行:./bin/elasticsearch 创…...

大功率LED基础学习笔记

大功率 LED 基础学习笔记 一、 LED发光原理 (1)传统白炽灯发光原理 大家从小听说爱迪生发明(改良)电灯,其白炽灯工作原理为:灯丝通电加热到白炽状态,利用热辐射发出可见光的电光源。由于发光…...

EdgeX Core Service 核心服务之 Core Command 命令

EdgeX Core Service 核心服务之 Core Command 命令 一、概述 Core-command(通常称为命令和控制微服务)可以代表以下角色向设备和传感器发出命令或动作: EdgeX Foundry中的其他微服务(例如,本地边缘分析或规则引擎微服务)EdgeX Foundry与同一系统上可能存在的其他应用程序…...

Debian12使用RKE2离线部署3master2node三主两从的k8s集群详细教程

一、前提步骤 1、在各个节点执行(所有 Server 和 Agent 节点) apt install apparmor -y apt install curl -y2、设置各节点Host文件(所有 Server 和 Agent 节点) 192.168.144.175 master01 192.168.144.167 master02 192.168.1…...

【Redis】配置序列化器

1. 配置FastJSON2 FastJSON2相比与FastJSON更安全,更推荐使用。 import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONReader; import com.alibaba.fastjson2.JSONWriter; import com.alibaba.fastjson2.filter.Filter;import org.springframew…...

数字IC后端设计实现十大精华主题分享

今天小编给大家分享下吾爱IC社区星球上周十大后端精华主题。 Q1:星主,请教个问题,长tree的时候发现这个scan的tree 的skew差不多400p,我高亮了整个tree的schematic,我在想是不是我在这一系列mux前边打断,设置ignore p…...

【Docker】部署MySQL容器

关于docker,Windows上使用Powershell/CMD执行指令,Linux系统直接使用终端执行指令。 拉取MySQL 也可以跳过拉取步骤,直接run,这样本地容器不存在的话,会自动拉取最新/指定的版本。 # 默认拉取最新版本 docker pull …...

go语言中的字符串详解

目录 字符串的基本特点 1.字符串的不可变性 2.其他基本特点 字符串基本操作 1. 创建字符串 2. 获取字符串长度 3. 字符串拼接 4. 遍历字符串 5. 字符串比较 字符串常用函数 1. 判断子串 2. 查找与索引 3. 字符串替换 4. 分割与连接 5. 修剪字符串 6. 大小写转换…...

数据中台从centos升级为国产操作系统后,资源增加字段时,提交报500错误

文章目录 背景一、步骤1.分析阶段2.查看nginx3.修改用户(也可以修改所有者权限) 背景 故障报错: nginx报错信息: 2024/12/19 15:25:31 [crit, 500299#0: *249 onen0 " /var/lib/nginx/tmp/cient body/0000000001" f…...

centos-stream9系统安装docker

如果之前安装过docker需要删除之前的。 for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo yum -y remove $pkg; done 安装yum-utils工具: dnf -y install yum-utils dnf-plugins-core 设置存储库&…...

计算机网络基础20道选择题,你能答对几题?

大家好,我是阿祥。今天给大家准备了一场关于计算机网络基础知识的小测验,包含20道精选的选择题。这不仅是对大家网络知识的一次检验,也是一次有趣的学习机会。 IPv4地址的长度是多少位?A. 16位 B. 32位 C. 64位 D. 128位答案&…...

分布式协同 - 分布式事务_2PC 3PC解决方案

文章目录 导图Pre2PC(Two-Phase Commit)协议准备阶段提交阶段情况 1:只要有一个事务参与者反馈未就绪(no ready),事务协调者就会回滚事务情况 2:当所有事务参与者均反馈就绪(ready&a…...

虚幻引擎结构之UWorld

Uworld -> Ulevel ->Actors -> AActor 在虚幻引擎中,UWorld 类扮演着至关重要的角色,它就像是游戏世界的总指挥。作为游戏世界的核心容器,UWorld 包含了构成游戏体验的众多元素,从游戏实体到关卡设计,再到物…...

牛客网刷题 ——C语言初阶——BC114 小乐乐排电梯

1.牛客网 :BC114 小乐乐排电梯 题目描述: 小乐乐学校教学楼的电梯前排了很多人,他的前面有n个人在等电梯。电梯每次可以乘坐12人,每次上下需要的时间为4分钟(上需要2分钟,下需要2分钟)。请帮助…...

43. Three.js案例-绘制100个立方体

43. Three.js案例-绘制100个立方体 实现效果 知识点 WebGLRenderer(WebGL渲染器) WebGLRenderer是Three.js中最常用的渲染器之一,用于将3D场景渲染到网页上。 构造器 WebGLRenderer(parameters : Object) 参数类型描述parametersObject…...

验证 Dijkstra 算法程序输出的奥秘

一、引言 Dijkstra 算法作为解决图中单源最短路径问题的经典算法,在网络路由、交通规划、资源分配等众多领域有着广泛应用。其通过不断选择距离源节点最近的未访问节点,逐步更新邻居节点的最短路径信息,以求得从源节点到其他所有节点的最短路径。在实际应用中,确保 Dijkst…...

springboot 3 websocket react 系统提示,选手实时数据更新监控

构建一个基于 Spring Boot 3 和 WebSocket 的实时数据监控系统,并在前端使用 React,可以实现选手实时数据的更新和展示功能。以下是该系统的核心设计和实现思路: 1. 系统架构 后端 (Spring Boot 3): 提供 WebSocket 服务端,处理…...

SpringBoot使用Validation校验参数

准备工作 引入相关依赖&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId></dependency> 约束性注解(简单)说明 AssertFalse可以为null,如果不为null的话必…...

AAAI-2024 | 大语言模型赋能导航决策!NavGPT:基于大模型显式推理的视觉语言导航

作者&#xff1a;Gengze Zhou, Yicong Hong, Qi Wu 单位&#xff1a;阿德莱德大学&#xff0c;澳大利亚国立大学 论文链接&#xff1a; NavGPT: Explicit Reasoning in Vision-and-Language Navigation with Large Language Models &#xff08;https://ojs.aaai.org/index.p…...

Scala迭代更新

在Scala中&#xff0c;迭代器&#xff08;Iterator&#xff09;是一种用于遍历集合&#xff08;如数组、列表、集合等&#xff09;的元素而不暴露其底层表示的对象。迭代器提供了一种统一的方法来访问集合中的元素&#xff0c;而无需关心集合的具体实现。 在Scala中&#xff0c…...

算法练习——位运算

前言&#xff1a;位运算的方法大多比较抽象&#xff0c;很难想到。 一&#xff1a;判断字符是否唯一 题目要求&#xff1a; 解题思路&#xff1a; 法一&#xff1a;使用hash的思想&#xff0c;统计每一个字母出现的次数&#xff0c;再通过一次循环遍历查询是否有超过1的字母&…...

“文件夹管理”与“标签管理”如何合理使用

在现代信息化的工作与生活环境中&#xff0c;文件夹管理与标签管理是两种常见的信息组织方法。合理使用文件夹与标签管理、提高信息检索效率、优化工作流程是实现高效信息管理的关键。其中&#xff0c;提高信息检索效率尤为重要&#xff0c;因为在海量的数据和文件中&#xff0…...

【学习总结|DAY023】Java高级技术

大家好&#xff0c;今天我们来聊聊 Java 中的几个高级技术&#xff1a;单元测试、反射、注解和动态代理。这些技术在源码、框架和架构师层面发挥着重要作用&#xff0c;掌握它们能让我们更深入地理解 Java 的底层原理&#xff0c;并提升代码质量和开发效率。 单元测试&#xf…...

java 对mongodb操作封装工具类

在 Java 中&#xff0c;封装 MongoDB 操作的工具类是非常常见的做法。使用 MongoDB 官方的 Java 驱动程序&#xff0c;结合常用的工具类封装&#xff0c;可以使得与 MongoDB 的交互更加方便和清晰。下面是一个简单的 MongoDB 操作封装工具类的示例代码。 前提 首先&#xff0…...

Spark-Streaming集成Kafka

Spark Streaming集成Kafka是生产上最多的方式&#xff0c;其中集成Kafka 0.10是较为简单的&#xff0c;即&#xff1a;Kafka分区和Spark分区之间是1:1的对应关系&#xff0c;以及对偏移量和元数据的访问。与高版本的Kafka Consumer API 集成时做了一些调整&#xff0c;下面我们…...

最大似然检测在通信解调中的应用

最大似然检测&#xff08;Maximum Likelihood Detection&#xff0c;MLD&#xff09;&#xff0c;也称为最大似然序列估计&#xff08;Maximum Likelihood Sequence Estimation&#xff0c;MLSE&#xff09;&#xff0c;是一种在通信系统中广泛应用的解调方法。其核心思想是在给…...

Bert各种变体——RoBERTA/ALBERT/DistillBert

RoBERTa 会重复一个语句10次&#xff0c;然后每次都mask不同的15%token。丢弃了NSP任务&#xff0c;论文指出NSP任务有时甚至会损害性能。使用了BPE ALBERT 1. 跨层参数共享 可以共享多头注意力层的参数&#xff0c;或者前馈网络层的参数&#xff0c;或者全部共享。 实验结果…...

力扣周赛T2-执行操作后不同元素的最大数量

给你一个整数数组 nums 和一个整数 k。 你可以对数组中的每个元素 最多 执行 一次 以下操作&#xff1a; 将一个在范围 [-k, k] 内的整数加到该元素上。 返回执行这些操作后&#xff0c;nums 中可能拥有的不同元素的 最大 数量。 示例 1&#xff1a; 输入&#xff1a; nums [1…...

uniapp 3分钟集成轮播广告图

先上效果图 顶部广告栏为 移动app常见需求&#xff0c;今天主要演示如何快速实现.这里还是基于 《星云erp-移动版》演示版 &#xff08;自行下载 导入 Hbuilder, 后端接口可以直接使用我演示接口&#xff0c;不需要修改&#xff09; 第一步: 组件选择 我们直接使用uni-swipe…...

图像修复和编辑大一统 | 腾讯北大等联合提出BrushEdit:BrushNet进阶版来了

文章链接&#xff1a;https://arxiv.org/pdf/2412.10316 项目链接&#xff1a;https://liyaowei-stu.github.io/project/BrushEdit 亮点直击 提出了BrushEdit&#xff0c;这是先前BrushNet模型的高级迭代版本。BrushEdit通过开创基于修复&#xff08;inpainting&#xff09;的图…...

极狐GitLab 17.7正式发布,可从 GitLab 丝滑迁移至极狐GitLab【二】

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料&#xff1a; 极狐GitLab 官网极狐…...

Python基础知识回顾

数据类型 Python可以区分整数&#xff08;integers、下文简写为int&#xff09;、浮点数&#xff08;float&#xff09;、字符串&#xff08;string&#xff09;和布尔值&#xff08;Boolean&#xff09;等数据类型。 1&#xff09;int是可正可负的整数 2&#xff09;float包…...

SpringCloud2023集成Nacos2.4.3

基本都是最新版&#xff0c;踩了两天的坑终于集成上了&#xff0c;实现了多环境配置。 使用版本 关键应用版本备注Java21Oracle OpenJDK 21.0.5Spring Boot3.2.4Spring Cloud2023.0.1Spring Cloud Alibaba2023.0.1.3Nacos2.4.3单机模式 nacos安装 我学习过程使用的是windows…...

数势科技指标平台, 让数据产生最大价值

近来&#xff0c;指标体系和指标平台的重要性正被越来越多的业界同仁所认可。作为行业领先的数据智能产品提供商&#xff0c;数势科技最早推出了统一指标开发管理平台这一突破性产品&#xff08;2021年获得软著&#xff09;&#xff0c;并首家完成了中国信通院数据指标管理平台…...

【玩转MacBook】Maven安装

下载Maven 官网&#xff1a; https://maven.apache.org/download.cgi 下载 Zip 类型的压缩包&#xff1a; 配置环境变量 以管理员身份编辑配置文件。注意&#xff0c;由于 MacBook 上使用了 zsh 命令行&#xff0c;所以需要编辑~/.zshrc文件而不是~/.bash_profile文件&am…...

OpenGL笔记(1)

GLFW的函数说明 GLFW: Window guide 窗口创建提示 在创建窗口和上下文之前&#xff0c;可以设置多个提示。有些提示影响窗口本身&#xff0c;另一些则影响帧缓冲区或上下文。这些提示每次通过 glfwInit 初始化库时都会被重置为默认值。 整数值的提示可以通过 glfwWindowHint …...

前端Python应用指南(二)深入Flask:理解Flask的应用结构与模块化设计

《写给前端的python应用指南》系列&#xff1a; &#xff08;一&#xff09;快速构建 Web 服务器 - Flask vs Node.js 对比 书接上文&#xff0c;这一篇将会深入了解下Flask&#xff0c;这个轻量级的Web框架&#xff0c;非常适合用来构建小型应用和快速原型开发。但是&#x…...

前端Python应用指南(三)Django vs Flask:哪种框架适合构建你的下一个Web应用?

《写给前端的python应用指南》系列&#xff1a; &#xff08;一&#xff09;快速构建 Web 服务器 - Flask vs Node.js 对比&#xff08;二&#xff09;深入Flask&#xff1a;理解Flask的应用结构与模块化设计 在上一篇博文中&#xff0c;我们深入探讨了Flask框架&#xff0c;…...

Unity3D Huatuo技术原理剖析详解

前言 在游戏开发领域&#xff0c;Unity3D凭借其强大的跨平台能力和丰富的功能&#xff0c;成为了众多开发者的首选工具。而在Unity3D的生态系统中&#xff0c;Huatuo作为一款重要的插件&#xff0c;为游戏开发带来了极大的便利。本文将深入剖析Huatuo的技术原理&#xff0c;并…...

复习打卡大数据篇——Hadoop HDFS 03

目录 1. HDFS元数据存储 2. HDFS HA 高可用 1. HDFS元数据存储 HDFS中的元数据按类型可以分为&#xff1a; 文件系统的元数据&#xff1a;包括文件名、目录名、修改信息、block的信息、副本信息等。datanodes的状态信息&#xff1a;比如节点状态、使用率等。 HDFS中的元数…...

宠物行业的出路:在爱与陪伴中寻找增长新机遇

在当下的消费市场中&#xff0c;如果说有什么领域能够逆势而上&#xff0c;宠物行业无疑是一个亮点。当人们越来越注重生活品质和精神寄托时&#xff0c;宠物成为了许多人的重要伴侣。它们不仅仅是家庭的一员&#xff0c;更是情感的寄托和生活的调剂。然而&#xff0c;随着行业…...

使用Turtle库实现,鼠标左键绘制路径,用鼠标右键结束绘制,小海龟并沿路径移动

使用Turtle库实现&#xff0c;鼠标左键绘制路径&#xff0c;用鼠标右键结束绘制&#xff0c;小海龟并沿路径移动 Turtle库是Python标准库的一部分&#xff0c;它提供了一种基于命令的图形绘制方式。Turtle模块通过一个“海龟”&#xff08;Turtle&#xff09;对象在屏幕上移动…...

海格通信嵌入式面试题及参考答案

计算电路的最高工作频率如何计算? 计算电路的最高工作频率主要考虑电路中的关键路径延迟。关键路径是指在整个电路中,信号传播延迟最长的路径。电路的最高工作频率的倒数就是时钟周期,而时钟周期必须大于关键路径的延迟时间。 首先要确定电路中各个模块的延迟。比如对于组合…...

3D几何建模引擎Parasolid功能解析

一、什么是Parasolid&#xff1f; Parasolid是由Siemens PLM Software开发的高精度精密几何建模引擎。它全面评估CAD&#xff08;计算机辅助设计&#xff09;、CAM&#xff08;计算机辅助制造&#xff09;、CAE&#xff08;计算机辅助工程&#xff09;、PLM&#xff08;产品生…...

AI的进阶之路:从机器学习到深度学习的演变(四)

AI的进阶之路&#xff1a;从机器学习到深度学习的演变&#xff08;三&#xff09; 五、深度学习的应用领域 深度学习的应用领域广泛&#xff0c;涵盖了计算机视觉、自然语言处理、语音识别和推荐系统等多个方面。以下将详细探讨这些关键应用领域&#xff0c;展示深度学习在不同…...

【ES6复习笔记】rest参数(7)

什么是 rest 参数&#xff1f; rest 参数是 ES6 引入的一个特性&#xff0c;它允许我们将一个不定数量的参数表示为一个数组。使用 rest 参数可以更方便地处理函数的参数&#xff0c;尤其是在参数数量不确定的情况下。 如何使用 rest 参数&#xff1f; 在函数定义中&#xf…...

安装MongoDB,环境配置

官网下载地址&#xff1a;MongoDB Shell Download | MongoDB 选择版本 安装 下载完成双击打开 点击mongodb-windows-x86_64-8.0.0-signed 选择安装地址 检查安装地址 安装成功 二.配置MongoDB数据库环境 1.找到安装好MongoDB的bin路径 复制bin路径 打开此电脑 -> 打开高级…...

ubuntu 网络管理

1 查看ip地址 rootu22-tools-20:~# ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever…...