自旋锁与信号量及其区别
为了避免并发,防止竞争。内核提供了一组同步方法来提供对共享数据的保护。 我们
的重点不是介绍这些方法的详细用法,而是强调为什么使用这些方法和它们之间的差别。
Linux 使用的同步机制可以说从 2.0 到 2.6 以来不断发展完善。从最初的原子操作,到
后来的信号量,从大内核锁到今天的自旋锁。这些同步机制的发展伴随 Linux 从单处理器
到对称多处理器的过度;伴随着从非抢占内核到抢占内核的过度。锁机制越来越有效,也越
来越复杂。
目前来说内核中原子操作多用来做计数使用,其它情况最常用的是两种锁以及它们的变
种:一个是自旋锁,另一个是信号量。我们下面就来着重介绍一下这两种锁机制。
自旋锁:
自旋锁是专为防止多处理器并发而引入的一种锁,它在内核中大量应用于中断处理等部
分(对于单处理器来说,防止中断处理中的并发可简单采用关闭中断的方式,不需要自旋
锁)。
自旋锁最多只能被一个内核任务持有,如果一个内核任务试图请求一个已被争用(已经被持
有)的自旋锁,那么这个任务就会一直进行忙循环——旋转——等待锁重新可用。要是锁未
被争用,请求它的内核任务便能立刻得到它并且继续进行。自旋锁可以在任何时刻防止多于
一个的内核任务同时进入临界区,因此这种锁可有效地避免多处理器上并发运行的内核任务
竞争共享资源。
事实上,自旋锁的初衷就是:在短期间内进行轻量级的锁定。一个被争用的自旋锁使得
请求它的线程在等待锁重新可用的期间进行自旋(特别浪费处理器时间),所以自旋锁不应该
被持有时间过长。如果需要长时间锁定的话, 最好使用信号量。
自旋锁的基本形式如下:
评论0