schedule函数主要流程

上传人:平*** 文档编号:12793242 上传时间:2017-10-20 格式:DOCX 页数:11 大小:19.44KB
返回 下载 相关 举报
schedule函数主要流程_第1页
第1页 / 共11页
schedule函数主要流程_第2页
第2页 / 共11页
schedule函数主要流程_第3页
第3页 / 共11页
schedule函数主要流程_第4页
第4页 / 共11页
schedule函数主要流程_第5页
第5页 / 共11页
点击查看更多>>
资源描述

《schedule函数主要流程》由会员分享,可在线阅读,更多相关《schedule函数主要流程(11页珍藏版)》请在金锄头文库上搜索。

1、上层调度,linux 调度的核心函数为 schedule,schedule 函数封装了内核调度的框架。细节实现上调用具体的调度类中的函数实现。schedule 函数主要流程为:1,将当前进程从相应的运行队列中删除;2,计算和更新调度实体和进程的相关调度信息;3,将当前进程重新插入到调度运行队列中,对于 CFS 调度,根据具体的运行时间进行插入而对于实时调度插入到对应优先级队列的队尾;4,从运行队列中选择运行的下一个进程;5,进程调度信息和上下文切换;当进程上下文切换后,调度就基本上完成了,当前运行的进程就是切换过来的进程了。cpp view plaincopyprint?1. /*内核和其他部

2、分用于调用进程调度器的入口,选择2. 哪个进程可以运行,何时将其投入运行。 schedule 通常3. 都需要和一个具体的调度类相关联,也就是说,他4. 会找到一个最高优先级的调度类,后者需要有自己的5. 可运行队列,然后问后者谁才是下一个该运行的进程6. 该函数唯一重要的事情是,他回调用 pick_next_task*/7. asmlinkage void _sched schedule(void)8. 9. struct task_struct *prev, *next;10. unsigned long *switch_count;11. struct rq *rq;12. int cp

3、u;13. 14. need_resched:15. preempt_disable() ;16. cpu = smp_processor_id() ;17. rq = cpu_rq(cpu) ;/*得到特定 cpu 的 rq*/18. rcu_sched_qs(cpu ) ;19. prev = rq-curr;/*当前的运行进程 */20. switch_count = &prev-nivcsw;/*进程切换计数*/21.22. release_kernel_lock(prev) ;23. need_resched_nonpreemptible:24.25. schedule_debug(

4、prev) ;26.27. if (sched_feat(HRTICK) )28. hrtick_clear(rq) ;29.30. spin_lock_irq(&rq-lock) ;31. update_rq_clock(rq) ;/* 更新 rq 的 clock 属性*/32. clear_tsk_need_resched(prev ) ;/* 清楚 prev 进程的调度位*/33.34. if (prev-state & !(preempt_count() & PREEMPT_ACTIVE) ) 35. if (unlikely(signal_pending_state(prev-sta

5、te, prev) ) ) 36. prev-state = TASK_RUNNING;37. else/*从运行队列中删除 prev 进程,根据调度类的38. 不同,实现不同 */39. deactivate_task(rq, prev, 1) ;40. switch_count = &prev-nvcsw;41. 42. /*现只对实时进程有用*/43. pre_schedule(rq, prev) ;44.45. if (unlikely(!rq-nr_running) )46. idle_balance(cpu, rq) ;47. /*将当前进程,也就是被切换出去的进程重新48. 插入

6、到各自的运行队列中,对于 CFS 算法插入49. 到合适的位置上,对于实时调度插入到同一个50. 优先级队列的链表尾部*/51. put_prev_task(rq, prev) ;52. /*从各自的运行队列中选择下一个进程来运行*/53. next = pick_next_task(rq) ;54.55. if (likely(prev != next) ) 56. /*更新切换出去和进来进程以及对应 rq 的相关变量*/57. sched_info_switch(prev, next) ; 58. perf_event_task_sched_out(prev, next, cpu) ;59

7、.60. rq-nr_switches+;/*切换记录*/61. rq-curr = next;62. +*switch_count;63. /*上下文切换,在进程切换已经介绍*/64. context_switch(rq, prev, next) ; /* unlocks the rq */65. /*66. * the context switch might have flipped the stack from under67. * us, hence refresh the local variables.68. */69. cpu = smp_processor_id() ;70.

8、 rq = cpu_rq(cpu ) ;71. else72. spin_unlock_irq(&rq-lock) ;73. /*对于实时进程有用到*/74. post_schedule(rq) ;75.76. if (unlikely(reacquire_kernel_lock (current) nr_uninterruptible+;8. /*具体操作*/9. dequeue_task(rq, p, sleep) ;10. dec_nr_running(rq) ;/*rq 中当前进程的运行数减一*/11. 我们看具体的操作 cpp view plaincopyprint?1. stati

9、c void dequeue_task(struct rq *rq, struct task_struct *p, int sleep)2. 3. if (sleep) /*如果 sleep 不为 0,更新 se 中相关变量 */4. if (p-se.last_wakeup) 5. update_avg(&p-se.avg_overlap,6. p-se.sum_exec_runtime - p-se.last_wakeup) ;7. p-se.last_wakeup = 0;8. else 9. update_avg(&p-se.avg_wakeup,10. sysctl_sched_wa

10、keup_granularity) ;11. 12. 13. /*更新进程的 sched_info 数据结构中相关属性*/14. sched_info_dequeued(p) ;15. /*调用具体调度类的函数从他的运行队列中删除*/16. p-sched_class-dequeue_task(rq, p, sleep) ;17. p-se.on_rq = 0;18. 可见,调用了具体运行队列的删除函数,我们看最关键的选择下一个进程的方式。cpp view plaincopyprint?1. /*2. * Pick up the highest-prio task:3. */4. /*以优先级

11、为序,从高到低,一次检查每个调度类5. 并且从高优先级的调度类中,选择最高优先级的进程6. */7. static inline struct task_struct *8. pick_next_task(struct rq *rq)9. 10. const struct sched_class *class;11. struct task_struct *p;12.13. /*14. * Optimization: we know that if all tasks are in15. * the fair class we can call that function directly:1

12、6. */17. if (likely(rq-nr_running = rq-cfs.nr_running) ) 18. p = fair_sched_class.pick_next_task(rq) ;19. if (likely(p) )20. return p;21. 22.23. class = sched_class_highest;24. for ( ; ; ) /*对每一个调度类*/25. p = class-pick_next_task(rq) ;/*调用该调度类中的函数,找出下一个 task*/26. if (p)27. return p;28. /*29. * Will never be NULL as the idle class always30. * returns a non-

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号