Chinaunix首页 | 论坛 | 博客
  • 博客访问: 255673
  • 博文数量: 63
  • 博客积分: 179
  • 博客等级: 入伍新兵
  • 技术积分: 342
  • 用 户 组: 普通用户
  • 注册时间: 2010-06-27 20:29
文章分类

全部博文(63)

文章存档

2019年(2)

2013年(5)

2012年(53)

2011年(3)

分类:

2012-06-11 20:47:59


  欢迎转载:http://kylinux.cublog.cn







实现软件时钟原理也比较简单:每一次硬件时钟中断到达时,内核更新的 jiffies ,然后将其和软件时钟的到期时间进行比较。如果 jiffies 等于或者大于软件时钟的到期时间,内核就执行软件时钟指定的函数。

接下来的几节会详细介绍 Linux2.6.23 是怎么实现软件时钟的。

  • struct timer_list :软件时钟,记录了软件时钟的到期时间以及到期后要执行的操作。

  • struct tvec_base :用于组织、管理软件时钟的结构。在 SMP 系统中,每个 CPU 有一个。


域名 类型 描述
entry struct list_head 所在的链表
expires unsigned long 到期时间,以 tick 为单位
function void (*)(unsigned long) 回调函数,到期后执行的操作
data unsigned long 回调函数的参数
base struct tvec_base * 记录该软件时钟所在的 struct tvec_base 变量


注:一个 tick 表示的时间长度为两次硬件时钟中断发生时的时间间隔



域名 类型 描述
lock spinlock_t 用于同步操作
running_timer struct timer_list * 正在处理的软件时钟
timer_jiffies unsigned long 当前正在处理的软件时钟到期时间
tv1 struct tvec_root 保存了到期时间从 timer_jiffies 到 timer_jiffies + 对象2之间(包括边缘值)的所有软件时钟
tv2 struct tvec 保存了到期时间从 timer_jiffies + 对象3到 timer_jiffies +对象4之间(包括边缘值)的 所有软件时钟
tv3 struct tvec 保存了到期时间从 timer_jiffies +对象5到 timer_jiffies +对象6之间(包括边缘值)的所有软件时钟
tv4 struct tvec 保存了到期时间从 timer_jiffies +对象7到 timer_jiffies +对象8之间(包括边缘值)的所有软件时钟
tv5 struct tvec 保存了到期时间从 timer_jiffies +对象9到 timer_jiffies +对象10之间(包括边缘值)的所有软件时钟


其中 tv1 的类型为 struct tvec_root ,tv 2~ tv 5的类型为 struct tvec .



struct tvec {
struct list_head vec[TVN_SIZE];
};

struct tvec_root {
struct list_head vec[TVR_SIZE];
};

可见它们实际上就是类型为 struct list_head 的数组,其中 TVN_SIZE 和 TVR_SIZE 在系统没有配置宏 CONFIG_BASE_SMALL 时分别被定义为64和256。



数据结构之间的关系

从图中可以清楚地看出:软件时钟( struct timer_list ,在图中由 timer 表示)以双向链表( struct list_head )的形式,按照它们的到期时间保存相应的( tv1~tv5 )中。tv1 中保存了相对于 timer_jiffies 下256个 tick 时间内到期的所有软件时钟; tv2 中保存了相对于 timer_jiffies 下256*64个 tick 时间内到期的所有软件时钟; tv3 中保存了相对于 timer_jiffies 下256*64*64个 tick 时间内到期的所有软件时钟; tv4 中保存了相对于 timer_jiffies 下256*64*64*64个 tick 时间内到期的所有软件时钟; tv5 中保存了相对于 timer_jiffies 下256*64*64*64*64个 tick 时间内到期的所有软件时钟。具体的说,从静态的角度看,假设 timer_jiffies 为0,那么 tv1[0] 保存着当前到期(到期时间等于 timer_jiffies )的软件时钟(需要马上被处理), tv1[1] 保存着下一个 tick 到达时,到期的所有软件时钟, tv1[n] (0<= n <=255)保存着下 n 个 tick 到达时,到期的所有软件时钟。而 tv2[0] 则保存着下256到511个 tick 之间到期所有软件时钟, tv2[1] 保存着下512到767个 tick 之间到期的所有软件时钟, tv2[n] (0<= n <=63)保存着下256*(n+1)到256*(n+2)-1个 tick 之间到达的所有软件时钟。 tv3~tv5 依次类推。


注:本章主要摘自IBM资料,下章主要对软时钟中断代码分析


资料:http://www.ibm.com/developerworks/cn/linux/l-cn-clocks/index.html


阅读(889) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~