免费注册 查看新帖 |

Chinaunix

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

[内核同步] 用户态自旋锁和内核态自旋锁的区别? [复制链接]

论坛徽章:
0
21 [报告]
发表于 2015-02-09 22:59 |只看该作者
回复 19# DVD0423


是否理解为当Cpu在自旋的时候,至少本地CPU的内核抢占是被禁止的。不知道这个理解是否正确。


   

论坛徽章:
0
22 [报告]
发表于 2015-02-10 10:51 |只看该作者
回复 4# 镇水铁牛

现在的内核自旋锁用的是ticket spinlock, 就是排队自旋锁,这样就实现了公平性,减少了锁释放时产生的cpu争用锁开销,同时在linux里如果一个自旋锁一直自旋不释放,达到一定阈值后就会进入睡眠状态,有人说睡眠了还在running,这点我表示怀疑。

我觉得只有暴露自己的错误才能进步,如果我说的不对请勿鄙视
   

论坛徽章:
0
23 [报告]
发表于 2015-02-10 11:20 |只看该作者
回复 2# amarant
用户态(ring3)如果想使用内核(ring0)的东西,要进行系统调用,进行系统调用(中断)的开销很大,要进行用户态上下文的保存。所以我感觉用户态的自旋锁应该不会是系统调用吧(我主要研究内核态,所以不确定)。

还有大家看看我的理解是不是错的,我也想知道:在x86硬件上,操作系统运行在ring0,可以执行任何指令,而用户态运行在ring3上,只能执行自己进程相关指令,这样就保证了系统安全。同时用户态不必经过内核态,内核只是一种管理工具,只有在用户需要扩权,需要运行一些ring0的指令的时候才经过内核态,而这个途径就是系统调用。(个人见解,如果有人告诉我错了,那我才能认识的更深入)

对了,用户态调用内核态的东西是不是只有系统调用这个唯一途径?

论坛徽章:
8
羊年新春福章
日期:2015-03-19 02:03:312015亚冠之北京国安
日期:2015-06-16 22:04:45程序设计版块每日发帖之星
日期:2015-06-23 22:20:00每日论坛发贴之星
日期:2015-06-23 22:20:002015亚冠之首尔
日期:2015-06-24 19:18:072015亚冠之广州恒大
日期:2015-08-06 10:29:442015亚冠之柏太阳神
日期:2015-11-02 11:21:0515-16赛季CBA联赛之辽宁
日期:2015-12-09 15:05:02
24 [报告]
发表于 2016-05-31 11:26 |只看该作者
本帖最后由 firocu 于 2016-05-31 11:27 编辑

我来贴段gcc里面的实现, 可以看出来是没有差别的(FIXME):
  1. int
  2. pthread_spin_lock (pthread_spinlock_t *lock)
  3. {
  4.   /* atomic_exchange usually takes less instructions than
  5.      atomic_compare_and_exchange.  On the other hand,
  6.      atomic_compare_and_exchange potentially generates less bus traffic
  7.      when the lock is locked.
  8.      We assume that the first try mostly will be successful, and we use
  9.      atomic_exchange.  For the subsequent tries we use
  10.      atomic_compare_and_exchange.  */
  11.   if (atomic_exchange_acq (lock, 1) == 0)
  12.     return 0;

  13.   do  
  14.     {   
  15.       /* The lock is contended and we need to wait.  Going straight back
  16.          to cmpxchg is not a good idea on many targets as that will force
  17.          expensive memory synchronizations among processors and penalize other
  18.          running threads.
  19.          On the other hand, we do want to update memory state on the local core
  20.          once in a while to avoid spinning indefinitely until some event that
  21.          will happen to update local memory as a side-effect.  */
  22.       if (SPIN_LOCK_READS_BETWEEN_CMPXCHG >= 0)
  23.         {
  24.           int wait = SPIN_LOCK_READS_BETWEEN_CMPXCHG;

  25.           while (*lock != 0 && wait > 0)
  26.             --wait;
  27.         }
  28.       else
  29.         {
  30.           while (*lock != 0)
  31.             ;
  32.         }
  33.     }   
  34.   while (atomic_compare_and_exchange_val_acq (lock, 1, 0) != 0);

  35.   return 0;
  36. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP