- Overview
RT Throttle被触发的时机
RT Throttle是如何被触发的
RT Throttle在什么情况下解除
- 源码阅读
RT Throttle触发的时机
阅读源码发现:
在如下的时机会去更新rt task或者runqueue有执行相关的时间:
a. dequeue task,因为某些情况下往往是当前task,要进入sleep,才会被dequeue掉,所以,在这个task离开队列之前要对loading进行结算
b. put_prev_task, put prev其实这个prev大多数指current task,也要重新计算
c. timer tick到来的时候,主要的task loading更新的地方。
在update_curr_rt当中:/* * Update the current task's runtime statistics. Skip current tasks that * are not in our scheduling class. */ static void update_curr_rt(struct rq *rq) { struct task_struct *curr = rq->curr; struct sched_rt_entity *rt_se = &curr->rt; u64 delta_exec; u64 now; if (curr->sched_class != &rt_sched_class) return; now = rq_clock_task(rq); delta_exec = now - curr->se.exec_start; //执行的时间 if (unlikely((s64)delta_exec <= 0)) return; schedstat_set(curr->se.statistics.exec_max, max(curr->se.statistics.exec_max, delta_exec)); curr->se.sum_exec_runtime += delta_exec; //当前task总的执行时间 account_group_exec_runtime(curr, delta_exec); curr->se.exec_start = now; //重新开始计时 cgroup_account_cputime(curr, delta_exec); if (!rt_bandwidth_enabled()) //如果当前throttle机制被关闭,那么就不用后面的判断。 return; for_each_sched_rt_entity(rt_se) { //假定没有CONFIG_RT_GROUP_SCHED,这个地方就是单独task自身。为了简化就理解为一个task的状况,不考虑group的状况。 struct rt_rq *rt_rq = rt_rq_of_se(rt_se); if (sched_rt_runtime(rt_rq) != RUNTIME_INF) { raw_spin_lock(&rt_rq->rt_runtime_lock); rt_rq->rt_time += delta_exec;//将当前task 执行的时间累加到rq当中。注意这个地方的变量名叫rt_time,这是保存在rt_rq当中用来记录rq rt线程总执行时间的变量。还有一个变量叫rt_run time,这个变量记录rt rq允许执行的时间。 if (sched_rt_ru
Kernel Scheduler学习之六:RT Throttle
最新推荐文章于 2024-04-09 21:24:05 发布