加入收藏 | 设为首页 | 会员中心 | 我要投稿 应用网_阳江站长网 (https://www.0662zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

Linux的时钟处理机制

发布时间:2016-05-16 20:26:35 所属栏目:Linux 来源:站长网
导读:在 Linux 操作系统中,很多活动都和时间有关,例如:进程调度和网络处理 等等。所以说,了解 Linux 操作系统中的时钟处理机制有助于更好地了解 Linux 操作系统

从上面的说明中可以看出:软件时钟是按照其到期时间相对于当前正在处理 的软件时钟的到期时间( timer_jiffies 的数值)保存在 struct tvec_base 变量中的。而且这个到期时间的最大相对值(到期时间 - timer_jiffies )为 0xffffffffUL ( tv5 最后一个元素能够表示的相对到期时间的最大值)。

还需要注意的是软件时钟的处理是局部于 CPU 的,所以在 SMP 系统中每一 个 CPU 都保存一个类型为 struct tvec_base 的变量,用来组织、管理本 CPU 的软件时钟。从图中也可以看出 struct tvec_base 变量是 per-CPU 的(关于 per-CPU 的变量原理和使用参见参考资料)。

由于以后的讲解经常要提到每个 CPU 相关的 struct tvec_base 变量,所以 为了方便,称保存软件时钟的 struct tvec_base 变量为该软件时钟的 base , 或称 CPU 的 base 。

3.3 添加或删除软件时钟

在了解了软件时钟的数据组织关系之后,现在来看一下如何添加以及删除一 个软件时钟。

3.3.1 添加软件时钟

在 Linux 内核中要添加一个软件时钟,首先必须分配 struct timer_list 类型的变量,然后调用函数 add_timer() 将该软件时钟添加到相应调用 add_timer 函数的 CPU 的 base 中。 Add_timer 是对函数 __mod_timer() 的 一层包装。函数 __mod_timer() 的代码如清单3-2:

清单3-2 __mod_timer 函数

int __mod_timer(struct timer_list *timer, unsigned long expires)
{
  struct tvec_base *base, *new_base;
  unsigned long flags;
  int ret = 0;
  ……
  base = lock_timer_base(timer, &flags);
  if (timer_pending(timer)) {
    detach_timer(timer, 0);
    ret = 1;
  }
  new_base = __get_cpu_var(tvec_bases);
  if (base != new_base) {
    if (likely(base->running_timer != timer)) {
      /* See the comment in lock_timer_base() */
      timer_set_base(timer, NULL);
      spin_unlock(&base->lock);
      base = new_base;
      spin_lock(&base->lock);
      timer_set_base(timer, base);
    }
  }
  timer->expires = expires;
  internal_add_timer(base, timer);
  spin_unlock_irqrestore(&base->lock, flags);
  return ret;
}

(编辑:应用网_阳江站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!