Chinaunix

标题: schedule() 会被中断和return吗? [打印本页]

作者: rockcanon    时间: 2014-01-28 16:11
标题: schedule() 会被中断和return吗?
本帖最后由 rockcanon 于 2014-01-28 17:34 编辑

schedule()要做很多事情:
• checking for exceptions: Section 7.3.1;
• removing caller from runqueue, if necessary: Section 7.3.2;
• selecting next process to run: Section 7.3.3;
• recording scheduling decision: Section 7.3.4;
• context switching: Section 7.3.5.

想问的是,这个函数做这么多的事情,是一直做完不会被中断,还是这个过程可能会被中断?

还有,是不是注定schedule()只能执行到switch_to()就拐弯了? 如果这样,那__schedule_tail()什么情况下才能执行呢?
(2.6是context_switch(),  和 finish_task_switch())
作者: wenkai169    时间: 2014-01-28 17:23
本帖最后由 wenkai169 于 2014-01-28 17:23 编辑

1.第一个问题不是好清楚,需要查阅资料,但我认为是可以的,因为中断中从来没调用过schedule,而非中断中经常都看见在schedule
2.不会return,等下次该你执行的时候,你是被调度回来的
作者: rockcanon    时间: 2014-01-28 17:25
时钟中断没调用schedule()吗?
作者: wenkai169    时间: 2014-01-28 17:38
rockcanon 发表于 2014-01-28 17:25
时钟中断没调用schedule()吗?


那个叫scheduler_tick(),如果当前进程是实时进程,这个函数什么都不做,否则就进行调度和平衡,和你说的schedule应该不一样:wink:
作者: humjb    时间: 2014-01-29 16:20
schedule可以中断,但自身执行时间短,一般不会
作者: humjb    时间: 2014-01-29 16:20
schedule可以中断,但自身执行时间短,一般不会
作者: humjb    时间: 2014-01-29 16:21
schedule不会返回
作者: humjb    时间: 2014-01-29 16:25
schedule可以中断,但自身执行时间短,一般不会
作者: smalloc    时间: 2014-01-29 22:53
抢占式不会,一开始就禁止抢占了.
自调度会.但由上可知最多被抢占一次.而switch_to部分也是被禁止抢占保护的.所以这里虽然在schedule()中被切换出去,仍然可在切换回来的时候继续执行schedule()完成第2次切换.
作者: mordorwww    时间: 2014-02-02 10:29
schedule 肯定是不能重入的啊,这点必须保证
作者: linuxfellow    时间: 2014-02-06 10:22
调度schedule()是不允许被抢占的
作者: gaojl0728    时间: 2014-02-06 13:11
你看看schedule函数的实现, 他一开始执行就会关中断同时禁止内核抢占
作者: omycle    时间: 2014-02-09 20:27
本帖最后由 omycle 于 2014-02-09 22:27 编辑

1. 是否可以中断的问题 ,在schedule()函数刚开始的时候,就有preempt_disable()和spin_lock_irq。即,禁止抢占并关闭中断。其实,对于schedule本身,只要禁止抢占就没问题了。这里的spin_lock_irq主要是为了锁住runqueue。(2.6.10的版本)
2. 任何一个进程(刚被fork出来的除外)在拿住cpu开始运行的时候,都是从context_switch->__switch_to()中,上次被切换出去的地方继续执行的。
3. (接上)所以finsh_task_switch(prev)是由新进程执行的,处理之前的进程(prev)遗留的东西(在v2.4中,是__schedule_tail()把prev 的task_struct结构中policy字段里的SCHED_YIELD位清掉(可参见Linux内核情景分析))
作者: mordorwww    时间: 2014-02-10 08:56
wenkai169 发表于 2014-01-28 17:38
那个叫scheduler_tick(),如果当前进程是实时进程,这个函数什么都不做,否则就进行调度和平衡,和你说 ...



scheduler_tick到底做不做调度
作者: wenkai169    时间: 2014-02-11 09:36
本帖最后由 wenkai169 于 2014-02-11 09:47 编辑
mordorwww 发表于 2014-02-10 08:56
scheduler_tick到底做不做调度


弄错了,他只触发了调度,自己没有去操作。

源码里面
  1. void scheduler_tick(void) {
  2. ...
  3. #ifdef CONFIG_SMP
  4.         rq->idle_balance = idle_cpu(cpu);
  5.         trigger_load_balance(rq, cpu);
  6. #endif


  7. /*
  8. * Trigger the SCHED_SOFTIRQ if it is time to do periodic load balancing.
  9. */
  10. void trigger_load_balance(struct rq *rq, int cpu)
  11. {
  12.         /* Don't need to rebalance while attached to NULL domain */
  13.         if (time_after_eq(jiffies, rq->next_balance) &&
  14.             likely(!on_null_domain(cpu)))
  15.                 raise_softirq(SCHED_SOFTIRQ);
  16. #ifdef CONFIG_NO_HZ_COMMON
  17.         if (nohz_kick_needed(rq, cpu) && likely(!on_null_domain(cpu)))
  18.                 nohz_balancer_kick(cpu);
  19. #endif
  20. }
复制代码

作者: mordorwww    时间: 2014-02-11 10:04
wenkai169 发表于 2014-02-11 09:36
弄错了,他只触发了调度,自己没有去操作。

源码里面


时钟中断里必须要做schedule的啊,这是最基本的分时调度
作者: humjb_1983    时间: 2014-02-11 10:12
时钟中断真正的调度点在“中断返回”的时候。
作者: mordorwww    时间: 2014-02-11 10:19
humjb_1983 发表于 2014-02-11 10:12
时钟中断真正的调度点在“中断返回”的时候。


这个没错啊,中断结束了才能做switch
前面 wenkai169 同学的意思貌似是中断不会触发调度
作者: humjb_1983    时间: 2014-02-11 10:24
mordorwww 发表于 2014-02-11 10:19
这个没错啊,中断结束了才能做switch
前面 wenkai169 同学的意思貌似是中断不会触发调度

呵呵,他说的也没错,scheduler_tick()函数中只是根据情况设置TIF_NEED_RESCHED标记,并不直接触发调度,真正调度发生在中断返回时,会检查是否有该标记,有的话就会产生switch了,所以,scheduler_tick()是间接触发了调度。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2