我是靠谱客的博主 玩命唇彩,最近开发中收集的这篇文章主要介绍linux 时间子系统 二 时间系统的组成linux 时间子系统 二 时间系统的组成,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

linux 时间子系统 二 时间系统的组成

时间轮,jiffies与HZ

时间轮是linux kernel处理内核低精度定时器的机制,由周期的定时器中断驱动。定时器中断以配置的HZ参数为频率产生,在中断中更新系统时间jiffies,摘取到期的定时器执行,更新时间轮时间。

clock source

clock source 硬件计数器的一种抽象,它为系统提供一种时间线,通过时间线,每一个动作都可以确定现在执行时的时间点。一般的clocksource是一个单调递增(monotonic)计数器。它应该尽可能的提供高精度,并且要尽可能的稳定。作为clocksource的timer不能够因为执行读取动作而出现数据错误。
对系统时间的同步操作,不会影响到clocksource,同步操作只会生成一个时间偏移,通过时间偏移量可以得到当前时间。

clock events

clockevent和clocksource是两种完全不同的机制,虽然同一个硬件timer可以同时用来做clocksource和clockevents。
clock events管理下的硬件定时器会产生中断,在时间线上某点触发event完成它的工作。
clockevents 提供一种管理定时器中断的driver api,api管理所有注册的timer。这些api只有小部分的功能跟是硬件相关的,所以kernel可以以体系结构无关的方式使用timer。
利用clockevents机制,系统可以支持高精度定时器。当高精度定时器被申请时,需要做的工作就是选择一个合适的timer来支持高精度定时器。 系统可以提供高精度的定时中断,提供高精度的内核定时器来满足高的实时需求。
周期定时器tick现在也是用clock events来实现,它的功能仍然与旧的基于定时器中断的机制相同,都是更新jiffies,计算系统时间等。
https://lwn.net/Articles/223185/

Dynamic ticks

NO_HZ(减少调度时钟ticks)

时间子系统当中NO_HZ相关的配置能够减少调度时钟中断的数量。因为系统不会频繁被调度时钟打断,这样能够提高系统的工作效率,一方面能够降低能源消耗,另一方面较低的系统抖动对有高性能计算(HPC)和实时性要求的应用会有较大影响。
主要有三种需求需要管理调度时钟中断:

  • 不控制调度时钟ticks: CONFIG_HZ_PERIODIC=y或者CONFIG_NO_HZ=n 表示使用稳定的周期ticks,ticks的频率固定为HZ配置。
  • 在cpu进入idle状态时,不允许触发调度时钟tick:CONFIG_NO_HZ_IDLE=y 这是最通常的做法,也是默认的做法。
  • 在idle和只运行一个任务时,不允许触发调度时钟tick:CONFIG_NO_HZ_FULL=y. 除非系统需要运行实时性应用,或者确定系统正在运行高负载计算集中型的应用,系统的这个选项一般是不打开的。

下边分别解释下三种情况:

不控制调度时钟tick
早期的kernel是不控制调度时钟tick的,调度时钟中断以HZ设定的频率到来,执行调度。这种方式在某些情况下被证明仍然是一种非常有效的方式。比如,在系统负载比较重的情况下,cpu只有很少的时间处于idle状态,只是频繁的进入idle停留很短的时间。这种负载下,因为有很多正在等待运行的任务,所以及时的调度tick是必要的。这种情况下,控制调度时钟tick不会有什么效果。
这种模式需要的配置是CONFIG_HZ_PERIODIC=y
如果系统处在低负载的情况下,当cpu长时间的处在idle状态时,周期性的调度tick会增加功耗,这对电池供电的设备影响很大。
如果系统运行着实时性应用或者计算集中型应用,那么周期的调度时钟会影响系统的性能。

cpu idle状态时禁止调度时钟tick
当cpu在idle状态时,不应该向其发送调度时钟中断。调度时钟中断的作用是在有多个任务需要处理时切换cpu,一个处在idle状态的cpu没有这样的需要。
CONFIG_NO_HZ_IDLE=y配置选项使得kernel不会将调度时钟中断发送给idle状态的cpu。这种配置对电池供电和大型的虚拟化系统有很大影响。CONFIG_HZ_PERIODIC=y选项会使得电池供电设备以2倍的速度消耗电量。运行很多os的虚拟机系统中PERIODIC配置会导致cpu过多的消耗在无关的调度时钟中断中。
不过idle时动态调整tick(dyntick-idle)也是有消耗的:

  1. 它会增加idle loop的代码量
  2. 在许多架构上,动态调整tick需要在时间系统增加很多代码
    所以,实时性要求高的系统最好使用PERIODIC的配置。
    控制处在idle状态的cpu不接收调度时钟的方式叫做dyntick-idle 模式或者nohz 模式。
    在CONFIG_NO_HZ_IDLE=y配置下,默认情况下,启动参数中nohz=参数会关闭dyntick-idle模式,设置为nohz=on会打开dyntick-idle模式。

在只有一个任务时禁止调度时钟tick

High Resolution Timers

最后

以上就是玩命唇彩为你收集整理的linux 时间子系统 二 时间系统的组成linux 时间子系统 二 时间系统的组成的全部内容,希望文章能够帮你解决linux 时间子系统 二 时间系统的组成linux 时间子系统 二 时间系统的组成所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(42)

评论列表共有 0 条评论

立即
投稿
返回
顶部