Linux内核定时器--原版.pptxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Linux 内核机制-定时器;1. 基本概念;在非进程上下文需要遵循的原则;如何判断中断上下文?;2.在了解定时器之前先了解三个概念;2.1 节拍率:HZ;在X86体系结构中,系统HZ默认值为100 内核在asm/param.h文件中定义了这个值 在编写内核代码时,HZ值不是一个固定不变的值,大多数体系结构的HZ值是可调的;2.1.1 理想的HZ值; 提高节拍率等同于提供啊中断解析度。例如:HZ=100的时钟执行粒度为10ms,,即系统中周期事件最快为每10ms运行一次,而不可能有更高的精度,但是当HZ = 1000时,解析度就为1ms—精细了10倍。虽然内核可以提供频度为1ms的时钟,但是并没有证据显示对系统中所有的程序而言,频率为1000HZ比100HZ的时钟更合适。;高HZ的优点;高HZ的缺点;2.2 jiffies;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秒;2.2.1 jiffies的回绕; 对于32位无符号长整型,最大取值为2^32-1。所以在溢出之前,定时器节拍计数最大为4294967295。如果节拍计数达到了最大值后还要继续增加的话,它的值就会回绕到0。 比如下面的代码: unsigned long timeout = jiffies + HZ/2; //设置超时时间为0.5秒 while (timeout jiffies) { /*还没有超时,继续执行任务*/ } /*超时了,发生错误*/;正常的情况下,上面的代码没有问题。但是当jiffies接近最大值的时候,就会出现回绕问题,如下图所示: 1. 循环中第一次比较时,jiffies = J1,没有超时 2. 循环中第二次比较时,jiffies = J2,实际已经超时了,但是jiffies超过最大值后又从0开始,所以J2远远小于timeout 3. while循环不会结束,相当于死循环。; 内核提供四个宏来帮助比较节拍计数,能正确处理节拍计数的回绕问题;为什么四个宏能解决回绕问题呢?;把上面得代码改成下面得代码就可以解决回绕问题:;关于时间的换算;2.3 用户空间的HZ;/*参见文件: kernel/time.c*/ clock_t jiffies_to_clock_t(long x) { #if (TICK_NSEC % (NSEC_PER_SEC / USER_HZ)) == 0 # if HZ USER_HZ return x * (USER_HZ / HZ); # else return x / (HZ / USER_HZ); # endif #else return div_u64((u64)x * TICK_NSEC, NSEC_PER_SEC / USER_HZ); #endif } EXPORT_SYMBOL(jiffies_to_clock_t);;2.4 时钟中断处理程序;获得xtime_lock锁,以便访问jiffies_64和墙上时间xtime进行保护 需要时应答或重新设置系统时钟 周期性地使用墙上时间更新实时时钟 调用体系结构无关的时钟例程:tick_periodic();/*tick_periodic函数位于:kernel/time/tick_common.c*/ static void tick_periodic(int cpu) { if (tick_do_timer_cpu == cpu) { write_seqlock(xtime_lock); /* Keep track of the next tick event */ tick_next_period = ktime_add(tick_next_period, tick_period); do_timer(1); write_sequnlock(xtime_lock); } update_process_times(user_mode(get_irq_regs())); profile_tick(CPU_PROFILING); };

文档评论(0)

5522280 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档