定时测量

时钟和定时器电路

  • 实时时钟(RTC)

    • 独立于CPU,单独供电
    • Linux只用RTC获取时间和日期
  • 时间戳计数器(TSC)

    • CPU内部提供
    • 与处理器频率有关
    • 可以获得更精确的时间测量
  • 可编程间隔定时器(PIT)

  • CPU本地定时器

  • 高精度事件定时器

  • ACPI电源管理定时器

Linux计时体系机构

  • 定时器对象

  • jiffies 变量

    • 计数器,记录系统自启动以来产生的节拍总数
  • xtime 变量

    • 存放当前时间和日期,包含两个字段
      • tv_sec
      • tv_nsec
  • 单处理器系统上的计时体系结构

    • 所有与定时有关的活动都是由IRQ线0上的可编程间隔定时器产生的中断触发
    • 初始化阶段(P236)
    • 时钟中断处理程序(P237)
  • 多处理器系统上的计时体系结构

    • 依赖两种不同的时钟中断源
      • 可编程间隔定时器或高精度事件定时器产生的中断
      • CPU本地定时器产生的中断
    • 存在全局时钟中断处理程序和本地时钟中断处理程序

更新时间和日期

  • 内核更新xtime变量
  • 用户程序从xtime变量中获得当前时间和日期

更新系统统计数

  • 内核需要在定时相关的其他任务中周期性地收集若干数据用于:

    • 检查运行CPU的资源限制
    • 更新与本地CPU工作负载有关的统计数
    • 计算平均系统负载
    • 监管内核代码
  • 更新本地CPU统计数

  • 记录系统负载(uptime命令)
  • 监管内核代码
  • 检查非屏蔽中断(NMI)监视器

软定时和延迟函数

  • 定时器:函数在给定时间间隔用完时被调用
  • Linux定时器由可延迟函数实现,不能确保正好到期执行
  • 动态定时器的应用:nanosleep()系统调用
  • 延迟函数: 内核需要等待较短的时间,可使用延迟函数
    • udelay
    • ndelay

与定时测量有关的系统调用

  • time 和 gettimeofday

    • time: 1970年1月1日开始走过的秒数
    • gettimeofday: 1970年1月1日开始走过的秒数 + 在前1秒内走过的微秒数
    • 具体实现见P253
  • adjtimex

  • setitimer 和 alarm

    • 激活间隔定时器
  • 与POSIX定时器相关的系统调用