- 论坛徽章:
- 0
|
本帖最后由 titer1 于 2012-08-28 19:52 编辑
这个话题关注很久了。
没有找到完整的定论。
如何才能更全面的了解spin lock啦?
我认为要至少2方面的领域来看:
理论上,
还有代码上(读代码,运行代码,debug代码,甚至修改、移植spinlock相关)
我当前的认识有两点:
它使用的是 test and set 的思想。
更底层的说,是多核机器上,锁住了总线(数据总线)。
不知道大家有补充没有?我想更系统的看待这个问题。但是找到的资料总是感觉说的不清楚,连贯不起来。
所以我试着总结了下。希望大家指教。
test and set 参考于:
Linux 的 Spinlock 在 MIPS 多核处理器中的设计与实现
http://www.ibm.com/developerwork ... ock_mips/index.html
我小结了下:
Spinlock 的设计思想是基于一种被称为 Test-and-Set 的机制,
C 语言是无法实现 Test-and-Set 的机制的,因为它无法在多核之间建立一个交互的机制.
还见于:
windows下的spinlock实现 from mouseos
http://www.mouseos.com/post/SpinLock.html
小结:
不断测试并尝试上锁的过程。
test-and-set可以用简要的指令实现:
lock bts dword ptr [spinlock], 0
或者 xchg eax, [spinlock]
这些指令底层都是作用于 锁住总线 进行原子操作。
关于总线详细见于以下:
关于单CPU,多CPU上的原子操作
http://hi.baidu.com/gamedot/item/90f4d381723e505927ebd9da
要点:spinlock 用于CPU同步, 它的实现是基于CPU锁定数据总线的指令.
关于spin lock 实现浅谈 //更新 2012-8-28 from 百度搜索研发,他是以ngnix为原型进行讲解的。当然你可以学习在不同架构下的spinlock实现,见下面。
nginx实现了spin lock以保护多进程对listen port的互斥accept。spinlock的实现如下:
![]()
Spinlock本质上是一个“忙等”锁,由于其不存在下节中总结的mutex的缺点,其对于小资源是最高效的锁。相比上节中mutex的PTHREAD_MUTEX_ADAPTIVE_NP属性,nginx的spinlock是一个更完美的实现方案。
附有热心的代码
给需要的你:
分析Linux中Spinlock在ARM及X86平台上的实现
http://www.embedu.org/Column/Column241.htm
|
评分
-
查看全部评分
|