最近在看alios-things的代码发现驱动程序中大量使用了自旋锁 。
如tty.c里面的函数实现都是通过自旋锁来实现对资源的访问保护。

看到这里首先会有疑问,自旋锁能保护临界区吗?
一般来说,自旋锁是用于多核系统的不同核心之间对同一个数据区的竞争访问,对于同一个核上的不同线程是不具备防护功能的。(网上有文章解析自旋锁是让线程原地等待,并没有突出smp环境下的核间竞争,这是不对的,自旋锁就是永远多核处理器之间的资源防护,而不是多线程的资源防护)

怀着上述疑问,打开aos_spinlock.c看一下相关接口底层实现,发现这些spinlock操作实际上是复合了关中断的操作的。
所以,看到这里,这些接口应该命名为aos_irqlock_xxx更为合适。不然在单核情况下,这里的自旋锁就仅保存了锁中断功能,名字和功能就对不上了。

另外,继续深入的想一想,驱动中大量使用关中断是否合适呢?
在大量io存在的情况下,这种关中断可能要降低系统性能,这时候互斥锁应该是更好的选择。
互斥锁在lock、unlock时会有短暂的关中断,在锁持有过程中是不需要关闭中断的。这样也就可以在大量io的过程给中断以及其他线程运行的机会,可以在io过程更充分的利用处理器资源。

网上也有讨论不关中断,独立使用自旋锁的,如果确信自己在干什么,当然也没问题,如果是设计一套通用的接口提供给其他用户使用,并不能确定用户的使用场景,还是老老实实关中断使用吧。

上网搜了一下自旋锁,发现不少错误描述,很多将自旋锁和互斥锁做对比的,解析的也比较雷同,都是一些在阅读代码过程中产生的一些感性认识,缺乏理论依据。

下面是我对自旋锁的总结,如果有疑问或者不对的地方请留言指正,感谢!

首先,自旋锁是为解决多核系统的资源竞争而设计的,需要处理器的原子操作来实现。其次,自旋锁是其他内核保护机制的底层基础,如信号量、互斥锁等在多核系统里是要依赖自旋锁来实现其功能。

单核情况下,只要关闭中断,系统就相当是独占的,但是在多核情况下,关闭中断,只能保证当前处理器不被抢夺,而不能保证其他处理器核上的线程来竞争资源 。

多核情况下,处理器提供了特殊指令实现对单元数据的原子访问,可以允许每个核心来对该单元数据的状态进行原子的设置操作,如果有多核同时进行这一设置操作,则只有一个会成功,其他的返回失败,失败的可以重复这一过程,直到成功,这就是自旋锁的实现原理。
根据上述描述可知,自旋锁的持有时间要尽可能的短,否则,可能导致其他处理器被长时间自旋挂起。传统的互斥量、信号量等内核元素就是获得自旋锁后快速对自身变量完成设置后归还自旋锁(设置自旋锁为空闲状态)。

正确使用自旋锁、互斥锁相关推荐

  1. 自旋锁/互斥锁/读写锁/递归锁的区别与联系

    自旋锁 互斥锁 读写锁 递归锁 互斥锁(mutexlock): 最常使用于线程同步的锁:标记用来保证在任一时刻,只能有一个线程访问该对象,同一线程多次加锁操作会造成死锁:临界区和互斥量都可用来实现此锁 ...

  2. Python之路(第三十八篇) 并发编程:进程同步锁/互斥锁、信号量、事件、队列、生产者消费者模型...

    一.进程锁(同步锁/互斥锁) 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的, 而共享带来的是竞争,竞争带来的结果就是错乱,如何控制,就是加锁处理. 例 ...

  3. android 线程互斥锁,线程锁(互斥锁Mutex)及递归锁

    一.线程锁(互斥锁) 在一个程序内,主进程可以启动很多个线程,这些线程都可以访问主进程的内存空间,在Python中虽然有了GIL,同一时间只有一个线程在运行,可是这些线程的调度都归系统,操作系统有自身 ...

  4. iOS开发中自旋和互斥锁的理解以及所有锁的性能比较

    补充: 可以看到除了 OSSpinLock 外,dispatch_semaphore 和 pthread_mutex 性能是最高的.苹果在新系统中已经优化了 pthread_mutex 的性能,所以它 ...

  5. 自己如何实现自旋锁,互斥锁和读写锁

    锁 C语言协程库实现 锁是很常见的同步原语,那么锁的实现原理是怎样的呢?下面我们就自己模拟实现一下各种锁来更好地理解锁的实现和代价. 自旋锁 自旋锁是一种成本较低的锁,因为它只会在当前cpu循环忙等直 ...

  6. 可重入锁(递归锁) 互斥锁属性设置

    前言: 上一次刷博客的时候,看到了自旋锁,通过学习Linux内核,对自旋锁有了一定的了解.在学习的过程中看到这么一句话--自旋锁是不可递归的.自旋锁不可递归,难道有可以递归的锁?带着这个问题,我们来看 ...

  7. JUC锁-互斥锁ReentrantLock(二)

    ReentrantLock介绍 ReentrantLock是一个可重入的互斥锁,又被称为"独占锁". 顾名思义,ReentrantLock锁在同一个时间点只能被一个线程锁持有:而可 ...

  8. 线程安全: 互斥锁和自旋锁(10种)

    无并发,不编程.提到多线程就很难绕开锁?. iOS开发中较常见的两类锁: 1. 互斥锁: 同一时刻只能有一个线程获得互斥锁,其余线程处于挂起状态. 2. 自旋锁: 当某个线程获得自旋锁后,别的线程会一 ...

  9. 高效编程之互斥锁和自旋锁

    两种锁的加锁原理 互斥锁:线程会从sleep(加锁)-->running(解锁),过程中有上下文的切换,cpu的抢占,信号的发送等开销. 自旋锁:线程一直是running(加锁-->解锁) ...

  10. 并发编程中常见的锁机制:乐观锁、悲观锁、CAS、自旋锁、互斥锁、读写锁

    文章目录 乐观锁 VS 悲观锁 悲观锁 乐观锁 CAS CAS机制 ABA问题 CAS的优缺点 互斥锁 VS 自旋锁 互斥锁 自旋锁 对比及应用场景 读写锁 实现方式 读写锁 VS 互斥锁 乐观锁 V ...

最新文章

  1. shell操作典型案例--FTP操作
  2. opencv 中affine函数实现旋转和平移
  3. Zabbix监控系统安装与使用
  4. python大神作品_Python大神成长之路: 第一次学习记录
  5. 执行公式_一学就会,一吃就瘦,超简单又好执行的减肥食谱公式!
  6. 查询linux版本信息 sp,查看Linux系统版本和内核信息
  7. 1.8_heapq模块_优先队列
  8. Java类的初始化顺序 (静态变量、静态初始化块、变量、初始...
  9. 8 mv命令_Linux常用操作命令——文件和目录操作
  10. 为什么技术人员要具备产品思维?
  11. 用js屏蔽脚本加载的广告
  12. Spring使用标签aop:aspectj-autoproxy 出的一些错
  13. 03 计算机视觉-opencv图像形态学处理
  14. 2021-10-18_windows实时查看Nvidia显卡使用情况
  15. android资源收藏
  16. TI芯片(335x、437x、572x)uboot设置logo居中
  17. Pytorch官方文档英语翻译
  18. 解决建立时间与保持时间不满足的问题
  19. QT(Send raw data to printer)发送原始数据到USB打印机
  20. 2020年中国新基建七大产业链全景图

热门文章

  1. 什么是低代码平台 low-code?
  2. 如何提升自己的硬实力
  3. 基于容器云技术的典型遥感智能解译算法集成
  4. 松弛法求解给定边界条件的泊松方程
  5. linux修改时区时间est->cst
  6. 2016年终总结——学生时代的结束、北漂生活的开始
  7. 【MySQL必知必会--理论】
  8. Excel使用VBA自动调整插入图片大小到单元格
  9. Qt--QTablewidgets 表格插入图片,且可以自动调整图片的大小
  10. c++ 不撞南墙不回头——树形动态规划(树规)