本文目录一览

1,自旋锁和互斥锁的区别 java中lock Syntronized区别

自旋锁(Spin lock) 自旋锁与互斥锁有点类似,只是自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持,调用者就一直循环在那里看是 否该自旋锁的保持者已经释放了锁,"自旋"一词就是因此而得名。其作用是为了解决某项资源的互斥使用。...

自旋锁和互斥锁的区别 java中lock Syntronized区别

2,关于旋转锁spin lock的解释

spin lock一般翻译为自旋锁,简单的理解是这样的,它和信号量差不多。 信号量:线程在无信号时会阻塞,阻塞时会释放CPU,让其它线程用。 自旋锁:自旋锁在得不到锁的状态下也会阻塞,但阻塞时不释放CPU,一直占用CPU,相当于在死循环。 如果想看比较专业的解释,可以参考: http://baike.baidu.com/view/1250961.html?wtp=tt

关于旋转锁spin lock的解释

3,信号量和自旋锁的区别如何选择使用

由于信号量不受睡眠的限制,所以通常来说更加简单一些。当需要在自旋锁和信号量中作选择时,选择结果应该取决于锁被持有的时间长短。理想的情况是所有的锁都应该尽可能短的占有,但如果锁的持有时间比较长,使用信号量是更好的选择。信号量不会关闭内核抢占,所以持有自旋锁的代码可以被抢占。所以信号量不会对影响调度反应时间带来负面影响。
由于信号量不受睡眠的限制,所以通常来说更加简单一些。当需要在自旋锁和信号量中作选择时,选择结果应该取决于锁被持有的时间长短。理想的情况是所有的锁都应该尽可能短的占有,但如果锁的持有时间比较长,使用信号量是更好的选择。信号量不会关闭内核抢占,所以持有自旋锁的代码可以被抢占。所以信号量不会对影响调度反应时间带来负面影响。

信号量和自旋锁的区别如何选择使用

4,spinlock自旋锁是如何实现的

在 x86 平台上,spinlock 主要通过处理器的 lock 指令前缀实现当某个线程的一条指令访问某个内存的时候,其他的线程的指令无法访问该内存的功能。因此在 spinlock 初始化阶段,将锁变量中的值某个值 k 赋为1。在加锁的时候,使用 lock decl (%eax) 指令互斥地将该变量变成0,并且将结果是否问0 赋值给 EFLAGS寄存器 的对应位。只有加上锁的线程才会结果才是0,其他线程的结果不是0。接着通过判断该对应位判断是否加上锁。如果没有加上,则循环执行 lock decl (%eax),直到加上为止。其中 %eax 是这个变量的地址。这里用的是gcc 的AT&T语法的汇编。
说实话 真不不太清楚 可以去网上看看啊

5,确定选用自旋锁和信号量的原则有哪些

1当锁不能被获取时,使用信号量的开销是进城上下文切换Tsw,使用自旋锁是等待获取自旋锁时间Tcs,若Tcs比较小用自旋锁,若Tsw大用信号量。2)信号量所保护的临界区可包含可能引起阻塞的代码,而自旋锁绝对要避免用来保护这样代码的临界区。因为阻塞意味着要进行进程切换,如果进程被切换,另一个进程企图获得本自旋锁,死锁就发生。3)信号量存在进程上下文,因此,如果被保护的共享资源需要在中断或软中断情况下使用,则在信号量和自旋锁之前只能选择自旋锁,当然如果一定要使用信号量,则只能通过down_trylock(),不能获取就返回以避免阻塞。
由于信号量不受睡眠的限制,所以通常来说更加简单一些。 当需要在自旋锁和信号量中作选择时,选择结果应该取决于锁被持有的时间长短。理想的情况是所有的锁都应该尽可能短的占有,但如果锁的持有时间比较长,使用信号量是更好的选择。 信号量不会关闭内核抢占,所以持有自旋锁的代码法筏瘁禾诓鼓搭态但卡可以被抢占。所以信号量不会对影响调度反应时间带来负面影响。

6,自旋锁的自旋锁原理

跟互斥锁一样,一个执行单元要想访问被自旋锁保护的共享资源,必须先得到锁,在访问完共享资源后,必须释放锁。如果在获取自旋锁时,没有任何执行单元保持该锁,那么将立即得到锁;如果在获取自旋锁时锁已经有保持者,那么获取锁操作将自旋在那里,直到该自旋锁的保持者释放了锁。由此我们可以看出,自旋锁是一种比较低级的保护数据结构或代码片段的原始方式,这种锁可能存在两个问题:死锁。试图递归地获得自旋锁必然会引起死锁:递归程序的持有实例在第二个实例循环,以试图获得相同自旋锁时,不会释放此自旋锁。在递归程序中使用自旋锁应遵守下列策略:递归程序决不能在持有自旋锁时调用它自己,也决不能在递归调用时试图获得相同的自旋锁。此外如果一个进程已经将资源锁定,那么,即使其它申请这个资源的进程不停地疯狂“自旋”,也无法获得资源,从而进入死循环。过多占用cpu资源。如果不加限制,由于申请者一直在循环等待,因此自旋锁在锁定的时候,如果不成功,不会睡眠,会持续的尝试,单cpu的时候自旋锁会让其它process动不了. 因此,一般自旋锁实现会有一个参数限定最多持续尝试次数. 超出后, 自旋锁放弃当前time slice. 等下一次机会由此可见,自旋锁比较适用于锁使用者保持锁时间比较短的情况。正是由于自旋锁使用者一般保持锁时间非常短,因此选择自旋而不是睡眠是非常必要的,自旋锁的效率远高于互斥锁。信号量和读写信号量适合于保持时间较长的情况,它们会导致调用者睡眠,因此只能在进程上下文使用,而自旋锁适合于保持时间非常短的情况,它可以在任何上下文使用。如果被保护的共享资源只在进程上下文访问,使用信号量保护该共享资源非常合适,如果对共享资源的访问时间非常短,自旋锁也可以。但是如果被保护的共享资源需要在中断上下文访问(包括底半部即中断处理句柄和顶半部即软中断),就必须使用自旋锁。自旋锁保持期间是抢占失效的,而信号量和读写信号量保持期间是可以被抢占的。自旋锁只有在内核可抢占或SMP(多处理器)的情况下才真正需要,在单CPU且不可抢占的内核下,自旋锁的所有操作都是空操作,上面简要介绍了自旋锁的基本原理,以下将给出具体的例子,进一步阐释自旋锁在实际系统中的应用。上面我们已经讲过自旋锁只有在内核可抢占或SMP(多处理器)的情况下才真正需要,下面我们就以SMP为例,来说明为什么要使用自旋锁,以及自旋锁实现的基本算法。

文章TAG:自旋锁  互斥  互斥锁  区别  自旋锁  java中lock  Syntronized区别  
下一篇