CONFIG_NO_HZ (aka dynamic tick functionality)

来源:互联网 发布:韩智慧知乎 编辑:程序博客网 时间:2024/06/11 10:17

CONFIG_NO_HZ ,也就是tickless mode, 这个定义启用了周期时钟的一个新特性,就是动态时钟.主要的改进就是让系统在idle 时可以停止tick,降低系统功耗. 在CPU有workload 时恢复正常的tick,产生周期性的Tick事件.

/* * Enable / Disable tickless mode */static int __init setup_tick_nohz(char *str){    if (!strcmp(str, "off"))        tick_nohz_enabled = 0;    else if (!strcmp(str, "on"))        tick_nohz_enabled = 1;    else        return 0;    return 1;}__setup("nohz=", setup_tick_nohz);

通过下面的函数停止Tick

void tick_nohz_stop_sched_tick(int inidle)/** * tick_nohz_stop_sched_tick - stop the idle tick from the idle task * * When the next event is more than a tick into the future, stop the idle tick * Called either from the idle loop or from irq_exit() when an idle period was * just interrupted by an interrupt which did not cause a reschedule. */

Linux中的时钟事件都是由一个周期时钟提供,不管系统中的clock_event_device是工作于周期触发模式,还是工作于单触发模式,也不管定时器系统是工作于低分辨率模式,还是高精度模式,内核都竭尽所能,用不同的方式提供周期时钟,以产生定期的tick事件,tick事件或者用于全局的时间管理(jiffies和时间的更新),或者用于本地cpu的进程统计、时间轮定时器框架等等。周期性时钟虽然简单有效,但是也带来了一些缺点,尤其在系统的功耗上,因为就算系统目前无事可做,也必须定期地发出时钟事件,激活系统。为此,内核的开发者提出了动态时钟这一概念,我们可以通过内核的配置项CONFIG_NO_HZ来激活特性。有时候这一特性也被叫做tickless,不过还是把它称呼为动态时钟比较合适,因为并不是真的没有tick事件了,只是在系统无事所做的idle阶段,我们可以通过停止周期时钟来达到降低系统功耗的目的,只要有进程处于活动状态,时钟事件依然会被周期性地发出。