快速业务通道

Linux 时钟处理机制(二)

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-04-27
v4.vec i; } else if ((signed long) idx < 0) { vec = base->tv1.vec (base->timer_jiffies & TVR_MASK); } else { int i; if (idx > 0xffffffffUL) { idx = 0xffffffffUL; expires = idx base->timer_jiffies; } i = (expires >> (TVR_BITS 3 * TVN_BITS)) & TVN_MASK; vec = base->tv5.vec i; } list_add_tail(&timer->entry, vec);}

  代码解释:

  计算该软件时钟的到期时间和 timer_jiffies (当前正在处理的软件时钟的到期时间)的差值,作为索引保存到 idx 变量中.

  判断 idx 所在的区间,在

  [0, ]或者( , 0)(该软件时钟已经到期),则将要添加到 tv1 中

  [, ],则将要添加到 tv2 中

  [, ],则将要添加到 tv3 中

  [, ],则将要添加到 tv4 中

  [, ),则将要添加到 tv5 中,但实际上最大值为 0xffffffffUL

  计算所要加入的具体位置(哪个链表中,即 tv1~tv5 的哪个子链表,参考图3-1)

  将其添加到相应的链表中

  从这个函数可以得知,内核中是按照软件时钟到期时间的相对值(相对于 timer_jiffies 的值)将软件时钟添加到软件时钟所在的 base 中的.

  3.3.2 删除软件时钟

  内核可调用 del_timer 函数删除软件时钟, del_timer 的代码如清单3-4

  清单3-4 del_timer 函数

  int del_timer(struct timer_list *timer){ struct tvec_base *base; unsigned long flags; int ret = 0; …… if (timer_pending(timer)) { base = lock_timer_base(timer, &flags); if (timer_pending(timer)) { detach_timer(timer, 1); ret = 1; } spin_unlock_irqrestore(&base->lock, flags); } return ret;}

  代码解释:

  检测该软件时钟是否处在 pending 状态(在 base 中,准备运行),如果不是则直接函数返回

  如果处于 pending 状态,则获得锁

  再次检测软件时钟是否处于 pending 状态(该软件时钟可能被卸载了),不是则释放锁然后函数返回

  如果还是 pending 状态,则将其卸载,之后释放锁,函数返回

  如果在 SMP 系统中,则需使用 del_timer_sync 函数来删除软件时钟.在讲解 del_timer_sync 函数之前,先来看下 try_to_del_timer_sync 函数的实现(该函数被 del_timer_sync 函数使用),其代码如清单3-5

  清单3-5 try_to_del_timer_sync 函数

  int try_to_del_timer_sync(struct timer_list *timer){ struct tvec_base *base; unsigned long flags; int ret = -1; base = lock_timer_base(timer, &flags); if (base->running_timer == timer) goto out; ret = 0; if (timer_pending(timer)) { detach_timer(timer, 1); ret = 1; }out: spin_unlock_irqrestore(&base->lock, flags); return ret;}

  该函数检测当前运行的软件时钟是不是该软件时钟,如果是,则函数返回-1,表明目前不能删除该软件时钟;如果不是检测该软件时钟是否处于 pending 状态,如果不是,则函数返回0,表明软件时钟已经被卸载,如果处于 pending 状态再把软件时钟卸载,函数返回1,表明成功卸载该软件时钟.

  接下来,再来看看函数 del_timer_sync 定义,如清单3-6

  清单3-6 del_timer_sync 函数

  int del_timer_sync(struct timer_list *timer){ for (;;) { int ret = try_to_del_timer_sync(timer); if (ret >= 0) return ret; cpu_relax();

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号