Linux 时钟处理机制(二)
步锁
如果 jiffies 大于等于 timer_jiffies (当前正要处理的软件时钟的到期时间,说明可能有软件时钟到期了),就一直运行3~7,否则跳转至8 计算得到 tv1 的索引,该索引指明当前到期的软件时钟所在 tv1 中的链表(结构参见3.2节),代码: int index = base->timer_jiffies & TVR_MASK; 调用 cascade 函数对软件时钟进行必要的调整(稍后会介绍调整的过程) timer_jiffies 的数值增加1 取出相应的软件时钟链表 遍历该链表,对每个元素进行如下操作 设置当前软件时钟为 base 中正在运行的软件时钟(即保存当前软件时钟到 base-> running_timer 成员中) 将当前软件时钟从链表中删除,即卸载该软件时钟 释放锁,执行软件时钟处理程序 再次获得锁 设置当前 base 中不存在正在运行的软件时钟 释放锁 3.3.3 软件时钟调整过程 函数 cascade 用于调整软件时钟(这个调整过程是指:将马上就要到期的软件时钟从其所在的链表中删除,重新计算到期时间的相对值(到期时间 - timer_jiffies ),然后根据该值重新插入到 base 中).注意到在软件时钟处理过程中,每次都是从 tv1 中取出一个链表进行处理,而不是从 tv2~tv5 中取,对软件时钟就要进行必要的调整. 在讲解 cascade 函数之前,再从直观上理解下为什么需要进行调整.所有软件时钟都是按照其到期时间的相对值(相对于 timer_jiffies )被调加到 base 中的.但是 timer_jiffies 的数值都会在处理中增加1(如3.3.2节所示),也就是说这个相对值会随着处理发生变化,当这个相对值小于等于256时,就要将软件时钟从 tv2~tv5 中转移到 tv1 中( tv1 中保存着下256个 tick 内到期的所有软件时钟). 函数 cascade 的实现如清单3-10 清单3-10 cascade 函数 static int cascade(struct tvec_base *base, struct tvec *tv, int index){ struct timer_list *timer, *tmp; struct list_head tv_list; list_replace_init(tv->vec index, &tv_list); list_for_each_entry_safe(timer, tmp, &tv_list, entry) { …… internal_add_timer(base, timer); } return index;} 该函数根据索引,取出相应的 tv ( tv2~tv5 )中的链表,然后遍历链表每一个元素.按照其到期时间重新将软件时钟加入到软件时钟的 base 中.该函数返回 tv 中被调整的链表索引值(参见图3-1). 清单3-9中调整软件时钟的代码如下: int index = base->timer_jiffies & TVR_MASK;if (!index && (!cascade(base, &base->tv2, INDEX(0))) && (!cascade(base, &base->tv3, INDEX(1))) && !cascade(base, &base->tv4, INDEX(2))) cascade(base, &base->tv5, INDEX(3)); 这部分代码表明:如果 index 有0再到0时( index 是对 timer_jiffies 取模),说明时间已经过了256个 tick ,这时要把 tv2 中软件时钟转移到 tv1 中.如果 index 和第一个 cascade 函数的返回值都从0再到到0时,说明时间已经过了256*64个 tick ,这时要把 tv3 中软件时钟转移到 tv1 或者 tv2 中.之后的调整过程依次类推.
3.4 自我激活 软件时钟可分为两种类型: 仅仅激活一次 激活多次或者周期性激活 多次激活的实现机制就是要在软件时钟处理函数中重新设置软件时钟的到期时间为将来的一个时间,这个过程通过调用 mod_timer 函数来实现.该函数的实现如清单3-11 清单3-11 mod_timer 函数 在 TCP 协议具体的一次数据包发送中,函数 tcp_write_xmit 用来将数据包从 TCP |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |