CPU计时子系统
我这里主要参考了[1-4]中的内容,这一节对优化CPU统计时间的主要作用是弄明白编译选项,以及修改编译选项后对总体的影响
发展历史
-
一开始的时间子系统是低精度的,是毫秒级别。我们也称这个版本为经典定时器、低分辨率定时器、timer wheel,实现代码在kernel/timer.c中。
- 同时还有一个问题,如果我们的设备是一个对能耗非常敏感的设备,周期性的时钟信号能耗太大。所以我们在新的系统中急需解决这些问题
-
但是随着时间的发展,毫秒级别的定时器不够用了,特别是针对媒体资源。所以开始研发高分辨率定时器。只有在开启了编译选项HIG_RES_TIMERS后,才能提供高精度定时。
-
最一开始,试图让低精度和高精度并行,但是经过多次尝试,这个系统并没有成功。所以诞生了一个以高分辨率定时器为主的框架,低分辨率定时器依赖这个框架[1]。
系统架构
-
定时器种类
-
超时定时器
- 如果定时器超时,则说明预定任务没有完成,这类定时器往往对时间精准度要求不高,甚至往往由于在超时前任务完成,定时器已经被取消。
-
精准定时器
- 需要很精准的给出时间
-
-
定时器的硬件部分
-
PIT(programmable interrupt timer,可编程中断计时器,由8253芯片实现),这是一个经典的时钟源,分辨率和稳定性一般。
-
APIC(advanced programmable interrupt controller,高级可编程中断控制器),它的分辨率和稳定性要好得多。
-
APIC适合充当高分辨率时间源,而PIT只适用于低分辨率定时器。
-
-
定时器框架
- 时钟系统的结构
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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
-
-
-
低分辨率框架
-
这里和主题关系不是太大,暂时没有写讲解
-
周期性
-
动态
-
-
高分辨率框架
-
周期性时钟
-
开启选项
-
旧系统 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