这里首先要说一个tick这个概念,tick是分时操作系统的基础,主要用于多任务的切换。其实现原理就是起一个定时器,每隔固定的时间,就会超时一次,此时判断是否需要做任务切换,从而实现多任务分时复用CPU,超时时间由CONFIG_HZ来定义,如CONFIG_HZ=250则意味着每秒钟会发生250次ticks,也就是说定时器的超时时间是4ms。
tick的发生实际上是由硬件定时器报中断到CPU,CPU做相应的处理,比如更新系统时间,判断是否要进行任务切换等等,每隔固定的时间,CPU就会做一次这种事情。我们来想一下真的有这个必要吗?如果当前CPU的运行队列上没有任务需要处理呢?如果只有一个任务需要处理呢?这个还有必要吗?显然没有必须要,这种情况下,CPU完全可以进入睡眠状态,以便降低系统功耗,所以引入了几个宏开关,来应对这种情况,这也是这本文章的主题。
持续产生ticks
对应的宏开关情况是CONFIG_HZ_PERIODIC=y或者CONFIG_NO_HZ=n,这种情况下,会周期性的产生tick,即便CPU进程运行队列没有进程需要执行。这种方案的缺点显而易见,那就是会导致系统功耗比较高,在手机等便携设备等对功耗比较敏感的应用场景,显然不适用。但是存在即合理,它也有它的好处,那就是从idle状态恢复的开销比较小,所以在一些频繁切入和切出dile状态的场景下,持续产生tick对功耗的提升不会有太大影响,但是对性能的提升会有很大帮助。
CPU在idle状态不产生ticks
对应的宏开关是CONFIG_NO_HZ_IDLE=y或者CONFIG_NO_HZ=y。跟上面相反,这种配置可以有效的降低功耗,但是会增加切入和切出idle状态的开销,如果对实时性不是那么敏感,这是一个非常好的方案。
CPU在idle状态或者只有一个进程需要执行时不产生ticks
对应的宏开关CONFIG_NO_HZ_FULL=y。这里重点说一下只有一个进程需要执行的时候不产生tick的优缺点,优点很明确,那就是降功耗,而缺点也很明确,那就是增加了切入和切出idle状态的开销。除此以外,只有一个进程执行和idle状态有一个重要区别,那就是idle状态下,可以不关注时间,但是只有一个进程执行的时候是需要关注时间的,所以必须保证在系统中有一个CPU持续产生tick以维持时间的准确性,所以在核数量比较多的系统中,这个配置才能发挥比较好的作用。