Linux内核中的spin_lock

在Linux内核中,spin_lock是最基本的锁机制。spin_lock也翻译成自旋锁。它的用法是非常直观的。Linux提供了3个例程来使用它:

spin_lock(): 加锁。如果遇到自旋锁已经锁定,不停重试直到成功。
spin_unlock(): 解锁。
spin_trylock(): 加锁。如果遇到自旋锁已经锁定,不重试,返回失败码。

另外,为了在中断环境使用,还提供了两个宏:
spin_lock_irqsave():
spin_unlock_irqrestore():
分别在加锁时关中断,和在解锁时恢复中断。

具体使用时,要分单处理机和多处理机两类。先看单处理机的情况:

单处理机中如果是线程之间的互斥。那么因为持锁的线程不释放处理机,释放处理机时,已经解锁,别的线程将看不到别的线程持有了锁。spin_lock()或spin_trylock()加锁一加就成功,无需空转等待。如果是线程和中断之间的互斥。线程申请锁时,已经用spin_lock_irqsave()关了中断,中断服务被推迟,等到中断服务可以运行,线程已经释放了锁。所以中断服务也是看不到线程持有锁的,它申请加锁也是立刻获得,没有空转等待。反过来,中断服务运行的时候,线程被暂停,中断服务持有锁的情景,对线程也是不可见。

简单的说就是,在单处理机的环境中,持锁对别人不可见的,申请自旋锁一申请就成功。

在多处理机中。如果是线程之间的互斥,那么持有锁的情景只能被别的处理机上的线程看见。因为线程各有各的处理机,后来的线程使自己的处理机空转,而不影响持锁线程的处理。只要持锁时间足够短,短暂空转之后,锁可以很快获得,也不影响性能。同样,如果是线程和中断之间的互斥、中断和中断之间的互斥。也只能是不同处理机之间的线程和中断。短暂的空转等待是可行的,也是最快的。

因此自旋锁是linux内核中快速,开销小的锁机制。

猜你喜欢

转载自blog.csdn.net/aaasssdddd96/article/details/108754615