CONFIG_NO_HZ (aka dynamic tick functionality)

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阶段,我们可以通过停止周期时钟来达到降低系统功耗的目的,只要有进程处于活动状态,时钟事件依然会被周期性地发出。

猜你喜欢

转载自blog.csdn.net/yuzaipiaofei/article/details/78088587
今日推荐