互斥锁和自旋锁的实现机制

本文介绍互斥锁和自旋锁的实现原理工作过程

一、互斥锁

1.内存标记——线程id

互斥锁会记录下访问锁的线程的id,用于进行线程切换组织阻塞队列等操作

2.阻塞队列

当多个线程试图获取同一把互斥锁,没有获取的锁的线程会被组织到阻塞队列中,当锁再次可用时,队列中的一个线程会获得锁,此时的线程切换就要依赖线程id

  • 内核调度机制:互斥锁的实现通常涉及到线程的阻塞和唤醒这需要操作系统提供相应的内核调度机制来管理线程的状态和调度。当一个线程尝试获取互斥锁时,如果锁已经被其他线程持有,该线程会被放入到锁的等待队列中,并在锁释放时被唤醒。

3.** 原子操作 **

  • 基于操作系统的原语:在许多操作系统中,互斥锁的实现依赖于内核提供的原语或者系统调用。这些原语可以确保在操作临界资源时的原子性和正确性。典型的原语包括:
    • 信号量(semaphore):信号量是一种用于控制并发访问的同步原语,可以用于实现互斥锁
    • 互斥量(mutex):互斥量是一种特殊的信号量,它只允许一个线程访问临界资源

4.** 屏蔽中断 **

  • 屏蔽中断的原理
    • 当一个线程持有互斥锁并进入临界区时,为了防止其他线程在临界区内打断当前线程,系统可以临时禁用中断。
    • 禁用中断可以确保当前线程能够连续地执行临界区的操作,而不会被其他线程打断。
  • 实现细节
    • 操作系统内核通常会提供接口来允许在临界区内禁用中断,例如通过特定的系统调用或者编程接口。
    • 当一个线程持有互斥锁并进入临界区时,系统会调用相应的接口来禁用中断;当线程释放互斥锁时,系统会重新启用中断

二、自旋锁

  1. 自旋等待: 当一个线程在尝试获取自旋锁时,如果发现锁已经被其他线程持有,它会进入自旋等待状态,即在一个循环中不断检查锁的状态,直到获取到锁为止。自旋等待的优点在于它避免了线程阻塞和切换的开销,适用于对临界资源的短期占用情况。

  2. 限制自旋次数: 为了避免自旋等待时间过长导致性能下降,通常会对自旋次数进行限制。如果自旋次数达到了限制,当前线程会放弃自旋等待,转而选择其他方式(如进入睡眠状态或者阻塞状态)等待锁的释放。

  3. 原子操作: 自旋锁的实现通常依赖于原子操作,这些操作能够保证在执行期间不会被中断。典型的原子操作是CAS(compare-and-swap),它可以原子地检查某个内存位置的值,并在满足条件时将新值写入该位置。如果CAS操作失败,则表示其他线程已经修改了内存位置的值,当前线程需要重试。

  4. 锁状态: 自旋锁内部会维护一个表示锁状态标志位,通常为0表示锁空闲,1表示锁被占用。当一个线程尝试获取自旋锁时,它会先尝试使用**原子操作(CAS)**将锁状态从0修改为1,如果成功获取到锁,则表示当前线程可以进入临界区执行任务;如果失败,则表示锁已经被其他线程持有,当前线程需要循环等待。

  5. 屏蔽中断

  • 屏蔽中断的原理
    • 自旋锁的实现通常会在获取锁时禁用中断,以确保临界区的原子性
    • 禁用中断可以防止其他处理器核心或中断处理程序在临界区内打断当前线程。
  • 实现细节
    • 自旋锁的实现通常会在获取锁时使用原子操作来禁用中断,并在释放锁时重新启用中断。
    • 这样可以确保在临界区内自旋等待期间,当前线程不会被中断,从而保证了临界区的原子性。

三、总结

互斥锁(Mutex Lock):

  • 底层实现原理

    • 依赖于操作系统提供的原语或者系统调用,如信号量、互斥量等。
    • 可能使用硬件提供的原子操作,但不依赖CAS指令。
  • 工作过程

    1. 当一个线程尝试获取锁时,它会使用原语或系统调用尝试获取锁。
    2. 如果锁是可用的,线程成功获取锁并进入临界区执行任务。
    3. 如果锁已被其他线程持有,当前线程会被阻塞,并被放入锁的等待队列中。
    4. 等待队列中的线程在锁释放时被唤醒,并有机会竞争锁。
  • 特点

    • 使用操作系统提供的原语或者系统调用来实现。
    • 可能涉及线程的阻塞和唤醒,导致较高的开销。
    • 适用于长期占用临界资源的情况。

自旋锁(Spin Lock):

  • 底层实现原理

    • 依赖于硬件提供的原子操作,通常使用CAS指令。
  • 工作过程

    1. 当一个线程尝试获取锁时,它会循环检查锁的状态。
    2. 如果锁是可用的,线程成功获取锁并进入临界区执行任务。
    3. 如果锁已被其他线程持有,当前线程会在一个循环中等待,直到获取到锁。
  • 特点

    • 使用硬件提供的原子操作来实现,通常使用CAS指令。
    • 不会涉及线程的阻塞和唤醒,减少了线程切换的开销。
    • 适用于短期占用临界资源的情况。

总结比较:

  • 共同点
    • 都是用于实现多线程同步的机制,确保临界资源的互斥访问。
    • 都可以通过原子操作来保证线程安全。
  • 不同点
    • 实现原理不同:互斥锁依赖于操作系统提供的原语或系统调用,而自旋锁依赖于硬件提供的原子操作。
    • 阻塞方式不同:互斥锁会导致线程阻塞和唤醒,而自旋锁会在循环中等待。
    • 适用场景不同:互斥锁适用于长期占用临界资源的情况,而自旋锁适用于短期占用临界资源的情况。
    • 阻塞 vs 自旋等待
    • 互斥锁在获取锁时会导致线程阻塞,线程会被放入阻塞队列中,并在锁释放时被唤醒。这会引起线程上下文切换的开销。
    • 自旋锁在获取锁时会循环检查锁的状态,直到获取到锁为止,期间线程会一直占用CPU资源,但不会进入阻塞状态,也不会加入到阻塞队列中。
    • 开销
    • 由于互斥锁涉及到线程的阻塞和唤醒,它的开销相对较高。在高并发场景下,频繁的线程切换会导致性能下降。
    • 自旋锁在获取锁时不会引起线程的阻塞和切换,因此在低竞争和短期占用临界资源的情况下,自旋锁的开销可能更低。

推荐学习内容

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

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

相关文章

Keysight 是德 N1077B 光/电时钟恢复设备,收藏保存

Keysight N1077B是一款光/电时钟恢复设备,支持115 MBd至24 GBd的数据速率范围,适用于多模和单模光信号以及电信号。该设备能够处理PAM4和NRZ两种类型的数据信号,并提供符合标准的时钟恢复功能。 N1077B具备可调峰值和环路带宽(高…

leetcode206-Reverse Linked List

题目 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 示例 1: 输入:head [1,2,3,4,5] 输出:[5,4,3,2,1] 分析 用一个指针记录当前位置,另外一个指针记录当前位置的前一个位置&#xff0c…

【经验分享】图片自适应窗口大小css;CSS实现背景图片全屏铺满自适应的方式

目录 设置背景颜色和边距 设置背景图片 调整背景图片尺寸和位置 完整代码 使用效果如下(展示) 网页版图片效果展示 手机版图片效果展示 如何使用 CSS 创建网页背景效果 在网页设计中,背景是一个重要的视觉元素,它可以为网…

39-5 入侵检测系统(IDS)- 安装配置IDS(注意我没安装成功,阅读需谨慎)

官网:Snort Rules and IDS Software Download 参考: (这位大佬分享了安装包下载链接):https://www.cnblogs.com/taoyuanming/p/12722263.html (安装过程参考这位大佬):Snort 安装与配置(CentOS 7)_centos 7 snort-CSDN博客一、安装 IDS(我这里在 CentOS 7 虚拟机中安…

【高校科研前沿】北师大陈晋教授团队在遥感顶刊发表最新成果:ClearSCD模型:在高空间分辨率遥感影像中综合利用语义和变化关系进行语义变化检测

01文章简介 论文名称:The ClearSCD model: Comprehensively leveraging semantics and change relationships for semantic change detection in high spatial resolution remote sensing imagery(ClearSCD模型:在高空间分辨率遥感影像中综合…

深度访谈:为何满意度调查中重点客户推荐企业选择此方式?

在竞争激烈的市场环境中,企业为了不断提升服务质量、巩固客户关系,常常需要进行满意度调查。然而,传统的问卷调查和电话访问虽便捷,却难以触及客户的真实感受与期望。尤其对于重点客户而言,他们的需求和反馈更是企业持…

DNS之区域文件

区域文件 BIND(Berkeley Internet Name Domain)是最广泛使用的DNS服务器软件,它可以将人类可读的网站名称转换为互联网上的IP地址。在BIND中,你可以创建和编辑区域文件,以定义DNS服务器应如何解析特定的域名。 区域文件…

x6.js bug记录-流程图json数据导入进来之后拖拽节点,节点直接飞走了

添加josn数据进来之后虽然能正常渲染,但是只要一拖拽,则节点就直接飞走了,看不到了。 找了一下午的问题,最后发现。保存的json坐标位置是字符串类型,而这边的位置必须是数字类型。如下: {position: { x: &…

Celery Redis 集群版连接和PyCharm启动配置

目录 使用Redis cluster版作为broker原因 PyCharm配置 使用Redis cluster版作为broker 在celery5及其之前版本,需要配置如下才可行 celery_app.conf.update( broker_transport_options{“global_keyprefix”: “{celery}:”}, ) 原因 https://github.com/celery/…

linux安装drm

apt 安装 sudo apt install libdrm-dev源码安装 安装工具 python3 -m pip install mesonpython3 -m pip install ninja源码编译 git clone https://gitlab.freedesktop.org/mesa/drm.gitmkdir buildmeson setup build --prefix$HOME/.drm/install# 或 重新配置到/usr/local# m…

【力扣】LCR 166.珠宝的最高价值

原题链接:. - 力扣(LeetCode) 目录 1.题目描述 2.思路分析 3.代码实现 1.题目描述 现有一个记作二维矩阵 frame 的珠宝架,其中 frame[i][j] 为该位置珠宝的价值。拿取珠宝的规则为: 只能从架子的左上角开始拿珠宝…

vue3+TS或JS, 实现粒子特效 @tsparticles/vue3

在跟着B站视频BV11s4y1a71T学习时,使用到了粒子效果,但是以下这种情况只适用于项目是基于typescript的写法,否则无法实现。 粒子效果 VUE3TStsparticles/vue31、安装2、main.ts 引入3、App.vue4、效果 VUE3JS非最新版1、安装低版本的vue3-pa…

【SpringBoot记录】自动配置原理(3):自动配置注解

前言 如果对注解有不太了解的,先行了解注解。这里做个简单的说明,个人理解注解就是对类、接口、方法、属性等添加一个标识,这些标识可以被编译器、开发工具或运行时环境识别,识别后即可在不改变原业务逻辑的情况下进行一些特定的…

【Web后端】jsp基础知识_请求转发和重定向

1.jsp基础知识 1.1简介 java server page&#xff0c;运行在服务器端的页面java代码html代码java代码全部都放在<%%>中间 1.2jsp表达式 作用&#xff1a;将动态信息显示在页面上&#xff0c;以字符串方式&#xff0c;返回给浏览器端语法&#xff1a;<%变量或表达式…

使用xtuner微调InternLM-Chat-7B

1. 安装xtuner #激活环境 source activate test_llm # 安装xtuner pip install xtuner#还有一些依赖项需要安装 future>0.6.0 cython lxml>3.1.0 cssselect mmengine 2. 创建一个ft-oasst1 数据集的工作路径&#xff0c;进入 mkdir ft-oasst1 cd ft-oasst1 3.XTune…

批量生成大量附件(如:excel,txt,pdf)压缩包等文件时前端超时,采用mq+redis异步处理和多线程优化提升性能

一.首先分析一下场景&#xff1a;项目中我需要从财务模块去取单证模块的数据来生成一个个excel文件 在单证那个一个提单号就是一个excel文件&#xff0c;我们这边一个财务发票可能会查出几千个提单&#xff0c;也就是会生成几百个excel&#xff0c;然后压缩为一个压缩包&#x…

【工具】2024年最新贵州省专业技术人员继续教育自动倍速刷课时脚本 - 篡改猴脚本

&#x1f525;&#x1f525;2024年最新贵州省专业技术人员继续教育自动倍速刷课时脚本|静音播放|自动跳过已完成的视频|解除防挂机提示|稳定极高 篡改猴脚本库国内地址&#xff1a;https://greasyfork.org/zh-CN/scripts/494638 一、自动播放脚本 脚本如下&#xff0c;仅供…

Zotero 使用入门(笔记)

参考文献&#xff1a;Zotero入门完整教程-共27节-免费&#xff0c;李长太>&#xff0c; 仅供参考学习

即插即用篇 | YOLOv8 引入 Strip Pooling | 重新思考场景解析的空间池化

本改进已集成到 YOLOv8-Magic 框架。 空间池化已被证明在捕获像素级预测任务的长距离上下文信息方面非常有效,如场景解析。在本文中,我们超越了通常具有N N规则形状的常规空间池化,重新思考空间池化的构成,引入了一种新的池化策略,称为条带池化,它考虑了一个长而窄的核,…

Redis不同数据类型value存储

一、Strings redis中String的底层没有用c的char来实现&#xff0c;而是使用SDS数据结构( char buf[])。 缺点:浪费空间 优势: 1.c字符串不记录自身的长度&#xff0c;所以获取一个字符串长度的复杂度是O(N),但是SDS记录分配的长度alloc,已使用长度len&#xff0c;获取长度的…