免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5500 | 回复: 18

[中断] jiffle中断丢失的疑问. [复制链接]

论坛徽章:
0
发表于 2013-04-26 10:46 |显示全部楼层
最近看中断处理相关的资料,想到个问题:
   假定一个其它中断触发,关中断执行, 这个时候计jiffles的时钟中断到了触发的时候, 那么因为中断被关闭了, jiffles是不是就丢失了加1的机会?   我想linux应该是不会有这种低级的问题, 哪位兄弟知道是怎么避免的?

论坛徽章:
0
发表于 2013-04-26 11:08 |显示全部楼层
这个错误不会发生!
中断处理是串行化的,并且不会丢失,只是比既定的安排延时了!
这个就是中断跟“不可靠信号”非常重要的区别!

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
发表于 2013-04-26 13:11 |显示全部楼层
回复 2# uliux
很遗憾的告诉你,时钟中断会丢失

   

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
发表于 2013-04-26 13:16 |显示全部楼层
回复 1# shuilidy
最近看中断处理相关的资料,想到个问题:
   假定一个其它中断触发,关中断执行, 这个时候计jiffles的时钟中断到了触发的时候, 那么因为中断被关闭了, jiffles是不是就丢失了加1的机会?   我想linux应该是不会有这种低级的问题, 哪位兄弟知道是怎么避免的?

时钟中断会丢失的,但是内核在处理时钟中断的时候,会通过mark_offset和get_offset来判断在这次中断之前,是否有中断丢失,从而挽救丢失的中断。

   

论坛徽章:
0
发表于 2013-04-26 13:48 |显示全部楼层
回复 3# 瀚海书香


哦   求代码   版主!!!

   

论坛徽章:
0
发表于 2013-04-26 13:50 |显示全部楼层
回复 4# 瀚海书香

这两个函数我没找到,能发出目录吗?
   

论坛徽章:
0
发表于 2013-04-26 13:58 |显示全部楼层
回复 4# 瀚海书香


多谢指导.   

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
发表于 2013-04-27 10:00 |显示全部楼层
本帖最后由 瀚海书香 于 2013-04-27 10:04 编辑

回复 6# uliux
目前x86计算机上的时钟振荡器有很高的精度,linux内核可以读振荡器中的计数器,通过比较上一次读的值与当前值,以确定中断是否丢失。如果发现中断丢失,则本次中断处理程序会给jiffies_64增加相应的计数。也就是说全局jiffies是可以弥补丢失的。那么每一个定时器如何弥补丢失的jiffies呢?

x86下时钟中断的处理函数:

中断触发---->irq0---->timer_interrupt---->global_clock_event->event_hander---->tick_handle_periodic
---->tick_periodic---->update_process_times---->run_local_timers---->raise_softirq(TIMER_SOFTIRQ)

对应的时钟软中断处理函数:
run_timer_softirq---->__run_timers
  1. static inline void __run_timers(struct tvec_base *base)
  2. {
  3.         struct timer_list *timer;

  4.         spin_lock_irq(&base->lock);
  5.         while (time_after_eq(jiffies, base->timer_jiffies)) {
  6.                 struct list_head work_list;
  7.                 struct list_head *head = &work_list;
  8.                 int index = base->timer_jiffies & TVR_MASK;

  9.                 /*
  10.                  * Cascade timers:
  11.                  */
  12.                 if (!index &&
  13.                         (!cascade(base, &base->tv2, INDEX(0))) &&
  14.                                 (!cascade(base, &base->tv3, INDEX(1))) &&
  15.                                         !cascade(base, &base->tv4, INDEX(2)))
  16.                         cascade(base, &base->tv5, INDEX(3));
  17.                 ++base->timer_jiffies;
  18.                 list_replace_init(base->tv1.vec + index, &work_list);
  19.                 while (!list_empty(head)) {
  20.                         void (*fn)(unsigned long);
  21.                         unsigned long data;

  22.                         timer = list_first_entry(head, struct timer_list,entry);
  23.                         fn = timer->function;
  24.                         data = timer->data;

  25.                         timer_stats_account_timer(timer);

  26.                         base->running_timer = timer;
  27.                         detach_timer(timer, 1);

  28.                         spin_unlock_irq(&base->lock);
  29.                         call_timer_fn(timer, fn, data);
  30.                         spin_lock_irq(&base->lock);
  31.                 }
  32.         }
  33.         base->running_timer = NULL;
  34.         spin_unlock_irq(&base->lock);
  35. }
复制代码
这个函数是一个while循环,如果时钟中断信号丢失,那么全局(jiffies-base->timer_jiffies)> 1,这个函数就会一个一个的执行,直到处理完所有的定时器。
   

论坛徽章:
0
发表于 2013-04-27 10:03 |显示全部楼层
回复 8# 瀚海书香

ok  谢谢你的热情回复!收到。
   

论坛徽章:
22
丑牛
日期:2014-08-15 14:32:0015-16赛季CBA联赛之同曦
日期:2017-12-14 15:28:14黑曼巴
日期:2017-08-10 08:14:342017金鸡报晓
日期:2017-02-08 10:39:42黑曼巴
日期:2016-11-15 15:48:38CU十四周年纪念徽章
日期:2016-11-09 13:19:1015-16赛季CBA联赛之同曦
日期:2016-04-08 18:00:03平安夜徽章
日期:2015-12-26 00:06:30程序设计版块每日发帖之星
日期:2015-12-03 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-09 06:20:002015亚冠之吉达阿赫利
日期:2015-07-03 08:39:42
发表于 2013-04-27 12:57 |显示全部楼层
回复 8# 瀚海书香


    一直的理解是,软件只能挽回一个丢失的时钟中断,如果丢了两个也会被认为期间只丢了一个。具体代码没去看过,我的理解对吗
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP