zoukankan      html  css  js  c++  java
  • Linux 时钟与计时器

    对 Linux 系统来说,时钟和计时器是两个十分重要的概念。时钟反应的是绝对时间,也可认为是实时时间。计时器反应的则是相对时间,即相对于系统启动后的计时。操作系统内核需要管理运行时间(uptime)和墙上时间(wall time),而内核中大量事务需要由时间驱动。

    系统时钟

    系统内核需要借助硬件设施来管理时间,实时时钟(RTC)是用来持久存放系统时间的设备,它由主机电池供电,因此即使关闭系统,实时时钟仍然在持续工作。

    当系统启动时,系统内核从实时时钟(RTC)读取实时时间,并将该时间转换为自 1970 年 1 月 1 日零时零分零秒以来所经历的秒数(即 Linux 时间秒),并将该秒数保存在系统变量 xtime 中。可以说实时时钟的主要作用就是初始化 xtime 变量。

    系统计时器

    系统计时器驱动着周期性发生的事件,在 X86 架构的系统中,系统计时器通常是一种可编程硬件芯片。系统计时器的频率称之为节拍率(tick rate),在内核中使用 HZ 变量来表示节拍率。

    对 X86 架构系统而言,内核版本 2.4 之前,系统计时器的节拍率为 100。自内核版本 2.6 开始,系统计时器节拍率设置为 1000。节拍率 HZ = 1000 的含义是系统计时器每秒钟可产生 1000 次中断请求,每一个计时中断周期称之为一个节拍(tick),也就是说每个节拍时长为 1 秒 / 1000次 = 0.001 秒 = 1 毫秒。节拍的时长决定着系统时间控制的精度,当节拍率从 100 提升到 1000 时,也就意味着系统计时器的精度从 10 毫秒提升到了 1 毫秒,这大大提高了系统对时间驱动事件调度的精度。而过于频繁的时钟中断会不可避免地增加系统计时开销。

    系统计时器及其计时中断处理程序是 Linux 内核管理机制的中枢,计时中断处理程序会定期地处理以下事务(包含而不限于):

    1. 更新系统运行时间(uptime)
    2. 更新墙上时间(wall time)
    3. 在对称多处理器系统(SMP)上,均衡调度各处理器上的运行队列
    4. 检查当前进程时间片(time slice)是否耗尽,如果耗尽,则重新调度
    5. 运行超时的动态定时器
    6. 更新资源耗尽和处理器时间的计算

    节拍、节拍率、节拍数

    运行时的 Linux 内核会周期性地发出计时中断请求(IRQ),每秒钟发出的计时中断请求数称之为节拍率,每次计时中断周期称之为节拍,实际计时中断次数称之为节拍数。

    Linux 内核的节拍率在编译时通过变量 HZ 来指定,一般设置为 100 或 1000,表示每秒中断 100 次或 1000 次。如果节拍率设置为 1000,那么一个节拍周期则为 1 秒 / 1000 次 = 1 毫秒。Linux 系统使用变量 jiffies 来记录系统开机以来经历的节拍数,即从系统启动开始,每发生一次计时中断,jiffies 则加 1。通过计算 jiffies 所表示的节拍数,便可得到系统的运行时间。

    节拍数转换为时间

    时间(秒) = 节拍数 × 节拍时长 = 节拍数 / 节拍率

    时间转换为节拍数

    节拍数 = 时间(秒) / 节拍时长 = 时间(秒) × 节拍率

    因此若已知系统内核 HZ = 1000,jiffies = 1000 时,便可以快速算出系统的运行时间为 jiffies / HZ = 1000 / 1000 = 1 秒

    术语

    名词 释义 备注
    Real Time Clock (RTC) 实时时钟
    Wall Time 墙上时钟 即当前实时时间
    Uptime 运行时间
    Time Slice 时间片
    Timer 计时器
    Timer Interrupt Request (IRQ) 计时中断请求
    HZ 每秒计时中断请求次数,也可称为节拍率(tick rate) HZ 值一般为 100, 250, 300 或 1000。最常见的为 1000 和 100。
    Tick 节拍 Tick 与 HZ 互为倒数,表示单次计时中断的时长。
    Jiffies 节拍数 表示系统开机以来的节拍数,即经历的 Tick 数量。
    Second (s)
    Millisecond (ms) 毫秒 1s = 1000ms
    Microsecond (us) 微秒 1ms = 1000us
    Nanosecond (ns) 纳秒 1us = 1000ns
    Picosecond (ps) 皮秒 1ns = 1000ps

    Ref.:

    Linux 内核中的 jiffies 及其作用介绍及 jiffies 等相关函数详解
    Linux Kernel - Jiffies
    Kernel Timer Systems

  • 相关阅读:
    python中基本类型的连接组合和互相转换13种方式
    Python中通过csv的writerow输出的内容有多余的空行两种方法
    Python中定义只读属性
    python 中的__init__.py的用法与个人理解
    python 调试大法
    python中错误、调试、单元测试、文档测试
    关于python中的增量赋值的理解
    jedis连接集群
    JSR 303
    感悟2017.3.17 星期五
  • 原文地址:https://www.cnblogs.com/ifantastic/p/4563339.html
Copyright © 2011-2022 走看看