Linux 时钟处理机制
加入时钟事件设备这个事件,将会调用函数 tick_check_new_device .顺着该函数的调用序列向下查找.tick_set_periodic_handler 函数将时钟事件设备的 event_handler 成员赋值为 tick_handle_periodic 函数的地址.由此可知,函数 tick_handle_periodic 为硬件时钟中断发生时,真正的运行函数.
函数 tick_handle_periodic 的处理过程分成了以下两个部分: 1全局处理:整个系统中的信息处理 ●全局处理(仅在一个 CPU 上运行):
|
在函数 inet_csk_init_xmit_timers 中,变量 icsk 就是前面提到的面向连接的套接字,其成员 icsk_retransmit_timer 则为实现超时重传的软件时钟.该函数调用 setup_timer 函数将函数 tcp_write_timer (参考函数 tcp_init_xmit_timers )设置为软件时钟 icsk->icsk_retransmit_timer 当时间到期后的处理函数.初始化的时候并没有设置该软件时钟的到期时间.
在 TCP 协议具体的一次数据包发送中,函数 tcp_write_xmit 用来将数据包从 TCP 层发送到网络层,如清单3-16.
清单3-16 tcp_write_xmit 函数
static int tcp_write_xmit(struct sock *sk, unsigned int mss_now, int nonagle) { struct tcp_sock *tp = tcp_sk(sk); struct sk_buff *skb; …… if (unlikely(tcp_transmit_skb(sk, skb, 1, GFP_ATOMIC))) break; tcp_event_new_data_sent(sk, skb); …… return !tp->packets_out && tcp_send_head(sk); } |
注意该函数中加粗的函数,其中 tcp_transmit_skb 函数是真正将数据包由 TCP 层发送到网络层中的函数.数据发送后,将调用函数 tcp_event_new_data_sent ,而后者又会调用函数 inet_csk_reset_xmit_timer 来设置超时软件时钟的到期时间.
当函数 tcp_event_new_data_sent 结束之后,处理超时的软件时钟已经设置好了.内核会在每一次时钟中断处理完成后检测该软件时钟是否到期.如果网络真的超时,没有 ACK 返回,那么当该软件时钟到期后内核就会执行函数 tcp_write_timer .函数 tcp_write_timer 将进行数据包的重新发送,并重新设置超时重传软件时钟的到期时间.
4 总结
本文介绍了 Linux 内核的时钟处理机制.简单介绍了系统的硬件计时器,然后重点介绍了硬件时钟的处理过程和软件时钟的处理过程以及软件时钟的应用.
Empire CMS,phome.net |