免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: bleem1998
打印 上一主题 下一主题

谁能解释一下,自旋锁spinlock [复制链接]

论坛徽章:
0
1 [报告]
发表于 2005-11-02 21:56 |显示全部楼层
spinlock 用于CPU同步, 它的实现是基于CPU锁定数据总线的指令.
当某个CPU锁住数据总线后, 它读一个内存单元(spinlock_t)来判断这个spinlock 是否已经被别的CPU锁住. 如果否, 它写进一个特定值, 表示锁定成功, 然后返回. 如果是, 它会重复以上操作直到成功, 或者spin次数超过一个设定值. 锁定数据总线的指令只能保证一个机器指令内, CPU独占数据总线.
单CPU当然能用spinlock, 但实现上无需锁定数据总线.

论坛徽章:
0
2 [报告]
发表于 2005-11-03 03:06 |显示全部楼层
原帖由 柳五随风 于 2005-11-2 23:04 发表
spinlock在锁定的时候,如果不成功,不会睡眠,会持续的尝试,单cpu的时候spinlock会让其它process动不了.

一般spinlock实现会有一个参数限定最多持续尝试次数. 超出后, spinlock放弃当前time slice. 等下一次机会.

论坛徽章:
0
3 [报告]
发表于 2005-11-03 03:14 |显示全部楼层
原帖由 lenovo 于 2005-11-2 23:11 发表
在书上抄的,我也不懂。

自旋锁是一种保护数据结构或代码片段的原始方式,
在某个时刻只允许一个进程访问临界区内的代码。

用户空间, 应当是进程内只允许一个线程访问临界区内的代码.
内核进程共享地址空间, 进程之间互斥是没错.

论坛徽章:
0
4 [报告]
发表于 2005-11-03 09:37 |显示全部楼层
原帖由 bleem1998 于 2005-11-3 08:24 发表
有三果问题不清楚
1,单CPU内核中,假设好几个内核线程用spinlock共享一块数据,一个时间只有一个线程得到锁,那是不是其它没有得到锁的线程都在疯狂的自旋中?

2,内核里似乎到处都有spinlock,在单CPU系统下 ...


1. Yes. 但spinlock只适用于short lock.

2. 单CPU, 或SMP, 都是同步锁

3. Yes

论坛徽章:
0
5 [报告]
发表于 2005-11-03 22:28 |显示全部楼层
原帖由 帅绝人寰 于 2005-11-3 22:08 发表

前边有的说话不是十分确切。补充一下。

spin的意思,就是自旋、旋转。意思是说,如果加锁操作不成功,CPU就一直在spinning旋转,直到成功加锁为止。很显然,用户态不存在自旋锁,否则OS就乱套了。
大体上, ...

楼上说 "很显然,用户态不存在自旋锁,否则OS就乱套了". 是OS不准许用户用自旋锁吗? 还是用户用了自旋锁OS就乱套?

论坛徽章:
0
6 [报告]
发表于 2005-11-03 22:52 |显示全部楼层
原帖由 帅绝人寰 于 2005-11-3 22:30 发表


OS不可能提供如此之大的权限给用户程序,因为如果这样,我可以非常简单的在用户层制造死锁事件。

死锁用户程序? 还是死锁OS?

论坛徽章:
0
7 [报告]
发表于 2005-11-04 00:01 |显示全部楼层
OK. 如果你们有Linux/i386, 试一试这个程序. 我们再接着讨论.



  1. #include <pthread.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <unistd.h>


  5. long
  6. __attribute__ ((__unused__))
  7. InterlockedExchange(long* ipLong, long iNewVal)
  8. {
  9.         register long __result;
  10.         __asm__ __volatile__ ("lock; xchgl %0,%2"
  11.                                                         : "=r" (__result)
  12.                                                         : "0" (iNewVal), "m" (*ipLong)
  13.                                                         : "memory");
  14.         return __result;
  15. }


  16. typedef long spinlock_t;

  17. #define MAX_SPIN 500
  18. #define UNLOCKED 1
  19. #define LOCKED   0

  20. class SpinLock
  21. {
  22. public:
  23.         SpinLock() { mLock=UNLOCKED; }
  24.         ~SpinLock() {}

  25.         void Lock();
  26.         void Unlock() { InterlockedExchange(&mLock, UNLOCKED); }

  27. private:
  28.         spinlock_t mLock;
  29. };

  30. void SpinLock::Lock()
  31. {
  32.         while (1)
  33.         {
  34.                 for(int count=0; count<MAX_SPIN; count++)
  35.                 {
  36.                         if(InterlockedExchange(&mLock, LOCKED) != LOCKED)
  37.                                 return;
  38.                 }
  39.                 ::sched_yield();
  40.         }
  41. }

  42. int main()
  43. {
  44.         int rc=0;

  45.         SpinLock aLock;

  46.         // Get lock
  47.         aLock.Lock();

  48.         // Release lock
  49.         aLock.Unlock();

  50.         // dead lock
  51.         aLock.Lock();
  52.         aLock.Lock();
  53.        

  54.         /**********************************************************************
  55.         ** I will never get this far.
  56.         **********************************************************************/
  57.         return rc;
  58. }

  59. > g++ -m32 foo.cpp
  60. > a.out
复制代码

论坛徽章:
0
8 [报告]
发表于 2005-11-04 11:38 |显示全部楼层
原帖由 帅绝人寰 于 2005-11-4 11:04 发表
鳄鱼兄,我运行了你的程序,没问题呀,很simply地用Ctrl+C就把程序杀掉了。

我没说有问提啊. 写这个程序是想说. 用户可以有spinlock. 能达到内核一样的互斥, 而且不会锁死系统.

论坛徽章:
0
9 [报告]
发表于 2005-11-04 11:43 |显示全部楼层
原帖由 帅绝人寰 于 2005-11-4 11:09 发表
LOCK并不是一个独立的指令,它只是一个指令前缀,而且只能作用于紧随其后的那条指令,而非全部。
所以,正在spinning的CPU,还是有能力响应中断的;相反,如果你步步都锁住了总线,那么连中断也无法响应了。

...

为什么要求特权呢? 因为它可能占太多CPU? 你不是试验了, 可以很容易把它踢出来吗.

论坛徽章:
0
10 [报告]
发表于 2005-11-04 21:36 |显示全部楼层
终于明白了我于帅兄的分歧.我只写用户层的code. 对内核一无所知.

从用户程序的角度来看,spinlock适用于保护非常短的code, 比如几条指令,(象链表操作), 也就是柳五随风提到的闪锁,这比mutex快很多,而且所用资源仅一个寄存器长的内存.它的目的不是要 "除了中断谁都不响应,而且即使是中断,中断返回时也还是必然返回到自旋的那段代码,继续自旋"
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP