- 论坛徽章:
- 0
|
这两个调度算法的文件中都有一个更新CPU clock的函数,sched_rt为:
static void update_curr_rt(struct rq *rq)
{
struct task_struct *curr = rq->curr;
struct sched_rt_entity *rt_se = &curr->rt;
struct rt_rq *rt_rq = rt_rq_of_se(rt_se);
u64 delta_exec;
if (!task_has_rt_policy(curr))
return;
delta_exec = rq->clock - curr->se.exec_start;
if (unlikely((s64)delta_exec < 0))
delta_exec = 0;
schedstat_set(curr->se.exec_max, max(curr->se.exec_max, delta_exec));
curr->se.sum_exec_runtime += delta_exec;
account_group_exec_runtime(curr, delta_exec);
...... ......
sched_fair为:
static void update_curr(struct cfs_rq *cfs_rq)
{
struct sched_entity *curr = cfs_rq->curr;
u64 now = rq_of(cfs_rq)->clock;
unsigned long delta_exec;
if (unlikely(!curr))
return;
/*
* Get the amount of time the current task was running
* since the last time we changed load (this cannot
* overflow on 32 bits):
*/
delta_exec = (unsigned long)(now - curr->exec_start);
if (!delta_exec)
return;
....... .......
为什么sched_fair中的delta_exec不用判断是否小于0,而直接判断等于0
现在碰到一个问题,多核CPU上,每个CPU的sched_clock_cpu的值不一样,就出现了CPU0上一会更新为CPU0自己的CLOCK,一会更新为CPU1的CLOCK,但是后者比前者小,结果减出来是个负数,导致很多地方的进程时间不正确.
各位大狭们多多指教,非常感谢! |
|