自旋锁与信号量的区别是什么? 分别在什么场景下使用?

自旋锁与信号量作为同步机制,都是用来保护临界区的,但是它们的工作方式完全不一样。

  1. 自旋锁只有两种状态,即LOCKED与UNLOCKED。
    而信号量既可以作为互斥锁来使用(此时具有0和1两种状态),也可以作为资源计数器来使用(此时为正整数,具有不同的值,例如:0,1,2,...)
  2. 进程在获取自旋锁时,会持续地查询锁的状态(读改写的原子操作),若未获取到锁则CPU会处于一直忙等待状态,这正是“自旋”的含义。
    进程在获取信号量时,如果没有获取到则会转入睡眠状态,在未来的某个时间进程被唤醒并重新获取信号量。
  3. 自旋锁原本用于多核SMP环境下,在并发时进行临界区的保护,以上第2点讲到的忙等待就是这个情形下的经典操作。但是在单核环境下,其经典操作会有些不同。
    在单核的情形下,若开了抢占功能,则其等同于SMP的环境,也需要考虑并发的问题,采用禁止抢占来加锁,采用使能抢占来解锁。
    在单核的情形下,若没有开抢占功能,则自旋锁被优化为什么也不做。
  4. 在中断上下文(软中断,硬中断)使用自旋锁,需要使用带有中断操作的自旋锁版本。
  5. 自旋锁可以用在中断上下文。
    但是信号量不能用在中断上下文,因为它会睡眠,这是不允许的。
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值