免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
21 [报告]
发表于 2005-11-03 22:53 |只看该作者
原帖由 Alligator27 于 2005-11-3 22:52 发表

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


惨绝的意思估计是OS根本不提供这样的功能给你
用户进程间的同步不能靠自旋锁

论坛徽章:
0
22 [报告]
发表于 2005-11-03 22:56 |只看该作者
并不是所有的spinlock都会yeild的.
spinlock是闪锁,也就是用一下就放,用spinlock主要是考虑到在smp环境下减少切换带来的系统开销.如果你大体不能预见lock的情况,那最好别用.
据我所知用户态没有spinlock.不过有些产品号称使用了spinlock的东西,我理解的可能是通过绑定实现的(猜测而已).

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:53:17
23 [报告]
发表于 2005-11-03 23:01 |只看该作者
原帖由 bleem1998 于 2005-11-3 22:53 发表


惨绝的意思估计是OS根本不提供这样的功能给你
用户进程间的同步不能靠自旋锁


看清楚了,偶叫帅绝

论坛徽章:
0
24 [报告]
发表于 2005-11-03 23:08 |只看该作者

论坛徽章:
0
25 [报告]
发表于 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
复制代码

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:53:17
26 [报告]
发表于 2005-11-04 09:50 |只看该作者
原帖由 Alligator27 于 2005-11-4 00:01 发表
OK. 如果你们有Linux/i386, 试一试这个程序. 我们再接着讨论.

[code]

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>


long
__attrib ...

NBNB,我先研究下,争取推翻你的结论

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:53:17
27 [报告]
发表于 2005-11-04 11:04 |只看该作者
鳄鱼兄,我运行了你的程序,没问题呀,很simply地用Ctrl+C就把程序杀掉了。

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:53:17
28 [报告]
发表于 2005-11-04 11:09 |只看该作者
LOCK并不是一个独立的指令,它只是一个指令前缀,而且只能作用于紧随其后的那条指令,而非全部。
所以,正在spinning的CPU,还是有能力响应中断的;相反,如果你步步都锁住了总线,那么连中断也无法响应了。

不过我很奇怪为什么LOCK不象sidt之类是特权指令

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

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

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

...

为什么要求特权呢? 因为它可能占太多CPU? 你不是试验了, 可以很容易把它踢出来吗.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP