Linux内核定时器--原版PPT优秀课件
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
变的值,大多数体系结构的HZ值是可调的
7Fra Baidu bibliotek
2.1.1 理想的HZ值
自Linux问世以来,i386体系结构中时 钟中断频率就设定为100HZ,但是在2.5开发 版本内核中,中断频率被提高到1000HZ。
提高节拍率意味着时钟中断产生得更 加频繁,所以中断处理程序也会更频繁的 执行,带来以下几点好处: • 更高的时钟中断解析度可提高时间驱动事 件的解析度。 • 提高了时间驱动事件的准确度。
超时了,但是jiffies超过最大值后又从0开始, 所以J2远远小于timeout • 3. while循环不会结束,相当于死循环。
16
内核提供四个宏来帮助比较节拍计数,能正确 处理节拍计数的回绕问题
Linux 内核机制-定时器
参考资料: 《Linux内核设计与实现》(美)Robert Love著,
陈莉君 康华 译 原文第三版 , 机械工业出版社。 《深入Linux内核架构》 (德)Wolfgang Mauerer
著 , 郭旭 译 ,人民邮电出版社。 《深入理解Linux内核》 DANIEL P.BOVET & MARCO
• 节拍率(HZ)是时钟中断的频率,表示一 秒钟中断的次数。 例如:HZ=100,表示一秒内触发100次时钟 中断程序。 节拍率是通过静态预处理定义的,在系统 启动时按照HZ值对硬件进行设置。 不同的体系结构,HZ值也不同。
6
注意点:
• 在X86体系结构中,系统HZ默认值为100 • 内核在<asm/param.h>文件中定义了这个值 • 在编写内核代码时,HZ值不是一个固定不
12
Jiffies定义于文件<linux/jiffies.h>中,格式如下:
extern u64 __jiffy_data jiffies_64; extern unsigned long volatile __jiffy_data jiffies; 使用例子如下: unsigned long time_tick = jiffies + 1; //从现在开始1个节拍 unsigned long later = jiffies + 5 * HZ; //从现在开始5秒
/*还没有超时,继续执行任务*/ }
/*超时了,发生错误*/
15
• 正常的情况下,上面的代码没有问题。但是当 jiffies接近最大值的时候,就会出现回绕问题, 如下图所示:
• 1. 循环中第一次比较时,jiffies = J1,没有超时 • 2. 循环中第二次比较时,jiffies = J2,实际已经
CESATI 著,陈莉君 张琼声 张宏伟 译 ,中国电力出版社。
1
1. 基本概念
• 在某些场景下,我们需要在特定的时间后 做某些动作,但是又不想一直等待而浪费 CPU,这时定时器是非常重要的。
• 定时器用于在将来某个时间点执行某个函 数以完成特定的任务 。
• Linux中内核定时器是基于软中断实现的, 也就是它处于中断上下文,而非进程上下 文。
• 内核可以通过调用in_atomic()判断当前是否 允许调度,不允许调度的情况包括:处于 中断上下文以及拥有自旋锁的上下文。
• 由于定时器异步执行,因而定时器处理函 数必须进行互斥保护。
4
2.在了解定时器之前先了解三个概念
• 节拍率:HZ • Jiffies • 时钟中断处理程序
5
2.1 节拍率:HZ
13
2.2.1 jiffies的回绕
• Jiffies变量总是无符号长整数,因此,在32 位体系结构上时32位,在64位体系结构上 时64位。32位的jiffies变量,如果HZ = 100, 497天后会溢出,如果HZ = 1000,49.7天后 会溢出。而64位则别指望能看到溢出。
• 访问jiffies的代码仅会读取jiffies_64的低32位, 通过get_jiffies_64()函数,可以读取整个64 位,多数代码只需要访问低32位就够了。
8
提高节拍率等同于提供啊中断解析度。 例如:HZ=100的时钟执行粒度为10ms,, 即系统中周期事件最快为每10ms运行一次, 而不可能有更高的精度,但是当HZ = 1000 时,解析度就为1ms—精细了10倍。虽然内 核可以提供频度为1ms的时钟,但是并没有 证据显示对系统中所有的程序而言,频率 为1000HZ比100HZ的时钟更合适。
执行中断处理程序,占用CPU时间过多。 • 减少了处理器对其他工作的时间,更频繁
的打乱处理器高速缓存并增加耗电。
11
2.2 jiffies
• 全局变量jiffies用来记录自系统启动以来产 生得节拍的总数。例如:系统启动了N秒, 那么jiffies就为N x HZ。
• Jiffies的类型为无符号长整型(unsigned long),用其它任何类型存放都不正确。
2
在非进程上下文需要遵循的原则
• 不允许访问用户空间 • Current无意义,因而也不可用 • 不能进行睡眠护着调度,不能调用schedule
或者某种wait_event,也不能调用任何可能 引起睡眠的函数,信号量也不可用,因为 信号量可能引起休眠。
3
如何判断中断上下文?
• 内核代码通过调用函数in_interrupt()可以判 断当前是否处于中断上下文,只要返回非0 就表示处于中断上下文。
14
对于32位无符号长整型,最大取值为 2^32-1。所以在溢出之前,定时器节拍计数最 大为4294967295。如果节拍计数达到了最大值 后还要继续增加的话,它的值就会回绕到0。 比如下面的代码: unsigned long timeout = jiffies + HZ/2; //设置超时时间为0.5秒 while (timeout < jiffies) {
9
高HZ的优点
• 内核定时器能够以更高的频度和更高的准 确度运行。
• 依赖定时值执行的系统调用,比如poll() 和select(),能够以更高的精度运行。
• 对诸如资源消耗和系统运行时间等的测量 会有更精细的解析度。
• 提高进程抢占的准确度。
10
高HZ的缺点
• 时钟中断执行的越频繁,系统的负担越高 • 时钟中断频率越高,处理器必须花时间来
7Fra Baidu bibliotek
2.1.1 理想的HZ值
自Linux问世以来,i386体系结构中时 钟中断频率就设定为100HZ,但是在2.5开发 版本内核中,中断频率被提高到1000HZ。
提高节拍率意味着时钟中断产生得更 加频繁,所以中断处理程序也会更频繁的 执行,带来以下几点好处: • 更高的时钟中断解析度可提高时间驱动事 件的解析度。 • 提高了时间驱动事件的准确度。
超时了,但是jiffies超过最大值后又从0开始, 所以J2远远小于timeout • 3. while循环不会结束,相当于死循环。
16
内核提供四个宏来帮助比较节拍计数,能正确 处理节拍计数的回绕问题
Linux 内核机制-定时器
参考资料: 《Linux内核设计与实现》(美)Robert Love著,
陈莉君 康华 译 原文第三版 , 机械工业出版社。 《深入Linux内核架构》 (德)Wolfgang Mauerer
著 , 郭旭 译 ,人民邮电出版社。 《深入理解Linux内核》 DANIEL P.BOVET & MARCO
• 节拍率(HZ)是时钟中断的频率,表示一 秒钟中断的次数。 例如:HZ=100,表示一秒内触发100次时钟 中断程序。 节拍率是通过静态预处理定义的,在系统 启动时按照HZ值对硬件进行设置。 不同的体系结构,HZ值也不同。
6
注意点:
• 在X86体系结构中,系统HZ默认值为100 • 内核在<asm/param.h>文件中定义了这个值 • 在编写内核代码时,HZ值不是一个固定不
12
Jiffies定义于文件<linux/jiffies.h>中,格式如下:
extern u64 __jiffy_data jiffies_64; extern unsigned long volatile __jiffy_data jiffies; 使用例子如下: unsigned long time_tick = jiffies + 1; //从现在开始1个节拍 unsigned long later = jiffies + 5 * HZ; //从现在开始5秒
/*还没有超时,继续执行任务*/ }
/*超时了,发生错误*/
15
• 正常的情况下,上面的代码没有问题。但是当 jiffies接近最大值的时候,就会出现回绕问题, 如下图所示:
• 1. 循环中第一次比较时,jiffies = J1,没有超时 • 2. 循环中第二次比较时,jiffies = J2,实际已经
CESATI 著,陈莉君 张琼声 张宏伟 译 ,中国电力出版社。
1
1. 基本概念
• 在某些场景下,我们需要在特定的时间后 做某些动作,但是又不想一直等待而浪费 CPU,这时定时器是非常重要的。
• 定时器用于在将来某个时间点执行某个函 数以完成特定的任务 。
• Linux中内核定时器是基于软中断实现的, 也就是它处于中断上下文,而非进程上下 文。
• 内核可以通过调用in_atomic()判断当前是否 允许调度,不允许调度的情况包括:处于 中断上下文以及拥有自旋锁的上下文。
• 由于定时器异步执行,因而定时器处理函 数必须进行互斥保护。
4
2.在了解定时器之前先了解三个概念
• 节拍率:HZ • Jiffies • 时钟中断处理程序
5
2.1 节拍率:HZ
13
2.2.1 jiffies的回绕
• Jiffies变量总是无符号长整数,因此,在32 位体系结构上时32位,在64位体系结构上 时64位。32位的jiffies变量,如果HZ = 100, 497天后会溢出,如果HZ = 1000,49.7天后 会溢出。而64位则别指望能看到溢出。
• 访问jiffies的代码仅会读取jiffies_64的低32位, 通过get_jiffies_64()函数,可以读取整个64 位,多数代码只需要访问低32位就够了。
8
提高节拍率等同于提供啊中断解析度。 例如:HZ=100的时钟执行粒度为10ms,, 即系统中周期事件最快为每10ms运行一次, 而不可能有更高的精度,但是当HZ = 1000 时,解析度就为1ms—精细了10倍。虽然内 核可以提供频度为1ms的时钟,但是并没有 证据显示对系统中所有的程序而言,频率 为1000HZ比100HZ的时钟更合适。
执行中断处理程序,占用CPU时间过多。 • 减少了处理器对其他工作的时间,更频繁
的打乱处理器高速缓存并增加耗电。
11
2.2 jiffies
• 全局变量jiffies用来记录自系统启动以来产 生得节拍的总数。例如:系统启动了N秒, 那么jiffies就为N x HZ。
• Jiffies的类型为无符号长整型(unsigned long),用其它任何类型存放都不正确。
2
在非进程上下文需要遵循的原则
• 不允许访问用户空间 • Current无意义,因而也不可用 • 不能进行睡眠护着调度,不能调用schedule
或者某种wait_event,也不能调用任何可能 引起睡眠的函数,信号量也不可用,因为 信号量可能引起休眠。
3
如何判断中断上下文?
• 内核代码通过调用函数in_interrupt()可以判 断当前是否处于中断上下文,只要返回非0 就表示处于中断上下文。
14
对于32位无符号长整型,最大取值为 2^32-1。所以在溢出之前,定时器节拍计数最 大为4294967295。如果节拍计数达到了最大值 后还要继续增加的话,它的值就会回绕到0。 比如下面的代码: unsigned long timeout = jiffies + HZ/2; //设置超时时间为0.5秒 while (timeout < jiffies) {
9
高HZ的优点
• 内核定时器能够以更高的频度和更高的准 确度运行。
• 依赖定时值执行的系统调用,比如poll() 和select(),能够以更高的精度运行。
• 对诸如资源消耗和系统运行时间等的测量 会有更精细的解析度。
• 提高进程抢占的准确度。
10
高HZ的缺点
• 时钟中断执行的越频繁,系统的负担越高 • 时钟中断频率越高,处理器必须花时间来