我知道 do_timer 负责更新 jiffies 计数器。因此我的问题是,它可以在不同的内核上执行还是始终在发生计时器滴答的同一内核上执行?
让我在谷歌搜索和阅读代码后回答我自己的问题。
do_timer() http://lxr.free-electrons.com/source/kernel/time/timekeeping.c#L1915应该在 cpu 上调用,ID 保存在tick_do_timer_cpu http://lxr.free-electrons.com/source/kernel/time/tick-common.c#L39多变的。
kernel/time/tick-common.c
/*
* tick_do_timer_cpu是定时器核心内部变量,保存CPU NR
* 负责调用 do_timer(),即计时的东西。这个
* 变量有两个功能:
*
* 1) 防止大量 CPU 试图抢占资源的惊群问题
* 计时全部锁定。仅分配执行该操作的 CPU
* 更新正在处理它。
*
* 2) 通过将值设置为来交接 NOHZ 空闲情况下的任务
* TICK_DO_TIMER_NONE,即不存在的CPU。所以下一个CPU看起来
* 它将接管并保持时间保持活力。交接
* 程序还涵盖 cpu 热插拔。
*/
tick_do_timer_cpu
对照当前 CPU ID 检查tick_periodic() http://lxr.free-electrons.com/source/kernel/time/tick-common.c#L79 or in tick_sched_do_timer() http://lxr.free-electrons.com/source/kernel/time/tick-sched.c#L112。如果当前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 系统的一个核心上完成的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)