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

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

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

你可能感兴趣的:(自旋锁与信号量的区别是什么? 分别在什么场景下使用?)