免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5184 | 回复: 13

[进程管理] 请问进程在preempt_disable后,还能永久执行而不被调度吗? [复制链接]

论坛徽章:
0
发表于 2014-06-16 14:52 |显示全部楼层
在preempt_disable后,是不能被其他高优先级进程再抢占调度,但是在时间片到后,还能够继续执行吗?

谢谢。

论坛徽章:
0
发表于 2014-06-16 15:15 |显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
17
水瓶座
日期:2013-08-29 12:09:27白羊座
日期:2014-08-07 12:36:42丑牛
日期:2014-07-24 12:44:41寅虎
日期:2014-04-16 16:15:33寅虎
日期:2014-03-12 09:28:43摩羯座
日期:2014-03-06 13:22:04技术图书徽章
日期:2014-03-06 11:34:50天蝎座
日期:2014-01-09 11:31:44寅虎
日期:2013-12-27 17:01:44双子座
日期:2013-12-27 12:32:29双子座
日期:2013-12-25 09:03:33丑牛
日期:2013-12-24 16:18:44
发表于 2014-06-16 15:18 |显示全部楼层
回复 1# kerryxi

spin_lock(deadlock);
spin_lock(deadlock);

然后你看看时间片到了它是运行还是不运行。。。。spin_lock()内就调用了 preempt_disable()

论坛徽章:
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
发表于 2014-06-16 18:48 |显示全部楼层
本帖最后由 humjb_1983 于 2014-06-16 19:43 编辑

时间片到了应该会调度的,之前以为关中断了~

论坛徽章:
0
发表于 2014-06-17 08:34 |显示全部楼层
谢谢各位牛人解答,但是本人看代码,系统也是会调度的样子,但是如果preempt_disable被调度之后,本cpu上面的其他任务执行,如果也调用spin_lock,这样这个cpu不就是被死锁了吗?

另外,最常用的get_cpu来获取per_cpu变量,就是为了防止本cpu抢占而使得per_cpu变量不一致,如果使用中间调度出去,per_cpu不也是同样被**了一致性吗?

论坛徽章:
17
水瓶座
日期:2013-08-29 12:09:27白羊座
日期:2014-08-07 12:36:42丑牛
日期:2014-07-24 12:44:41寅虎
日期:2014-04-16 16:15:33寅虎
日期:2014-03-12 09:28:43摩羯座
日期:2014-03-06 13:22:04技术图书徽章
日期:2014-03-06 11:34:50天蝎座
日期:2014-01-09 11:31:44寅虎
日期:2013-12-27 17:01:44双子座
日期:2013-12-27 12:32:29双子座
日期:2013-12-25 09:03:33丑牛
日期:2013-12-24 16:18:44
发表于 2014-06-17 09:43 |显示全部楼层
回复 5# kerryxi

你说的死锁不太明白什么意思!而且你要注意的是 preempt_count是属于thread_info的,每个进程都有自己的 thread_info。

论坛徽章:
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
发表于 2014-06-17 11:06 |显示全部楼层
再看了下代码,更正下我之前的说法,在preempt_disable之后,如果进程不主动调度的话,应该不会调度到其它进程,在最关键的调度时机(中断/异常返回处):
ENTRY(resume_kernel)
        DISABLE_INTERRUPTS(CLBR_ANY)
        cmpl $0,TI_preempt_count(%ebp)        # non-zero preempt_count ? //这里判断了是否可抢占,如果不可抢占的话,就直接返回到内核态了
        jnz restore_all
need_resched:
        movl TI_flags(%ebp), %ecx        # need_resched set ?
        testb $_TIF_NEED_RESCHED, %cl
        jz restore_all
个人理解,这种情况下应该不会发生调度,除非进程主动schedule。
具体可以请lz使用asuka2001的例子试一下。

论坛徽章:
0
发表于 2014-06-17 11:13 |显示全部楼层
谢谢asuka2001的回复。

preempt_count是属于thread_info, 就是因为thread_info相关,所以如果进程在preempt_disable后别切换出去了,spin lock才存在死锁的情况。

如进程A:
spin_lock(&lock)
critial_code
...
//need long long time to exec , and it may be scheduled out due to time slice over
spin_unlock

如果调度器切换当前的cpu到进程B,B也要使用相同的lock,此时cpu就不会永久的spin来等待同cpu的spin lock释放,但是显然此spin lock不会被释放了。
进程B:
spin_lock(&lock)
critial_code
spin_unlock

谢谢。

论坛徽章:
17
水瓶座
日期:2013-08-29 12:09:27白羊座
日期:2014-08-07 12:36:42丑牛
日期:2014-07-24 12:44:41寅虎
日期:2014-04-16 16:15:33寅虎
日期:2014-03-12 09:28:43摩羯座
日期:2014-03-06 13:22:04技术图书徽章
日期:2014-03-06 11:34:50天蝎座
日期:2014-01-09 11:31:44寅虎
日期:2013-12-27 17:01:44双子座
日期:2013-12-27 12:32:29双子座
日期:2013-12-25 09:03:33丑牛
日期:2013-12-24 16:18:44
发表于 2014-06-17 11:22 |显示全部楼层
回复 8# kerryxi

。。。其实你自己都已经回答了你自己的问题了。

既然是 原子上下文,要是能调度出去,那使用 spinlock()还有什么意义呢。

论坛徽章:
17
水瓶座
日期:2013-08-29 12:09:27白羊座
日期:2014-08-07 12:36:42丑牛
日期:2014-07-24 12:44:41寅虎
日期:2014-04-16 16:15:33寅虎
日期:2014-03-12 09:28:43摩羯座
日期:2014-03-06 13:22:04技术图书徽章
日期:2014-03-06 11:34:50天蝎座
日期:2014-01-09 11:31:44寅虎
日期:2013-12-27 17:01:44双子座
日期:2013-12-27 12:32:29双子座
日期:2013-12-25 09:03:33丑牛
日期:2013-12-24 16:18:44
发表于 2014-06-17 11:35 |显示全部楼层
本帖最后由 asuka2001 于 2014-06-17 11:40 编辑

回复 9# asuka2001

不过我自己开始二胡了。。。我做了下测试,结果让我郁闷了。

ps -eo pid,state,args,psr | grep R
  PID S COMMAND                     PSR
    7 R [migration/1]                 1
   10 R [watchdog/1]                  1
   11 R [events/0]                    0
   12 R [events/1]                    1
3839 R /usr/bin/python /usr/bin/no   0
4112 R [loop1]                       1
4135 R /usr/bin/python /usr/bin/ci   0
5058 R /usr/lib/vmware-tools/sbin6   0
8984 R insmod hello.ko               1
9296 R ps -eo pid,state,args,psr     0
9297 R grep R                        0

hello.ko是死锁内核模块,我插入了之后,结果还是有其他的内核线程认为自己是 R在 CPU 1上的。。。这个是为什么呢?

-------------

自己脑袋发蒙。。。R值得不是运行,而是 running or runnable!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP