Linux系统接口--信号量、互斥锁、原子操作和自旋锁的区别

1、基本概念

1.1 信号量(Semaphore)

(1)定义

信号量是一种计数器,用于控制对共享资源的访问,允许多个线程同时访问一定数量的资源。

(2)特点

  • 计数型信号量: 信号量有一个计数值,可以允许多个线程同时访问,当计数值为0时,新的请求线程将被阻塞。
  • 阻塞机制: 当资源不可用时,请求信号量的线程会进入睡眠状态,直到资源可用。
  • 适用于多资源: 可用于管理有限数量的相同资源,例如连接池。
  • 进程间同步: 信号量可以用于线程间和进程间的同步。

(3)使用场景

  • 控制对有限资源的并发访问,例如数据库连接池。
  • 需要线程阻塞等待资源的情况。
  • 进程间的同步操作。

1.2 互斥锁(Mutex Lock)

(1)定义

互斥锁是一种用于保护临界区的锁机制,确保同一时间只有一个线程能够访问共享资源。

(2)特点

  • 二元信号量: 互斥锁可以看作是只能取0和1的信号量。
  • 拥有者概念: 锁被某个线程持有,只有持有锁的线程才能解锁。
  • 阻塞机制: 当锁已被占用,请求锁的线程会被阻塞,直到锁被释放。
  • 防止优先级反转: 互斥锁通常支持优先级继承等机制。

(3)使用场景

  • 需要对共享资源进行独占访问的情况。
  • 保护临界区,防止数据竞争和不一致性。
  • 线程间同步,需要阻塞等待资源。

1.3 原子操作(Atomic Operation)

(1)定义

原子操作是不可被中断的单个操作,保证在多线程环境下对共享变量的操作是安全的,无需加锁。

(2)特点

  • 无锁机制: 不使用锁,不会导致线程阻塞或上下文切换。
  • 硬件支持: 依赖于CPU提供的原子性指令,如compare-and-swap。
  • 操作范围有限: 通常只能对单个变量进行简单的读写、加减等操作。
  • 高性能: 因为避免了锁的开销,性能更高。

(3)使用场景

  • 对单个变量进行简单的计数、标志位设置等操作。
  • 高性能要求的场景,避免锁的开销。
  • 实现无锁的数据结构或算法的一部分。

1.4 自旋锁(Spinlock)

(1)定义

自旋锁是一种非阻塞锁,当锁不可用时,线程会在循环中反复检查锁是否可用,不会进入睡眠。

(2)特点

  • 忙等待: 请求锁的线程会一直占用CPU资源,等待锁的释放。
  • 适用于短临界区: 由于忙等待的特性,适合锁持有时间非常短的情况。
  • 不能在用户空间使用: 通常用于内核空间,用户空间的使用会导致资源浪费。
  • 可用于中断上下文: 因为不涉及睡眠,可以在中断处理程序中使用。

(3)使用场景

  • 内核中需要保护短时间的临界区。
  • 中断处理程序或需要快速响应的地方。
  • 不允许睡眠的环境,如中断上下文。

2、详细比较

2.1 阻塞与非阻塞

2.1.1 信号量和互斥锁:

  • 都是阻塞型同步机制。
  • 当资源不可用时,请求的线程会进入睡眠状态,等待资源释放。

2.1.2 自旋锁和原子操作:

  • 都是非阻塞型机制。
  • 自旋锁会忙等待,占用CPU资源。
  • 原子操作直接在硬件层面保证操作的原子性,无需等待。

2.2 适用场景

2.2.1 信号量:

  • 适用于需要管理多个相同资源的并发访问。
  • 线程可能需要长时间等待资源的场景。

2.2.2 互斥锁:

  • 适用于需要独占访问资源的情况。
  • 临界区可能需要较长时间,阻塞等待是可以接受的。

2.2.3 自旋锁:

  • 适用于内核空间的短临界区。
  • 不适合长时间等待,否则会浪费CPU资源。

2.2.4 原子操作:

  • 适用于对单个变量的简单操作。
  • 高性能要求,不希望引入锁的开销。

2.3 性能开销

2.3.1 信号量:

  • 开销较大,涉及线程的阻塞和唤醒,需要上下文切换。
  • 适合等待时间较长的情况。

2.3.2 互斥锁:

  • 开销比信号量小,但仍涉及上下文切换。
  • 适合等待时间中等的情况。

2.3.3 自旋锁:

  • 开销取决于等待时间,等待时间越短,性能越高。
  • 等待时间长会导致CPU资源浪费。

2.3.4 原子操作:

  • 最小的性能开销,无需上下文切换或等待。
  • 适合简单的操作。

2.4 可重入性与死锁

  • 信号量:没有拥有者的概念,可能导致死锁或资源泄漏,需要小心管理。
  • 互斥锁:有拥有者概念,支持递归锁(设置递归锁),但需要防止死锁。
  • 自旋锁:不可重入,持有锁的线程如果再次请求锁,会导致死锁。
  • 原子操作:不存在锁的概念,不会产生死锁。

2.5 使用环境

  • 信号量和互斥锁:可用于用户空间和内核空间。
  • 自旋锁:主要用于内核空间,不适合用户空间。
  • 原子操作 可用于用户空间和内核空间,依赖于硬件支持。

2.6 资源管理

  • 信号量: 需要维护计数器和等待队列,资源开销较大。
  • 互斥锁:资源开销适中,主要是锁的状态和拥有者信息。
  • 自旋锁:资源开销小,只需要一个锁变量。
  • 原子操作:资源开销最小,只涉及操作的变量本身。

3、总结

3.1 信号量:

  • 优点: 适合管理多个资源,可以阻塞线程,节省CPU。
  • 缺点: 开销大,可能导致死锁或优先级反转。
  • 使用建议: 当需要管理有限数量的资源,且可以接受线程阻塞时使用。

3.2 互斥锁:

  • 优点: 简单易用,防止多个线程同时进入临界区。
  • 缺点: 可能导致死锁,需要小心设计。
  • 使用建议: 当需要保护临界区,并且可以接受线程阻塞时使用。

3.3 自旋锁:

  • 优点: 不涉及上下文切换,适合短临界区。
  • 缺点: 忙等待可能浪费CPU资源,不适合长时间等待。
  • 使用建议: 在内核空间,临界区非常短且不能阻塞的情况下使用。

3.4 原子操作:

  • 优点: 高性能,无锁化,避免了锁带来的复杂性和开销。
  • 缺点: 只能对单个变量进行简单操作,功能有限。
  • 使用建议: 当需要对单个变量进行简单的、线程安全的操作时使用。

3.5 优先级反转:

  • 互斥锁通常支持优先级继承,能缓解优先级反转问题。
  • 信号量和自旋锁不直接支持,需要额外机制。

3.6 实时性要求:

  • 自旋锁和原子操作由于不涉及阻塞,更适合实时性要求高的场合。
  • 信号量和互斥锁可能因为阻塞导致不可预测的延迟。

3.7 复杂度:

  • 原子操作最简单,但功能有限。
  • 自旋锁实现简单,但需要注意死锁和CPU资源浪费。
  • 互斥锁和信号量功能强大,但需要小心设计以避免死锁和性能问题。

3.8 对比表格

对比表格

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

FSMC寄存器方式初始化及LCD函数

环境 芯片:STM32F103ZET6 库:stm32f10x.h 原理图 代码 Driver.FSMC.h #ifndef __DRIVER_FSMC #define __DRIVER_FSMC #include "stm32f10x.h"void Driver_FSMC_Init(void);#endifDriver.FSMC.c #include "Driver_FSMC.h"/*** 配置FSMC(Flexi…

最新免费商用无版权素材(免费图库 抠图 PNG 插画素材)

今天我要给大家揭秘几个私藏的宝藏网站——那些免费、商用无版权的素材资源站!🎉 这些站点简直好用到爆炸💥,每次需要找素材,它们总能秒速响应,让我们的工作效率直线飙升!🚀 这里不…

32岁前端干了8年,是继续做前端开发,还是转其它工作_ui设计师转开发

前端发展有瓶颈,变来变去都是那一套,只是换了框架换了环境。换了框架后又得去学习,虽然很快上手,但是那些刚毕业的也很快上手了,入门门槛越来越低,想转行或继续卷,该如何破圈? 这是一位网友的自…

nmap 命令:网络扫描

一、命令简介 ​nmap​(Network Mapper)是一个开放源代码的网络探测和安全审核的工具。它最初由Fyodor Vaskovich开发,用于快速地扫描大型网络,尽管它同样适用于单个主机。 ​nmap​的功能包括: 发现主机上的开放端…

基于 BERT 的自定义中文命名实体识别实现

基于 BERT 的自定义中文命名实体识别实现 在自然语言处理中,命名实体识别(Named Entity Recognition,NER)是一项重要的任务,旨在识别文本中的特定实体,如人名、地名、组织机构名等。本文将介绍如何使用 BERT 模型实现自定义中文命名实体识别,并提供详细的代码分析和解读…

SpringBoot3自动配置(持续更新)

博客主页:音符犹如代码系列专栏:JavaWeb关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ 自动配置 在SpringBoot中,自动配置是一个核心的特性,…

(done) 声音信号处理基础知识(1) (course overview)

来源:https://www.youtube.com/watch?viCwMQJnKk2c 声学处理应用场景如下 这个系列的内容包括如下: 作者的 slack 频道 油管主的 github repo: https://github.com/musikalkemist/AudioSignalProcessingForML

将PDF文件转换为音频播客、讲座和摘要PDF2Audio;Open WebUI Ollama的代码执行工具

✨ 1: PDF to Audio Converter PDF转音频转换器可以将PDF文件转换为音频播客、讲座和摘要,支持多种自定义选项。 PDF to Audio Converter 是一款强大的工具,能够将PDF文档转换为音频格式,例如播客、讲座和摘要等。该工具利用OpenAI的GPT模型…

5.MySQL表的约束

目录 表的约束空属性(非空约束)默认值(default约束)列描述(comment)zerofill主键(primary key约束)自增长(auto_increment)唯一键(unique约束&…

Python酷玩之旅_mysql-connector

前言 Python作为数据科学、机器学习等领域的必选武器,备受各界人士的喜爱。当你面对不同类型、存储于各类介质的数据时,第一时间是不是要让它亮个相?做个统计,画个图表,搞个报表… 等等。 正如Java中的JdbcDriver一样…

高效驱动,掌控动力:TB67H400AFNG 马达驱动器

在如今智能设备和自动化应用领域中,驱动器的性能直接决定了系统的可靠性与效率。东芝的TB67H400AFNG有刷直流马达驱动器凭借其卓越的性能,成为众多行业解决方案中的关键部件。无论是工业控制、自动化设备还是消费类电子产品,TB67H400AFNG都能…

嵌入式综合实验平台-嵌入式综合实训实验箱

1、基本介绍 嵌入式综合实验平台(eeLab-BaseKit)是中智讯公司开发的一款信息类学科的综合型实验设备,配套丰富的教学实验和开发例程,可以满足电子信息工程专业的专业核心课程及专业方向课程的教学、实验和实训需求,包括《嵌入式接…

如何使用ssm实现基于VUE的儿童教育网站的设计与实现+vue

TOC ssm676基于VUE的儿童教育网站的设计与实现vue 第一章 课题背景及研究内容 1.1 课题背景 信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安全…

OpenHarmony(鸿蒙南向开发)——小型系统内核(LiteOS-A)【LMS调测】

往期知识点记录: 鸿蒙(HarmonyOS)应用层开发(北向)知识点汇总 鸿蒙(OpenHarmony)南向开发保姆级知识点汇总~ 持续更新中…… 基本概念 LMS全称为Lite Memory Sanitizer,是一种实时…

基于单片机的精确电压表DA-AD转换

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机,采用DAC0832和ADC0832检测电压,0到8.5V,设计复位电路 LED管显示实际稳压值,初始电压0 二、硬件资源 基于KEIL5编写C代码&#xff0c…

regPractice-正则表达式练习

正则表达式练习(java) 1 . 校验密码强度 密码的强度必须是包含大小写字母和数字的组合,不能使用特殊字符,长度在8-10之间。 ^(?.*\d)(?.*\[a-z])(?.*[A-Z])[a-zA-Z\d]{8,10}$**(?pattern)**属于正向前瞻断言 正向前瞻断言的语法是 (?pattern)&a…

【React与Vue】如何在页签中监听 LocalStorage 变化?这些方法你都试过吗?

在开发中,你是否会碰到过这样的需求:需要监听 LocalStorage 的变化。这在不同浏览器页签间是相对简单的,因为浏览器提供了内置的 storage 事件。但在同一个浏览器页签下,却没有直接的方式实现。今天,我们探讨下有几种高…

化工企业如何精准网络营销

合作咨询联系竑图 hongtu201988 网络推广已成为各行各业不可或缺的一部分,尤其是化工企业,其产品的专业性和复杂性更需要通过有效的网络推广手段来触达目标客户群体。以下是一份针对化工企业的网络推广方案,旨在通过多渠道的营销策略&#x…

【机器学习】---元强化学习

目录 1. 元学习简介1.1 什么是元学习?1.2 元学习的应用 2. 强化学习基础2.1 什么是强化学习?2.2 强化学习的基本框架2.3 深度强化学习 3. 元强化学习的概念与工作原理3.1 元强化学习是什么?3.2 元强化学习与普通强化学习的区别 4. 元强化学习…

Google 提供基于AI的模糊测试框架

人工智能驱动的 OSS-Fuzz 工具可以帮助发现漏洞,并与自动修补管道相结合。 模糊测试可以成为找出软件中零日漏洞的宝贵工具。为了鼓励开发人员和研究人员使用它,谷歌周三宣布,免费提供其模糊测试框架OSS-Fuzz。 根据谷歌的说法,通…