免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 8215 | 回复: 15
打印 上一主题 下一主题

[CPU及多核] 使用spin_lock_irqsave为什么不允许睡眠 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-07-18 14:10 |只看该作者 |倒序浏览
 在单cpu下 使用spin_lock_irqsave 会变成
{
   preempt_disable()
        local_irq_save();
}
在使用这个函数的时候 如果用了schedule 为什么不可以呢?

是因为调度另一个进程之后不行呢?

还是根本无法调度另一个进程 ?

不能睡眠的原因能够从源码角度帮我分析一下吗?

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
2 [报告]
发表于 2014-07-18 16:34 |只看该作者
因为这里关了中断,如果schedule出去了,就无法再次进行调度了。。

论坛徽章:
0
3 [报告]
发表于 2014-07-18 19:22 |只看该作者
回复 2# humjb_1983


    那么schedule出去 运行一个新的进程  这个进程会怎样处理呢?假如这个进程也是要访问临界区 也运行到spin_lock_irqsave这个函数..这个时候也会发生什么?

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
4 [报告]
发表于 2014-07-18 20:11 |只看该作者
那就死锁了。
另外关键的问题是,调度到其它进程后,由于时钟中断已关,将无法再进行调度了。

论坛徽章:
0
5 [报告]
发表于 2014-07-18 20:31 |只看该作者
回复 4# humjb_1983

我更想知道的是 它"死"在哪里?因为新的进程运行的spin_lock_irqsave..这个函数在单CPU上只是 preempt_disable和local_irq_save而已.再次关抢占和关中断会导致它死锁吗?还是死锁在其它地方?


   

论坛徽章:
0
6 [报告]
发表于 2014-07-18 20:32 |只看该作者
回复 4# humjb_1983


    也就是说 在单cpu上并没有"自旋"操作呀..也就是没有do_raw_spin_lock呀..

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
7 [报告]
发表于 2014-07-18 22:31 |只看该作者
单核上,关中断和抢占其实就达到锁的目的了。
想了一下,这个问题确实还有点复杂。
关中断了以后,调度到其它进程,应该会一直运行,但是如果其中有系统调用或者运行到最后(会exit),其实还是有调度时机的,进程最终执行晚后,应该会调度到idle进程。。
但关中断后,问题还在于,时钟中断没有了,应该会有其它的问题。(但后面处理过程中有可能会开中断~)
光这样想,可能一些细节想不清楚,建议可以实际测试一下。

论坛徽章:
0
8 [报告]
发表于 2014-07-19 12:29 |只看该作者
回复 7# humjb_1983


    对 我就是迷惑...如果对方的进程也访问到 临界区 遇到spin_lock_irqsave 又是怎样呢?

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
9 [报告]
发表于 2014-07-19 15:32 |只看该作者
如果其它进程也获取同一把锁,应该就死锁了吧,因为是忙等,而且不会再调度~

论坛徽章:
0
10 [报告]
发表于 2014-07-19 18:17 来自手机 |只看该作者
如果不考虑实时进程的存在,在spin lock irqsave 保护的代码中调用睡眠函数只会导致性能问题,不会死锁。看实现schedule函数是会调用关中断,选择新进程后开中断,所以在撇去中断处理函数情形外,和不考虑和实时进程竞争时,不会死锁的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP