spinlocked线程如何避免上下文切换的开销?

时间:2016-04-03 02:14:54

标签: multithreading operating-system

在维基百科中,有关自旋锁的文章。

  

因为它们避免了操作系统进程重新调度或上下文切换的开销,所以如果线程很可能仅在短时间内被阻塞,则自旋锁是有效的。

我实际上无法理解这句话。 我认为即使一个线程有一个螺旋锁,它会被重新安排,我错了吗?

上下文切换开销 - 这节省了寄存器,pc和amp;调度队列 - 对于所有交换机都是不变的,不是吗?

2 个答案:

答案 0 :(得分:2)

  我实际上无法掌握这句话。我认为即使是一个线程   有一个螺旋锁,它会被重新安排,我错了吗?

最终它会......当它的时间片到期时。

螺旋锁避免的是当线程尝试获取并且锁已经被另一个线程锁定时,线程立即切换 的可能性。

(在传统的互斥锁情况下,当互斥锁已被锁定时,线程将立即进入休眠状态,也就是上下文切换出来,并且在其他线程解锁互斥锁之后才会重新唤醒。在自旋锁定情况下,OTOH,线程将继续在紧密循环中检查自旋锁的状态,直到自旋锁不再被锁定,然后线程将锁定自旋锁。注意在该过程中的任何时候线程都不会询问内核让线程进入睡眠状态,虽然如果它旋转了很长时间,内核仍然可以做...但是使用自旋锁的程序无论如何都不会长时间锁定它们,因为旋转非常低效)

  

上下文切换开销 - 保存寄存器,pc&   调度队列 - 对于所有交换机都是常量,不是吗?

是的,我相信是。

答案 1 :(得分:0)

通常,OS只会在中断服务程序中使用自旋锁。这些设计的持续时间很短。

  

我实际上无法理解这句话。我认为即使一个线程有一个螺旋锁,它会被重新安排,我错了吗?

不是在处理中断时(这里简化只有一个IPL)。该中断可能是定时器中断,其中可能发生上下文切换。但是,在这种情况下,自旋锁等待将用于处理上下文切换所需的资源。