免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3890 | 回复: 5
打印 上一主题 下一主题

[时钟管理] 关于__mod_timer的疑问 [复制链接]

论坛徽章:
4
酉鸡
日期:2014-03-21 23:19:50狮子座
日期:2014-08-01 22:11:40酉鸡
日期:2015-01-10 21:31:442015年辞旧岁徽章
日期:2015-03-03 16:54:15
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-01-24 10:19 |只看该作者 |倒序浏览
10可用积分
__mod_timer() from 3.6.10

  1.         new_base = per_cpu(tvec_bases, cpu);

  2.         if (base != new_base) {
  3.                 /*
  4.                  * We are trying to schedule the timer on the local CPU.
  5.                  * However we can't change timer's base while it is running,
  6.                  * otherwise del_timer_sync() can't detect that the timer's
  7.                  * handler yet has not finished. This also guarantees that
  8.                  * the timer is serialized wrt itself.
  9.                  */
  10.                 if (likely(base->running_timer != timer)) {
  11.                         /* See the comment in lock_timer_base() */
  12.                         timer_set_base(timer, NULL);
  13.                         spin_unlock(&base->lock);
  14.                         base = new_base;
  15.                         spin_lock(&base->lock);
  16.                         timer_set_base(timer, base);<-----------------------------------切换
  17.                 }
  18.         }
复制代码
cpu迁移时的场景:
想不明白为何在修改timer做修改时, 要根据当前cpu去切换base?
不切换, 并在原有base上做修改不是更快么?

请指点, 谢谢!

最佳答案

查看完整内容

回复 3# chishanmingshen 当然得等待timer不在运行的时候,你才可以把它调度到本地cpu的时钟管理队列,如果该timer已经在其他cpu上运行了,你当然就不能调度了。至于为何要迁移,楼上给出的说法,呵呵最极端的就是cpu还有支持hotplug的,所以迁移是正常的,不然这个定时器很可能就再也无法调度了。

论坛徽章:
0
2 [报告]
发表于 2013-01-24 10:19 |只看该作者
本帖最后由 frogsu 于 2013-01-26 21:21 编辑

回复 3# chishanmingshen
当然得等待timer不在运行的时候,你才可以把它调度到本地cpu的时钟管理队列,如果该timer已经在其他cpu上运行了,你当然就不能调度了。至于为何要迁移,楼上给出的说法,呵呵最极端的就是cpu还有支持hotplug的,所以迁移是正常的,不然这个定时器很可能就再也无法调度了。


   

论坛徽章:
0
3 [报告]
发表于 2013-01-25 13:04 |只看该作者
首先得先了解两个结构体:
struct tvec_base用于组织、管理软件时钟的结构,在SMP系统里每个CPU均有一个。
struct timer_list用来表示软件时钟,主要记录了软件时钟的到期时间以及到期后要执行的操作。
struct timer_list结构中的base字段指向该定时器所属的cpu所对应tvec_base结构。
由__mod_timer函数可知base是由timer获取的指向所属cpu的tvec_base结构,即timer有对应的cpu管理自己。new_base是获取本地cpu的tvec_base结构,base与new_base两者相等,则更新timer过期时间,调用internal_add_timer完成timer添加。两者若不等,则timer发生了迁移,从其他cpu迁移到本地cpu,(至于为啥迁移,可能cpu调度其他事物繁忙,最坏的情况cpu hotplug可能吧),这样就需要这个分支的判断了,若没有在其他cpu运行,则调度添加到本地cpu的时间管理base里面。

论坛徽章:
4
酉鸡
日期:2014-03-21 23:19:50狮子座
日期:2014-08-01 22:11:40酉鸡
日期:2015-01-10 21:31:442015年辞旧岁徽章
日期:2015-03-03 16:54:15
4 [报告]
发表于 2013-01-25 13:16 |只看该作者
数据结构我明白, 我是不明白为何要迁移啊.
因为我看到在删timer的时候就会等, 一直等到条件ok时(比如那个cpu已经不运行该timer了)才去删.


回复 2# frogsu


   

论坛徽章:
0
5 [报告]
发表于 2013-01-25 17:58 |只看该作者
2.6.22内核以后引入了nohz这种节能方式,就是如果没有任务的话,就不再频繁的时钟中断,而是将CPU彻底关掉,当然不能掉电,而是执行halt,这个halt只有中断可以唤醒。当然也不能关掉全部的CPU,否则各个CPU的负载会极端的不平衡,因此必须有一个守护CPU,也就是get_nohz_load_balancer()返回的CPU(2.6.32中是这样)。将定时器移到守护CPU上,当前“空闲”的CPU就可以继续进入空闲状态。

论坛徽章:
4
酉鸡
日期:2014-03-21 23:19:50狮子座
日期:2014-08-01 22:11:40酉鸡
日期:2015-01-10 21:31:442015年辞旧岁徽章
日期:2015-03-03 16:54:15
6 [报告]
发表于 2013-01-26 21:23 |只看该作者
本帖最后由 chishanmingshen 于 2013-01-26 22:38 编辑

明白了,这个迁移是必要的。

非常感谢justlinux2010 frogsu两位的解答,谢谢!!!

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP