时钟和定时器电路
实时时钟(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定时器相关的系统调用