0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

麦辣鸡腿堡 来源:技术简说 作者:董旭 2023-07-31 11:19 次阅读

代码逻辑比较简单:

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上已经执行的时间。

总结:

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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    11230

    浏览量

    208936
  • 代码
    +关注

    关注

    30

    文章

    4751

    浏览量

    68358
收藏 人收藏

    评论

    相关推荐

    如何缩短Vivado的运行时间

    在Vivado Implementation阶段,有时是有必要分析一下什么原因导致运行时间(runtime)过长,从而找到一些方法来缩短运行时间
    的头像 发表于 05-29 14:37 1.4w次阅读
    如何缩短Vivado的<b class='flag-5'>运行时间</b>

    如何检查Linux服务器的运行时间

    Linux 中的 uptime 用于查看系统启动后的运行时间。它是一个比较简单的 Linux 命令,可以不带参数直接运行
    发表于 11-25 15:25 1.5w次阅读
    如何检查Linux服务器的<b class='flag-5'>运行时间</b>

    stm32cubeIDE代码运行时间如何查看?

    stm32cubeIDE 代码运行时间,如何查看?就如 keil 调试时候那样,可以测试代码运行时间。但是在stm32cubeIDE 中,一直没有找到这个功能,不知道哪位高人可以提示
    发表于 04-16 08:10

    请问6747如何测量代码运行时间

    1. 我想用片上的硬件定时器的方法测量代码运行时间,使用timer,加头文件:csl_timer.h,但是6747没有csl,我下载了6747的cslr package,发现里面也没有
    发表于 07-28 10:25

    C语言教程之显示程序运行时间

    C语言教程之显示程序运行时间,很好的C语言资料,快来学习吧。
    发表于 04-25 16:09 0次下载

    如何用SysTick实现测量程序运行时间

    在实际的项目开发过程中,常常遇到需要得到一段代码运行时间,通常的方法是用示波器来测量,这篇博文将用 SysTick 来实现 精确测量 程序运行时间。 STM32F4 的内核定时
    的头像 发表于 05-09 14:07 6013次阅读
    如何用SysTick实现测量程序<b class='flag-5'>运行时间</b>

    KEIL的代码运行时间功能

    郭老师说,这个时间单位是秒(sec),是从单片机运行第一条代码开始计算的,但是当你真正用示波器验证这个时间差(因为不知道单片机什么时候才开始
    的头像 发表于 06-05 15:48 8708次阅读
    KEIL的<b class='flag-5'>代码</b><b class='flag-5'>运行时间</b>功能

    如何高效测量ECU的运行时间

    ,最终可能会引起运行时间方面的问题。这在项目后期需要大量的时间和金钱来解决。如果不能掌握系统的运行状态,则很难发现系统内缺陷的根源。 解决方案 将TA软件工具套件与VX1000测量标定硬件相结合,可同步分析 ECU内部
    的头像 发表于 10-28 11:05 2174次阅读

    浅析STM32代码运行时间的技巧

    前言     测试代码运行时间的两种方法: 使用单片机内部定时器,在待测程序段的开始启动定时器,在待测程序段的结尾关闭定时器。为了测量的准确性,要进行多次测量,并进行平均取值。 借助示波器的方法
    的头像 发表于 11-09 09:52 3833次阅读
    浅析STM32<b class='flag-5'>代码</b><b class='flag-5'>运行时间</b>的技巧

    利用StopWatch监控Java代码运行时间和分析性能

    利用StopWatch监控Java代码运行时间和分析性能。
    的头像 发表于 07-21 16:51 2785次阅读

    AN021 测量MCU代码运行时间的几种方法

    AN021 测量MCU代码运行时间的几种方法
    发表于 02-27 18:23 0次下载
    AN021 测量MCU<b class='flag-5'>代码</b><b class='flag-5'>运行时间</b>的几种方法

    Linux虚拟运行时间计算

    虚拟运行时间计算 关于tick: tick是周期性的时钟中断,时钟中断驱动调度器runing,其周期间隔根据硬件频率的设定相关(T=1/f),如下: T=1/250 = 4ms,也就说时钟中断以
    的头像 发表于 07-31 11:15 709次阅读
    Linux<b class='flag-5'>虚拟</b><b class='flag-5'>运行时间</b>的<b class='flag-5'>计算</b>

    ch32v307记录程序运行时间

    ch32v307记录程序运行时间 在程序开发中,很重要的一项任务就是对程序的运行时间进行评估。对于大型的程序系统来说,它们通常需要处理大量的数据或进行复杂的计算操作。因此,如果程序的运行时间
    的头像 发表于 08-22 15:53 858次阅读

    jvm运行时内存区域划分

    JVM是Java Virtual Machine(Java虚拟机)的缩写,它是Java编程语言的运行环境。JVM的主要功能是将Java源代码转换为机器代码,并且在
    的头像 发表于 12-05 14:08 508次阅读

    三菱plc累计运行时间怎么编程

    具有重要意义。本文将详细介绍如何使用三菱PLC编程实现累计运行时间的统计功能。 一、概述 累计运行时间是指设备或系统在一定时间内的总运行时间。在工业生产中,对设备的累计
    的头像 发表于 06-20 11:31 2135次阅读