全球最实用的IT互联网信息网站!

AI人工智能P2P分享&下载搜索网页发布信息网站地图

当前位置:诺佳网 > 电子/半导体 > 嵌入式技术 >

虚拟运行时间计算的代码逻辑

时间:2023-07-31 11:19

人气:

作者:admin

标签: 代码 

导读:代码逻辑比较简单: 1、确定就绪队列的当前执行的调度实体 /* 确定就绪队列的当前执行进程curr */ struct sched_entity *curr = cfs_rq- curr; 2、根据获取的当前执行进程,计算当前和上一次更新...

代码逻辑比较简单:

1、确定就绪队列的当前执行的调度实体

/*  确定就绪队列的当前执行进程curr  */
struct sched_entity *curr = cfs_rq- >curr;

2、根据获取的当前执行进程,计算当前和上一次更新负荷权重时两次的时间的差值

u64 now = rq_clock_task(rq_of(cfs_rq));
 u64 delta_exec;

 if (unlikely(!curr))
  return;

 delta_exec = now - curr- >exec_start;
 if (unlikely((s64)delta_exec <= 0))
  return;

3、重新更新启动时间exec_start为now,以备下次计算时使用,最后将计算出的时间差加到先前的统计时间上。

/*  重新更新启动时间exec_start为now  */
curr- >exec_start = now;

schedstat_set(curr- >statistics.exec_max,
              max(delta_exec, curr- >statistics.exec_max));

/*  将时间差加到先前统计的时间即可  */
curr- >sum_exec_runtime += delta_exec;
schedstat_add(cfs_rq, exec_clock, delta_exec);

这也是通过cat /proc/$pid/sched看到的一些统计信息

4、开始计算虚拟时间

curr- >vruntime += calc_delta_fair(delta_exec, curr);

5、计算虚拟时间函数calc_delta_fair如下,忽略舍入和溢出检查,calc_delta_fair函数所做的计算如下:

/*
 * delta /= w
 */
static inline u64 calc_delta_fair(u64 delta, struct sched_entity *se)
{
 if (unlikely(se- >load.weight != NICE_0_LOAD))
  delta = __calc_delta(delta, NICE_0_LOAD, &se- >load);

 return delta;
}

图片

其中NICE_0_LOAD的值为:1024,当进程的nice=0时,不需要进行加权处理,其虚拟时间就等于其实际运行时间。

# define SCHED_FIXEDPOINT_SHIFT  10
#define NICE_0_LOAD_SHIFT (SCHED_FIXEDPOINT_SHIFT)
#define NICE_0_LOAD  (1L < < NICE_0_LOAD_SHIFT)

‍1024也就是Nice值为0对应的权重值,权重值在内核中是预先定义好的,如下所示:

const int sched_prio_to_weight[40] = {
 /* -20 */     88761,     71755,     56483,     46273,     36291,
 /* -15 */     29154,     23254,     18705,     14949,     11916,
 /* -10 */      9548,      7620,      6100,      4904,      3906,
 /*  -5 */      3121,      2501,      1991,      1586,      1277,
 /*   0 */      1024,       820,       655,       526,       423,
 /*   5 */       335,       272,       215,       172,       137,
 /*  10 */       110,        87,        70,        56,        45,
 /*  15 */        36,        29,        23,        18,        15,
};

通过公式和内核预先设定的权重表,可以看出来:

Nice值越高(对应的优先级越低),权重越小,虚拟时间累加的越快(虚拟时间过得越快),Nice值越低(对应的优先级越高),权值越高,虚拟时间累加的越慢(虚拟时间过得越慢)。CFS的思想核心也就是这样,让每个调度实体的虚拟时间增加速度不同,使用虚拟时间来衡量调度实体在CPU上已经执行的时间。

总结:

不同优先级的进程以各自对应的速度推进虚拟时间,只要保证在一个调度延迟内虚拟时间的推进进展相同,就实现了完成公平,公平指的是相对公平,即按进程的权重给予不同的运行时间,虚拟时间越小,代表着受到了"不公平"对待,因此下一个参与调度的调度实体就是红黑树中的最左边(虚拟时间最小)的节点,如此一来既能公平选择进程,又能保证高权重进程获得较多的运行时间。

温馨提示:以上内容整理于网络,仅供参考,如果对您有帮助,留下您的阅读感言吧!
相关阅读
本类排行
相关标签
本类推荐

CPU | 内存 | 硬盘 | 显卡 | 显示器 | 主板 | 电源 | 键鼠 | 网站地图

Copyright © 2025-2035 诺佳网 版权所有 备案号:赣ICP备2025066733号
本站资料均来源互联网收集整理,作品版权归作者所有,如果侵犯了您的版权,请跟我们联系。

关注微信