深入Linux内核架构笔记-动态时钟

Overview

为节省系统功耗,只在有些任务需要实际执行时,才激活周期时钟,否则会临时禁用周期时钟,对该技术的支持可以在编译时选择,启用此选项的系统也称无时钟系统。
判断原则:当系统调度选择IDLE进程来运行时,动态时钟系统会禁用周期时钟,直到下一个定时器即将到期为止

数据结构

struct tich_sched {
  struct hrtimer shed_timer;
  enum tick_nohz_mode nohz_mode;
  ktime_t idle_tick;
  int tick_stoppded;
  unsigned long idle_jiffies;
  unsigned long idle_calls;
  unsigned long idle_sleeps;
  ktime_t idle_entrytime;
  ktime_t idle_sleeptime;
  ktime_t sleep_length;
  unsinged long last_jiffies;
  unsiged long next_jiffies;
  ktime_t idle_expires
}
  • sched_timer : 用于实现时钟的定时器
  • nohz_mode:
    • NOHZ_MODE_INACTIVE : 周期时钟处于活动状态
    • NOHZ_MODE_LOWRES : 动态时钟是基于低分辨率的定时器
    • NOHZ_MODE_HIGHRES : 动态时钟是基于高分辨率的定时器
  • idle_tick : 在周期时钟禁用前,上一个时钟信号的到期时间,
  • tick_stopped : 1表示时钟周期已经停用,即当前没有什么基于周期时钟的工作要做

实现

Y
N
cpu_idle
tick_nohz_stop_sched_tick
!need_resched
pm_idle
tick_nohz_restart_sched_tick
Y
irq_exit
!in_interrupt && idle_cpu && !need_resched
tick_nohz_stop_sched_tick

问题

ts->tick_stopped = 1 : 进入IDLE,并且下一次定时器的时间超过1个Jiffy, 但是只有在ts->tick_stopped = 1 的时候才会停止周期时钟,如果当前ts->tick_stopped等于0,因为有周期时钟的存在,感觉很难有机会执行: ts->tick_stopped = 1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值