【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
自旋锁是SMP中经常使用到的一个锁。所谓的smp,就是对称多处理器的意思。在工业用的pcb板上面,特别是服务器上面,一个pcb板有多个cpu是很正常的事情。这些cpu相互之间是独立运行的,每一个cpu均有自己的调度队列。然而,这些cpu在内存空间上是共享的。举个例子说,假设有一个数据value = 10,那么这个数据可以被所有的cpu访问。这就是共享内存的本质意义。
我们可以看一段Linux 下的的自旋锁代码(kernel 2.6.23,asm-i386/spinlock.h),就可有清晰的认识了,
static inline void __raw_spin_lock(raw_spinlock_t *lock)
{
asm volatile("\n1:\t"
LOCK_PREFIX " ; decb %0\n\t"
"jns 3f\n"
"2:\t"
"rep;nop\n\t"
"cmpb $0,%0\n\t"
"jle 2b\n\t"
"jmp 1b\n"
"3:\n\t"
: "+m" (lock->slock) : : "memory");
}
上面这段代码是怎么做到自旋锁的呢?我们可以一句一句看看,
line 4: 对lock->slock自减,这个操作是互斥的,LOCK_PREFIX保证了此刻只能有一个CPU访问内存
line 5: 判断lock->slock是否为非负数,如果是跳转到3,即获得自旋锁
line 6: 位置符
line 7: lock->slock此时为负数,说明已经被其他cpu抢占了,cpu休息一会,相当于pause指令
line 8: 继续将lock->slock和0比较,
line 9: 判断lock->slock是否小于等于0,如果判断为真,跳转到2,继续休息
line 10: 此时lock->slock已经大于0,可以继续尝试抢占了,跳转到1
line 11: 位置符
上面的操作,除了第4句是cpu互斥操作,其他都不是。所以,我们发现,在cpu之间寻求互斥访问的时候,在某一时刻只有一个内存访问权限。所以,如果其他的cpu之间没有获得访问权限,就会不断地查看当前是否可以再次申请自旋锁了。这个过程中间不会停歇,除非获得访问的权限为止。
总结:
1)在smp上自旋锁是多cpu互斥访问的基础
2)因为自旋锁是自旋等待的,所以处于临界区的代码应尽可能短
3)上面的LOCK_PREFIX,在x86下面其实就是“lock”,gcc下可以编过,朋友们可以自己试试
分享到:
相关推荐
自旋锁不会引起调用者睡眠,如果一个执行线程试图获得一个已经被持有的自旋锁,那么线程就会一直进行忙循环,一直等待下去,在那里看是否该自旋锁的保持者已经释放了锁,\"自旋\"一词就是因此而得名。由于自旋锁使用...
根据《多处理器编程的艺术》一书第七章“自旋锁与争用”编写的C++代码,演示了10种锁的实现。代码为本人学习研究所用,欢迎高手赐教。
linux 自旋锁讨论记录,自旋锁与信号量有哪些差别,这里给出答案
信号量与自旋锁
轻量级锁并不是用来代替重量级锁的,它的本意是在没有多线程竞争的前提下,减少传统的重量 级锁使用产生的性能消耗。在解释轻量级锁的执行过程之前,先明白一点,轻量级锁所适应的场 景是线程交替执行同步块的情况...
本文章是关于信号量、互斥体和自旋锁的区别。
纯英文,专门解析自旋锁起因及解决方法,SQL SERVER DBA必备
基于SMP的Linux内核自旋锁分析.pdf
redis实现分布式锁,自旋式加锁,lua原子性解锁
并发控制之自旋锁.pdf
linux系统中基于自旋锁的进程调度的实现, 有代码和详细的文档说明,自旋锁(spinlock) 是用C和汇编指令实现的,有助于了解linux系统 内核的加锁机制。 很不错的哦。。。
一种Linux内核自旋锁死锁检测机制的设计与实现.pdf
线程同步(Thread Synchronization)是并行编程中非常重要的通讯手段,其中最典型的应用就是用Pthreads提供的锁机制(lock)来对多个线程之间共 享的临界区(Critical Section)进行保护(另一种常用的同步机制是barrier)。
在多线程并发编程中Synchronized一直是元老级角色,很多人都会称呼它为重量级锁,但是随着Java SE1.6对Synchronized进行了各种优化之后,有些情况下它并不那么重了,本文详细介绍了Java SE1.6中为了减少获得锁和释放...
对于互斥锁,如果资源已经被占用,自愿申请者只能进入睡眠状态。但自旋锁不会引起调用者睡眠
二:自旋锁示例 三:SpinLock 四:继续SpinLock 五:总结 一:基础 内核锁:基于内核对象构造的锁机制,就是通常说的内核构造模式。用户模式构造和内核模式构造 优点:cpu利用最大化。它发现资源被锁住,请求就...
对于一个高性能服务器在处理多数读取,少量写入的场景时,如果还是使用常规的互斥锁方式,显然就不明智了,这种读多写少的场景最适合使用读写锁方式,读取时不加锁,多线程并发读取,效率是最高的,要写入数据时堵塞...
与互斥锁的相比,在获取锁失败的时候不会使得线程阻塞而是一直自旋尝试获取锁。当线程等待自旋锁的时候,CPU不能做其他事情,而是一直处于轮询忙等的状态。自旋锁主要适用于被持有时间短,线程不希望在重新调度上花...
Windows驱动编程视频教程 详尽的讲解 里面还有屏幕录制的录像