免费注册 查看新帖 |

Chinaunix

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

自旋锁 可抢占内核中使用自旋锁跟使用信号量有什么区别? [复制链接]

论坛徽章:
0
21 [报告]
发表于 2014-11-14 20:45 |只看该作者
我有看了一个帖子,http://bbs.csdn.net/topics/310267570
是这样解释的

spin lock的自动禁止抢占的
也就是说,A如果那到锁以后,内核的抢占暂时被禁止。然后它休眠了,切换到另一个进程B(注意,这不是抢占,是进程自己放弃CPU)。等到进程B想要获得这个锁时发生了死锁,尽管B的时间片会被用完,但由于内核抢占被禁止了,所以B不会被调度出去。
更糟的情况是,如果A用irq save方式来得到这个spin lock,那中断是被禁止的,时钟中断不会被响应,B的时间片根本不会被跟新。

不知道这个解释是否正确,如果正确,说明这个解释相当的经典呀,呵呵

论坛徽章:
9
辰龙
日期:2014-08-18 20:38:42未羊
日期:2014-09-04 08:50:45丑牛
日期:2014-09-06 00:12:55寅虎
日期:2014-12-22 20:50:56摩羯座
日期:2015-01-14 22:28:15巳蛇
日期:2015-01-23 20:39:272015年辞旧岁徽章
日期:2015-03-03 16:54:1515-16赛季CBA联赛之青岛
日期:2016-03-13 23:37:1915-16赛季CBA联赛之深圳
日期:2016-03-29 18:52:38
22 [报告]
发表于 2014-11-14 21:30 |只看该作者
回复 21# gududesiling


大哥,你跟别人4年前发的贴干嘛。很少人关注的。

拿了spin_lock再去主动调用schedule函数本来就是一个错误的用法。甚至在schedule函数里强制加入了判断:
  1. static noinline void __schedule_bug(struct task_struct *prev)
  2. {
  3.         struct pt_regs *regs = get_irq_regs();

  4.         printk(KERN_ERR "BUG: scheduling while atomic: %s/%d/0x%08x\n",
  5.                 prev->comm, prev->pid, preempt_count());

  6.         debug_show_held_locks(prev);
  7.         if (irqs_disabled())
  8.                 print_irqtrace_events(prev);

  9.         if (regs)
  10.                 show_regs(regs);
  11.         else
  12.                 dump_stack();
  13. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP