什么是“自旋锁”?

时间:2009-12-24 08:34:21

标签: spinlock

我总是想知道它们是什么:每当我听到它们的时候,未来派飞轮式装置的图像就会在我脑海中跳舞(滚动?)......

他们是什么?

11 个答案:

答案 0 :(得分:103)

当您使用常规锁(互斥锁,关键部分等)时,操作系统会通过调度同一核心上的其他线程将您的线程置于WAIT状态并preempts。如果等待时间非常短,则性能会受到影响,因为您的线程现在必须等待preemption再次接收CPU时间。

此外,内核对象在内核的每个状态中都不可用,例如在中断处理程序中或者在分页不可用时等。

Spinlocks不会导致抢占,而是在循环中等待(“旋转”)直到另一个核心释放锁定。这可以防止线程丢失其quantum并在锁释放后立即继续。自旋锁的简单机制允许内核在几乎任何状态下使用它。

这就是为什么在单核心机器上,自旋锁只是一个“禁用中断”或“引发IRQL”,它会完全阻止线程调度。

Spinlock最终允许内核避免“Big Kernel Lock”(当核心进入内核并在出口处释放时获得锁定)并且对内核基元进行粒度锁定,从而在多核机器上实现更好的多处理,从而提高性能

编辑:提出了一个问题:“这是否意味着我应该尽可能使用自旋锁?”我会尽力回答:

正如我所提到的,Spinlocks仅在预期等待时间短于量子(读取:毫秒)的地方有用,并且抢占没有多大意义(例如,内核对象不可用)。

如果等待时间未知,或者您处于用户模式,则Spinlocks效率不高。在检查自旋锁是否可用时,您在等待核心上消耗100%的CPU时间。在量程到期之前,您可以阻止其他线程在该核心上运行。此方案仅适用于内核级别的短突发,并且不太可能是用户模式应用程序的选项。

以下是SO的问题:Spinlocks, How Useful Are They?

答案 1 :(得分:19)

假设资源受锁保护,想要访问资源的线程需要先获取锁。如果锁不可用,则线程可能会反复检查是否已释放锁。在此期间线程忙等待,检查锁,使用CPU,但没有做任何有用的工作。这种锁被称为旋转锁。

答案 2 :(得分:17)

它几乎是一个循环,一直持续到达到某个条件:

while(cantGoOn) {};

答案 3 :(得分:7)

 while(something != TRUE ){};
 // it happend
 move_on();

答案 4 :(得分:5)

这是一种执行busy waiting

的锁

它被认为是一种反模式,除了非常低级别的驱动程序编程(在这种情况下,调用“正确”的等待函数会比仅仅忙于锁定几个周期的开销更多)。

请参阅示例Spinlocks in Linux kernel

答案 5 :(得分:3)

SpinLocks是线程在锁定可用之前等待的。这通常用于避免在某个小时间段内获取内核对象的范围时获取内核对象的开销。

例如:

While(SpinCount-- && Kernel Object is not free)
{}

try acquiring Kernel object

答案 6 :(得分:3)

当您认为在资源被锁定时进入忙碌的等待循环并集中资源而不是阻塞时,您会想要使用自旋锁。

  

当锁具细粒度且数量较多(例如,链表中的每个节点锁定)以及锁定保持时间总是非常短时,旋转可能是有益的。通常,在持有自旋锁的同时,应该避免阻塞,调用本身可能阻塞的任何东西,同时持有多个自旋锁,进行动态调度的调用(接口和虚拟),使静态分派的调用进入任何代码都没有#&# 39;拥有或分配记忆。

     

由于性能原因,注意SpinLock是一种值类型也很重要。因此,必须非常小心,不要意外复制SpinLock实例,因为这两个实例(原始和副本)将完全相互独立,这可能会导致应用程序的错误行为。如果必须传递SpinLock实例,则应通过引用而不是值传递它。

答案 7 :(得分:1)

简而言之,spinlock采用原子比较和交换(CAS)或测试和设置之类的指令来实现无锁,等待免费的线程安全习惯用法。这种结构在多核机器中可以很好地扩展。

答案 8 :(得分:0)

这是一个旋转的循环,直到满足条件。

答案 9 :(得分:0)

嗯,是的 - 旋转锁定(与传统的关键部分等相比)是它们在某些情况下提供更好的性能(多核系统......),因为它们不能立即产生线程量子的其余部分。

答案 10 :(得分:0)

Spinlock,是一种锁具,它是无阻挡的。非睡眠能力。任何想要为任何共享或关键资源获取自旋锁的线程都将不断旋转,浪费CPU处理周期,直到获得指定资源的锁定为止。一旦获得了螺旋锁,它就会尝试在其量子中完成工作,然后分别释放资源。 Spinlock是锁定的最高优先级类型,可以说,它是非先发制人的锁。