Linux 系统实现底半部的机制主要有tasklet,工作队列和软中断。
tasklet 和工作队列都是调度中断底半部的良好机制,tasklet 基于软中断实现。
内核定时器也依靠软中断实现;内核中的延时是忙等待或者睡眠等待,为了充分利用CPU资源,使系统有更好的吞吐性能,在对延迟时间的要求并不是很精确的情况下,睡眠等待通常是值得推荐的。
kernel/time/timer.c
start_kernel 时,会调用init_timer 初始化timer 并注册软中断
raise_softirq(TIMER_SOFTIRQ)
timer 中断处理函数中,更新处理器timer 并实时触发软中断
不同类型定时器,不同的回调函数里面会调用 update_process_times
参考
https://www.cnblogs.com/lingjiajun/p/11944753.html
https://www.cnblogs.com/hellokitty2/p/15666357.html
kernel/time/tick-sched.h
tick_device 不同模式
周期模式:
scheduler_tick()具体被调用流程:tick中断->
tick_handle_periodic(tick_periodic())->update_process_times()->scheduler_tick()
oneshot 模式或者nohz
tick中断->tick_sched_timer(tick_sched_handle())->update_process_times()->scheduler_tick()。
设置timer 到期回调函数
fs/timerfd.c
设置timer 到期回调函数
tick_sched_timer 回调函数太耗时,导致timerfd_tmrproc 回调函数滞后