Linux 内核-定时测量

    被问了 2 个 Question,全都答不上来,汗颜......

    1. gettimeofday() 函数的互斥机制?

    2. OS 的 tick,如何保证在不同频率的 CPU 上保持一致?

一. 时钟和定时器电路

    以固定的、预先定义的频率发出中断。

1. 实时时钟(Real Time Clock, RTC) 

    独立于 CPU 和其它所有芯片,和 CMOS RAM 集成在一起。能在 IRQ8 上发出周期性的中断,即时钟信号/时钟节拍,频率在 2-8192 Hz 之间。

2. 中断请求(Interrupt Request, IRQ)

3. 时间戳计数器(Time Stamp Counter, TSC)

    利用 64 位的时间戳计数器寄存器实现,在每个时钟信号到来时加 1。

    使用时,必须考虑时钟信号的频率,例如时钟节拍的频率是 1GHz,那么 TSC 每纳秒增加 1 次。为了做到这一点,Linux 必须在系统初始化期间,算出 CPU 的实际频率,所以同一内核映象可以运行在产生任何时钟频率的 CPU 上。

    calibrate_tsc() 函数通过计算一个大约在 5ms 的时间间隔内所产生的时钟信号的个数,来算出 CPU 的实际频率。

    通俗一点的理解,芯片(RTC)以固定频率发出中断(IRQ),然后有个计数器(TSC) 在实时计数。通过事先算好的 CPU 主频,就能知道时间间隔。

    那么,有 2 个问题:

    A. calibrate_tsc() 是用于计算主频继而确定时间的,那么它如何确定 5ms 或者其它时间?

    B. CPU 的实际主频有可能发生变化,例如某些笔记本在未接通电源时,自动将主频减半以节电,那时间是否会变得不精确?

    为了回答问题 A,就必须介绍 PIT:

4. 可编程间隔定时器(Programmable Interval Timer, PIT)

    PIT 永远以内核确定的固定频率不停的发出中断。每个 IBM 兼容 PC 都至少包含一个 PIT,PIT 通常是使用 0x40~0x43 I/O 端口的一个 8254 CMOS 芯片。

    为了回答问题 B,就必须介绍下面的几个定时器:

5. CPU 本地定时器

    一种能够产生单步中断或周期性中断的设备,类似 PIT。

6. 高精度事件定时器(High Precision Event Timer, HPET)

    其时钟信号的频率至少为 10MHz,即计数器最少可以每 100ns 增加 1 次。

7. ACPI 电源管理定时器(Advanced Configuration and Power Interface Power Management Timer, ACPI PMT)

    该设备其实是一个计数器,其时钟信号固定为 3.58MHz,在每个时钟节拍到来时增加 1。

    如果操作系统或者 BIOS 可以通过动态降低 CPU 的工作频率或者工作电压来节省电池的电能,那么 ACPI 电源管理定时器就比 TSC 更优越。在这种情况下,TSC 的频率发生改变,这会导致时间偏差及其它的不良后果,但 ACPI PMT 的频率不会改变。

    

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值