进程调度分析之周期性调度器

本文详细解读Linux2.6.29版本中CFS调度器的周期调度流程,重点分析了时钟中断触发的scheduler_tick函数如何根据进程类型调用特定的调度类函数,特别聚焦于CFS调度类中的task_tick_fair函数,阐述其主要作用在于更新进程虚拟时间和判断进程是否达到运行时间阈值,进而决定进程的运行策略。文章深入探讨了虚拟时间与真实时间在进程调度中的不同应用领域。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

博文《linux2.6.29 CFS调度详细分析(二)》中有如下截图

这是时钟中断的调用流程,跟进程调度有关的就是update_process_times->scheduler_tick(); scheduler_tick()根据被中断的进程curr所属的调度类来调用相关调度类的task_tick函数。由此可见周期调度器不属于哪一个调度类,而是由它来调用相关调度类的函数。对于CFS调度类,task_tick就是task_tick_fair.

task_tick_fair 最终就是要做两件事:

1 更新当前进程curr及就绪队列的信息,既更新当前进程的虚拟时间,跟新就绪队列的cfs_rq->min_vruntime。

进程虚拟时间计算通过公式:Delta = delta* NICE_0_LOAD/ se->load   (delta 两次时钟中断之间进程占用CPU的时间)

2 判断当前进程是否执行了足够的时间,如果是则被换出。那这里就要跟两个数据有关了:该进程应该运行了多少时间和已经运行了多少时间。

进程应该运行多少时间是由sched_slice(cfs_rq, curr);计算出来的,原理可以见《独辟蹊径品linux内核》354页11.1 和11.2

进程运行了多少时间则是由进程现在运行的总时间减去进程这次获取cpu时的时间,由此既得出进程此次获取CPU后,占用了多长时间。

/*sum_exec_runtime: 进程执行的总时间*/

/*prev_sum_exec_runtime:进程在最近一次获得CPU时的sum_exec_runtime值*/
delta_exec = curr->sum_exec_runtime - curr->prev_sum_exec_runtime;

 

以前分析对虚拟时间使用十分模糊,由1,2分析可知,进程虚拟时间仅仅是用在就绪队列的排队中,该队列的排队顺序既在树的左边或右边决定了下次被调度的优先级高或低。而至于进程到底应该占用多长时间的cpu,已经占用了多长时间的cpu,使用的是真实时间,跟虚拟时间就无关了。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值