我知道do_timer负责更新jiffies计数器。因此,我的问题是,它可以在不同的核心上执行,还是总是在发生计时器滴答的同一核心上执行?
答案 0 :(得分:3)
让我在谷歌搜索和阅读代码后回答我自己的问题。
do_timer()
应该在cpu上调用,ID保存在tick_do_timer_cpu
变量中。
kernel/time/tick-common.c
根据{{3}}或/ *
* tick_do_timer_cpu是一个定时器核心内部变量,它保存CPU NR *负责调用do_timer(),即计时的东西。这个 *变量有两个功能:
*
* 1)防止大量CPU试图抓住这个问题的雷鸣般的群体问题 *计时锁定一次。只有分配到的CPU才能执行 *更新正在处理它。
*
* 2)通过将值设置为
来取消NOHZ空闲情况下的任务 * TICK_DO_TIMER_NONE,即不存在的CPU。所以看下来的下一个cpu *它会接管并保持活着的时间。移交
*程序还包括cpu hotplug * /
tick_periodic()
中的当前CPU ID检查 tick_do_timer_cpu
。如果当前CPU相同,则调用do_timer()
,否则不会。
static void tick_periodic(int cpu)
{
if (tick_do_timer_cpu == cpu) {
write_seqlock(&jiffies_lock);
/* Keep track of the next tick event */
tick_next_period = ktime_add(tick_next_period, tick_period);
do_timer(1);
write_sequnlock(&jiffies_lock);
update_wall_time();
}
update_process_times(user_mode(get_irq_regs()));
profile_tick(CPU_PROFILING);
}`
这样,jiffies管理就在SMP系统中的一个核心上完成。