快速业务通道

Linux 时钟处理机制(二)

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-04-27
}}

  del_timer_sync 函数无限循环试图卸载该软件时钟,直到该软件时钟能够被成功卸载.从其实现中可以看出:如果一个软件时钟的处理函数正在执行时,对其的卸载操作将会失败. 一直等到软件时钟的处理函数运行结束后,卸载操作才会成功.这样避免了在 SMP 系统中一个 CPU 正在执行软件时钟的处理函数,而另一个 CPU 则要将该软件时钟卸载所引发的问题.

  3.3 时钟的软中断处理

  软件时钟的处理是在时钟的软中断中进行的.

  3.3.1 软中断初始化

  软中断的一个重要的处理时机是在每个硬件中断处理完成后(参见 irq_exit 函数),且由2.4节的内容可知:在硬件时钟中断处理中,会唤醒时钟的软中断,每次硬件时钟中断处理函数执行完成后都要进行时钟的软中断处理.和时钟 相关的软中断是 TIMER_SOFTIRQ ,其处理函数为 run_timer_softirq ,该函数用来处理所有的软件时钟.这部分初始化代码在函数 init_timers 中进行,如清单3-7

  清单3-7 init_timers 函数

  void __init init_timers(void){ …… open_softirq(TIMER_SOFTIRQ, run_timer_softirq, NULL);}

  3.3.2 处理过程

  函数 run_timer_softirq 所作的工作就是找出所有到期的软件时钟,然后依次执行其处理函数.其代码如清单3-8

  清单3-8 run_timer_softirq函数

  static void run_timer_softirq(struct softirq_action *h){ struct tvec_base *base = __get_cpu_var(tvec_bases); hrtimer_run_pending(); if (time_after_eq(jiffies, base->timer_jiffies)) __run_timers(base);}

  函数获得到本地 CPU 的 base .然后检测如果 jiffies

  注: hrtimer_run_pending() 函数是高精度时钟的处理.本文暂没有涉及高精度时钟相关的内容.

  大于等于 timer_jiffies ,说明可能已经有软件时钟到期了,此

  时就要进行软件时钟的处理,调用函数 __run_timers 进行处

  理.如果 jiffies 小于 timer_jiffies ,表明没有软件时钟到期,

  则不用对软件时钟进行处理.函数返回.

  接下来看一下函数 __run_timers 都作了些什么,如清单3-9

  清单3-9 __run_timers函数

  static inline void __run_timers(struct tvec_base *base){ …… spin_lock_irq(&base->lock); while (time_after_eq(jiffies, base->timer_jiffies)) { …… int index = base->timer_jiffies & TVR_MASK; if (!index && (!cascade(base, &base->tv2, INDEX(0))) && (!cascade(base, &base->tv3, INDEX(1))) && !cascade(base, &base->tv4, INDEX(2))) cascade(base, &base->tv5, INDEX(3)); base->timer_jiffies; list_replace_init(base->tv1.vec index, &work_list); while (!list_empty(head)) { …… timer = list_first_entry(head, struct timer_list,entry); fn = timer->function; data = timer->data; …… set_running_timer(base, timer); detach_timer(timer, 1); spin_unlock_irq(&base->lock); { int preempt_count = preempt_count(); fn(data); …… } spin_lock_irq(&base->lock); } } set_running_timer(base, NULL); spin_unlock_irq(&base->lock);}

  代码解释:

  获得 base 的同

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号