ly_1979425
驱动牛犊
驱动牛犊
  • 注册日期2002-08-04
  • 最后登录2005-05-11
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1633回复:6

有高手帮我看一下spin lock的含义是否解释正确

楼主#
更多 发布于:2003-10-24 22:56
Spin Lock为在共享内存(share memory)中互斥(mutual exclusion)独享内存资源所建的一种机制。因为共享内存的时候可以有很多进程共享同一段内存空间,所以,某些操作,如:有些原子操作(atomic operation)需要独享(exclusive access)某一段内存空间,这时候可以加上Spin Lock来做到这一点。

不知道对不对,请高手指点!

还有,有没有人能把windows下的 Spin Lock实现细节说一说!
我们一起来探讨!
david99
驱动牛犊
驱动牛犊
  • 注册日期2001-06-02
  • 最后登录2010-12-03
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-10-25 08:28
spin lock 主要是在smp 多处理器平台下完成对某些共享资源的同步
escape
驱动老牛
驱动老牛
  • 注册日期2002-02-01
  • 最后登录2004-08-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-10-25 09:31
多cpu的同步
ly_1979425
驱动牛犊
驱动牛犊
  • 注册日期2002-08-04
  • 最后登录2005-05-11
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-10-25 16:37
谢谢各位大侠指点!

有没有好的,详细的专著论述它吗?
能不能提供给大家!谢谢!
omo
omo
驱动牛犊
驱动牛犊
  • 注册日期2002-08-07
  • 最后登录2004-11-16
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-10-28 13:35
正如你所说,对于共享资源,当有多线程访问时,需要mutex。
多个CPU的情况也是如此,当遇到并行处理时,保有Spin Lock的资源能够保证同一事件,不仅仅只有一个线程能够访问,还能够保证同一时间,只有一个CPU能够访问该资源。
但是使用Spin Lock时应该注意调用IoAcquireSpinlock直到IoReleaseSpinLock,系统IRQL会被提升,有可能是,此时,必须注意。
钱就是驱动,驱动就是钱。
omo
omo
驱动牛犊
驱动牛犊
  • 注册日期2002-08-07
  • 最后登录2004-11-16
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-10-28 13:35
正如你所说,对于共享资源,当有多线程访问时,需要mutex。
多个CPU的情况也是如此,当遇到并行处理时,保有Spin Lock的资源能够保证同一时间,不仅仅只有一个线程能够访问,还能够保证同一时间,只有一个CPU能够访问该资源。
但是使用Spin Lock时应该注意调用IoAcquireSpinlock直到IoReleaseSpinLock,系统IRQL会被提升,有可能是,此时,必须注意。
钱就是驱动,驱动就是钱。
icube
驱动牛犊
驱动牛犊
  • 注册日期2002-04-11
  • 最后登录2004-12-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-10-31 17:03
给你们发一个spin-lock的实现代码吧,我不保证和windows中的实现一致,但基本思想一样


typedef ULONG_PTR KSPIN_LOCK, *PKSPIN_LOCK;

VOID STDCALL
KeInitializeSpinLock (PKSPIN_LOCK SpinLock)
{
   *SpinLock = 0;
}

VOID FASTCALL
KefAcquireSpinLockAtDpcLevel(PKSPIN_LOCK SpinLock)
{
   ULONG i;

   if (*SpinLock >= 2)
     {
DbgPrint(\"Lock %x has bad value %x\\n\", SpinLock, *SpinLock);
KEBUGCHECK(0);
     }
  
   while ((i = InterlockedExchange((LONG *)SpinLock, 1)) == 1)
     {
#ifndef MP
       DbgPrint(\"Spinning on spinlock %x current value %x\\n\", SpinLock, i);
       KEBUGCHECK(0);
#else /* not MP */
       /* Avoid reading the value again too fast , here need more process */
#endif /* MP */
     }
}


VOID FASTCALL
KefReleaseSpinLockFromDpcLevel(PKSPIN_LOCK SpinLock)
{
   if (*SpinLock != 1)
     {
DbgPrint(\"Releasing unacquired spinlock %x\\n\", SpinLock);
KEBUGCHECK(0);
     }
   (void)InterlockedExchange((LONG *)SpinLock, 0);
}

游客

返回顶部