当前位置: 首页 > news >正文

Linux内核设计与实现 - 第11章 定时器和时间管理

目录

    • 11.1 内核中的时间概念
    • 11.2 硬件时钟源
    • 11.3 jiffies和HZ
    • 11.4 定时器实现
    • 11.5 高精度定时器(hrtimer)
    • 11.6 延迟执行机制
    • 11.7 时间管理实践

在这里插入图片描述

11.1 内核中的时间概念

  1. 墙上时间(Wall Time)

    • 实际日期和时间
    • 通过RTC(实时时钟)获取
    • 用户空间通过time()/gettimeofday()获取
  2. 系统运行时间(Uptime)

    • 自系统启动以来的时间
    • 不受系统时间修改影响
    • 通过/proc/uptime查看
  3. 单调时间(Monotonic Time)

    • 保证单向递增的时间
    • 不受NTP调整影响
    • 适合测量时间间隔

11.2 硬件时钟源

  1. RTC(实时时钟)

    • 独立供电的硬件时钟
    • 精度较低(秒级)
    • 提供系统初始时间
  2. TSC(时间戳计数器)

    • CPU内部64位寄存器
    • 高精度(纳秒级)
    • 受CPU频率变化影响
  3. HPET(高精度事件定时器)

    • 专门的时间计数硬件
    • 精度可达100纳秒
    • 支持多个比较器

11.3 jiffies和HZ

  1. jiffies机制

    • 全局变量jiffies
    • 记录自启动以来的时钟滴答数
    • 32位系统使用jiffies_64避免回绕
  2. HZ参数

    • 定义每秒时钟中断次数
    • 典型值:100, 250, 300, 1000
    • 高HZ值提高响应速度但增加开销
  3. 时间转换函数

    jiffies_to_msecs(unsigned long j);  // jiffies转毫秒
    msecs_to_jiffies(unsigned int m);   // 毫秒转jiffies
    

11.4 定时器实现

  1. 定时器结构

    struct timer_list {struct list_head entry;unsigned long expires;void (*function)(unsigned long);unsigned long data;...
    };
    
  2. 定时器API

    init_timer(struct timer_list *timer);  // 初始化定时器
    add_timer(struct timer_list *timer);   // 激活定时器
    mod_timer(struct timer_list *timer, unsigned long expires); // 修改定时器
    del_timer(struct timer_list *timer);   // 删除定时器
    
  3. 实现注意事项

    • 定时器函数在中断上下文执行
    • 不能睡眠或调用可能阻塞的函数
    • 需要处理竞争条件

11.5 高精度定时器(hrtimer)

  1. hrtimer特点

    • 纳秒级精度
    • 基于红黑树实现
    • 支持多种时钟源
  2. hrtimer API

    hrtimer_init(struct hrtimer *timer, clockid_t which_clock, enum hrtimer_mode mode);
    hrtimer_start(struct hrtimer *timer, ktime_t tim, const enum hrtimer_mode mode);
    hrtimer_cancel(struct hrtimer *timer);
    
  3. 使用场景

    • 多媒体应用
    • 实时系统
    • 性能分析工具

11.6 延迟执行机制

  1. 忙等待

    udelay(unsigned long usecs);  // 微秒级延迟
    ndelay(unsigned long nsecs); // 纳秒级延迟
    
  2. 调度延迟

    msleep(unsigned int msecs);     // 毫秒级睡眠
    ssleep(unsigned int seconds);   // 秒级睡眠
    
  3. 工作队列延迟

    schedule_delayed_work(struct delayed_work *dwork, unsigned long delay);
    

11.7 时间管理实践

  1. 性能测量

    ktime_get();      // 获取当前时间
    ktime_sub(a, b);  // 计算时间差
    
  2. 超时处理

    wait_event_timeout(wq, condition, timeout);
    
  3. 节流控制

    unsigned long usecs_to_jiffies(const unsigned int u);
    
http://www.dtcms.com/a/294112.html

相关文章:

  • static 关键字的 特殊性
  • 【AI智能体】Dify 开发与集成MCP服务实战操作详解
  • Elasticsearch Circuit Breaker 全面解析与最佳实践
  • 【Word Press基础】创建一个动态的自定义区块
  • JS逆向基础( AES 解密密文WordArray和Uint8Array实战②)
  • 【无标题】word 中的中文排序
  • Pycharm2025 安装教程 免费分享 没任何套路
  • PDF转Word的简单方法
  • CSP-J 2021 入门级 第一轮(初赛) 阅读程序(3)
  • Android组件化实现方案深度分析
  • Day 8-zhou R包批量安装小补充!!!
  • java设计模式 -【策略模式】
  • AJAX案例合集
  • flutter使用CupertinoPicker绘制一个传入数据源的省市区选择器
  • 二级建造师学习笔记-2025
  • 【Linux-云原生-笔记】keepalived相关
  • DenseNet详解,附模型代码(pytorch)
  • Python设计模式 - 桥接模式
  • vite搭建react-ts项目,@别名配置
  • Python-Pytorch编码习惯
  • Windows 编程辅助技能:速览定义
  • 生成式人工智能展望报告-欧盟-02-技术方面
  • 以 “有机” 重构增长:云集从电商平台到健康生活社区的跃迁
  • 突发限制下的破局之路:国产之光 Lynx 重构 AI 开发安全壁垒
  • Petalinux的常用指令
  • Hexo - 免费搭建个人博客04 - 创建另一个私人仓库,对Hexo项目进行版本管理
  • RabbitMQ--消费端单线程与多线程
  • 电子电气架构 --- 汽车软件全生命周期
  • 小架构step系列23:加载自定义配置
  • Vue 浏览器本地存储