kernel开发4:CPU计时子系统

CPU计时子系统

我这里主要参考了[1-4]中的内容,这一节对优化CPU统计时间的主要作用是弄明白编译选项,以及修改编译选项后对总体的影响

发展历史

  1. 一开始的时间子系统是低精度的,是毫秒级别。我们也称这个版本为经典定时器、低分辨率定时器、timer wheel,实现代码在kernel/timer.c中。

    • 同时还有一个问题,如果我们的设备是一个对能耗非常敏感的设备,周期性的时钟信号能耗太大。所以我们在新的系统中急需解决这些问题
  2. 但是随着时间的发展,毫秒级别的定时器不够用了,特别是针对媒体资源。所以开始研发高分辨率定时器。只有在开启了编译选项HIG_RES_TIMERS后,才能提供高精度定时。

  3. 最一开始,试图让低精度和高精度并行,但是经过多次尝试,这个系统并没有成功。所以诞生了一个以高分辨率定时器为主的框架,低分辨率定时器依赖这个框架[1]。

系统架构

  1. 定时器种类

    • 超时定时器

      • 如果定时器超时,则说明预定任务没有完成,这类定时器往往对时间精准度要求不高,甚至往往由于在超时前任务完成,定时器已经被取消。
    • 精准定时器

      • 需要很精准的给出时间
  2. 定时器的硬件部分

    • PIT(programmable interrupt timer,可编程中断计时器,由8253芯片实现),这是一个经典的时钟源,分辨率和稳定性一般。

    • APIC(advanced programmable interrupt controller,高级可编程中断控制器),它的分辨率和稳定性要好得多。

    • APIC适合充当高分辨率时间源,而PIT只适用于低分辨率定时器。

  3. 定时器框架

    • 时钟系统的结构

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-n0GdpyuA-1630926327924)(https://raw.githubusercontent.com/Richardhongyu/pic/main/20210815005618.png)]

    • 时钟系统的配置

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iWEYmwUl-1630926327928)(https://raw.githubusercontent.com/Richardhongyu/pic/main/20210815010211.png)]

      • 有两个重要的配置选项

        • 精度

          • 确定时钟系统是高精度还是低精度
        • 动态

          • 确定时钟系统是否开启no_hz
  4. 低分辨率框架

    • 这里和主题关系不是太大,暂时没有写讲解

    • 周期性

    • 动态

  5. 高分辨率框架

    • 周期性时钟

      • 开启选项

        • 旧系统 ONFIG_HZ_PERIODIC=y

        • 新系统 CONFIG_NO_HZ=n

      • 高分辨率下的周期时钟是仿真得到的

        [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MLuYPnqT-1630926327935)(https://raw.githubusercontent.com/Richardhongyu/pic/main/20210815114721.png)]

        • 在高分辨率下,我们不再用tick_handle_periodic提供周期信号,而是用hrtimer_interrupt
    • 动态时钟

      • 这个是我们这次的主要讲解对象,需要参考一下linux的官方文档对这几个选项的说明[2]

      • 开启选项

        • 部分tickless/nohz

          • 对旧系统来说,CONFIG_NO_HZ_IDLE=y

          • 对新系统来说,CONFIG_NO_HZ=y

        • 完全tickless/nohz

          • CONFIG_NO_HZ_FULL=y
      • 作用

        • 部分tickless可以让CPU在没有程序可以调度时,不再开启周期性tick

        • 完全ticklssk可以让CPU只有一个程序可以调度时,也不再开启周期性tick

      • 注意事项

        • nohz_full是一个启动参数,用来确定哪些CPU是完全的tickless,“nohz_full=1,6-8” 表示CPUs 1, 6, 7, 和8被配置为完全的tickless。但是不能所有的CPU都被配置为完全tickless CPU,至少留下一个,来处理其它的事务

参考文献

[1] https://www.kernel.org/doc/html/latest/timers/hrtimers.html

[2] https://www.kernel.org/doc/Documentation/timers/NO_HZ.txt

[3] http://events17.linuxfoundation.org/sites/events/files/slides/Timekeeping%20in%20the%20Linux%20Kernel_0.pdf

[4] https://www.youtube.com/watch?v=Puv4mW55bF8

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值