[讨论]内核里的timer中分级排序的一个问题,我觉得可以做得更好
时间:2010-09-27
来源:互联网
include/timer.h
kernel/timer.c
C/C++ code
static void internal_add_timer(struct tvec_base *base, struct timer_list *timer)
{
unsigned long expires = timer->expires;
unsigned long idx = expires - base->timer_jiffies;
struct list_head *vec;
if (idx < TVR_SIZE) {
int i = expires & TVR_MASK;
vec = base->tv1.vec + i;
}
见这段, timer的原理是分级。但是在这个级别里是乱序的,采取的算法是expires & TVR_MASK.
三个段其实就是
0x100≤interval≤0x3fff interval>>8
0x100000≤interval≤0x3ffffff interval>>8+6+6
0x4000000≤interval≤0xffffffff interval>>8+6+6+6
我的疑问,为什么不直接interval>>8,得出一个值,这样就形成一个排序。
0下标的时间肯定大于1的小标,1的肯定大于2,这样每次只要执行0下标所悬挂的timer,如果有一个执行不成功,就表示无需执行小标为1的。而不需要遍历整个root。
这个算法也很容易证明
C/C++ code
for(int i=0; i<0x3fff; ++i)
{
printf("%d, ", i>>
;
if( i%30==0 )
{
printf("\n"
;
}
}
kernel/timer.c
C/C++ code
static void internal_add_timer(struct tvec_base *base, struct timer_list *timer)
{
unsigned long expires = timer->expires;
unsigned long idx = expires - base->timer_jiffies;
struct list_head *vec;
if (idx < TVR_SIZE) {
int i = expires & TVR_MASK;
vec = base->tv1.vec + i;
}
见这段, timer的原理是分级。但是在这个级别里是乱序的,采取的算法是expires & TVR_MASK.
三个段其实就是
0x100≤interval≤0x3fff interval>>8
0x100000≤interval≤0x3ffffff interval>>8+6+6
0x4000000≤interval≤0xffffffff interval>>8+6+6+6
我的疑问,为什么不直接interval>>8,得出一个值,这样就形成一个排序。
0下标的时间肯定大于1的小标,1的肯定大于2,这样每次只要执行0下标所悬挂的timer,如果有一个执行不成功,就表示无需执行小标为1的。而不需要遍历整个root。
这个算法也很容易证明
C/C++ code
for(int i=0; i<0x3fff; ++i)
{
printf("%d, ", i>>

if( i%30==0 )
{
printf("\n"

}
}
作者: lin_style 发布时间: 2010-09-27
最后那个算法证明,笑脸是 interval>>n, 后面的n
作者: lin_style 发布时间: 2010-09-27
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28