【001 基础知识】自旋锁、信号量

这篇具有很好参考价值的文章主要介绍了【001 基础知识】自旋锁、信号量。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、自旋锁

Linux 内核使用结构体 spinlock_t 表示自旋锁。

1. 定义:自旋锁最多只能被一个内核任务持有,如果一个内核任务试图请求一个已经被持有的自旋锁,那么这个任务就会一直进行忙循环——旋转——等待锁重新可用。

2. 作用:自旋锁可以在任何时刻防止多于一个的内核任务同时进入临界区,因此这种锁可有效地避免多处理器上并发运行的内核任务竞争共享资源。

3. 自旋锁的初衷:在短期间内进行轻量级的锁定。因为等待锁重新可用的期间进行自旋(特别浪费处理器时间)!

4. 注意:

1.自旋锁不允许任务睡眠,它能够在中断上下文中使用。

当线程 A得到锁以后会暂时禁止内核抢占(自旋锁会自动禁止抢占)。如果线程 A 在持有锁期间进入了休眠状态,那么线程 A 会自动放弃 CPU 使用权。线程 B 开始运行,线程 B 也想要获取锁,但是此时锁被 A 线程持有,而且内核抢占还被禁止了!线程 B 无法被调度出去,那么线程 A 就无法运行,锁也就无法释放,好了,死锁发生了! 

2.在中断里面使用自旋锁的时候,在获取锁之前一定要先禁止本地中断。

线程 A 先运行,并且获取到了 lock 这个锁,当线程 A 运行 functionA 函数的时候中断发生了,中断抢走了 CPU 使用权。右边的中断服务函数也要获取 lock 这个锁,但是这个锁被线程 A 占有着,中断就会一直自旋,等待锁有效。但是在中断服务函数执行完之前,线程 A 是不可能执行的,线程 A 说“你先放手”,中断说“你先放手”,场面就这么僵持着,死锁发生! 


二、信号量(睡眠锁)

Linux 内核使用 semaphore 结构体表示信号量。

1. 定义:信号量通常是一个整数变量,用于记录某个共享资源的可用数量,它可以被多个线程或进程同时访问和修改。(信号量本质是一个计数器)

2. 主要作用:它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。

3. 实例:比如,有100个停车位的停车场,门口电子显示屏上实时更新的停车数量就是一个信号 量。这个停车的数量就是一个信号量,他告诉我们是否可以停车进去。当有车开进去,信号量加一,当 有车开出来,信号量减一。


三、自旋锁和信号量的区别

1. 自旋锁只能用于互斥,信号量可用于互斥或作为计数信号量。

2. 自旋锁在任何给定时间只允许一个进程访问临界区。信号量允许在任何给定时间有多个进程访问临界区。

3. 自旋锁是一个忙等待过程,不会引起调用者睡眠,仅允许短时间被持有。 相比之下,信号量是一个睡眠等待过程会引起调用者睡眠,适用于锁被长时间持有的情况。。

信号量的概念比锁的范围更大, 可以说, 锁是信号量的一种特殊情况。

一般来说,自旋锁只在进程内有效,而信号量可同于控制多个进程之间的同步。

但是,无论是信号量(互斥),还是自旋锁,在任何时刻,最多只能有一个保持者,即在任何时刻最多只能有一个执行单元获得锁。这就是它们的"类似"。


四、自旋锁和信号量在互斥使用时需要注意哪些?

使用自旋锁的进程不能睡眠,使用信号量的进程可以睡眠。

五、在中断服务程序里面的互斥是使用自旋锁还是信号量?还是两者都能用?为什么?

自旋锁,因为自旋锁不会导致阻或者睡眠。文章来源地址https://www.toymoban.com/news/detail-483289.html

到了这里,关于【001 基础知识】自旋锁、信号量的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Linux C | 多线程编程】线程同步 | 信号量(无名信号量) 及其使用例子

    😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C++、数据结构、音视频🍭 🤣本文内容🤣:🍭介绍 🍭 😎金句分享😎:🍭你不能选择最好的,但最好的会来选择你——泰戈尔🍭 ⏰发布时间⏰: 本文未经允许,不得转发!!!

    2024年04月26日
    浏览(37)
  • 【Linux从入门到精通】信号量(信号量的原理与相关操作接口)详解

      本篇文章重点对 信号量的概念,信号量的申请、初始化、释放、销毁等操作进行讲解。同时举例把信号量应用到生产者消费者模型来理解 。希望本篇文章会对你有所帮助。 目录 一、信号量概念 1、1 什么是信号量 1、2 为什么要有信号量 1、3 信号量的PV操作 二、信号量的相

    2024年02月08日
    浏览(47)
  • uCOSii信号量

    uCOSii 信号量 主要用来测试使用uCOSii“创建信号量,发送信号量,接收信号量,删除信号量”。 学习uCOSii一定要先了解os_cfg.h文件。 信号量管理函数如下: OSSemAccept () 无条件地等待请求一个信号量函数,中断服务子程序只能用OSSemAccept()而不能用OSSemPend(),因为中断服务子程序是不

    2024年02月07日
    浏览(56)
  • 信号量

    信号量(semaphore)和信号只有一字之差,却是不同的概念, 信号量与之前介绍的IPC不同,它是一个计数器,用于实现进程间的互斥于同步 本文参考: Linux 的信号量_linux 信号量_行孤、的博客-CSDN博客 【Linux】Linux的信号量集_Yngz_Miao的博客-CSDN博客 Linux进程间通信(九)——信

    2024年02月12日
    浏览(50)
  • linux信号量

    通过学习linux的信号量,对linux的信号量进行了编程。

    2024年02月10日
    浏览(42)
  • linux(信号量)

    1.回顾信号量的概念 2.认识信号量对应的操作函数 3.认识一个环形队列 4.结合sem+环形队列写生产者消费者模型 --------------------------------------------------------------------------------------------------------------------------------- 1.回顾信号量的概念  每个人想进放映厅看电影,第一件事就是买票

    2024年02月11日
    浏览(42)
  • 信号量Semaphore详解

    大家应该都用过 synchronized 加锁,用来保证某个时刻只允许一个线程运行。那么如果控制某个时刻允许指定数量的线程执行,有什么好的办法呢? 答案就是JUC提供的信号量 Semaphore 。 Semaphore (信号量)可以用来限制能同时访问共享资源的线程上限,它内部维护了一个 许

    2024年02月14日
    浏览(52)
  • 并发编程 --- 信号量线程同步

    上文编码技巧 --- 同步锁对象的选定中,提到了在C#中,让线程同步有两种方式: 锁(lock、Monitor等) 信号量(EventWaitHandle、Semaphore、Mutex) 加锁是最常用的线程同步的方法,就不再讨论,本篇主要讨论使用信号量同步线程。 实际上,再C#中 EventWaitHandle 、 Semaphore 、 Mutex 都是

    2024年02月16日
    浏览(41)
  • 【Linux】浅谈信号量

    tips:system V 是一套标准,共享内存,信号量,消息队列属于system V。 进程A和进程B进行通信时,假如进程A向物理内存的共享区写入\\\"Hello World\\\",但是当进程A写入了\\\"Hello\\\"时,进程B就向内存读取了,所以只读取到了\\\"Hello\\\",这就导致进程A想向进程B发送的信息,进程B读取不完整,

    2024年02月05日
    浏览(43)
  • FreeRTOS教程5 信号量

    正点原子stm32f407探索者开发板V2.4 STM32CubeMX软件(Version 6.10.0) Keil µVision5 IDE(MDK-Arm) 野火DAP仿真器 XCOM V2.6串口助手 一个滑动变阻器 本文主要学习 FreeRTOS 信号量的相关知识, 包括创建/删除信号量、释放信号量、获取信号量等知识 信号量是进程间用于通信的一种手段,其是

    2024年03月15日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包