第七章维护定时器
第七章 维护定时器
7.1定时器*网络协议大量使用定时器实现与时间有关的功能*当以下任一情况发生时,定时器模块存在性能问题:*定时器算法由CPU实现:每一个时钟滴答都要中断CPU。若时钟精度在微秒量级,中断处理开销很大(一次中断处理开销为几微秒)*要求细粒度定时器(如微秒量级):即使不用CPU处理每个时钟滴答的中断,定时器操作(如启动、终止等)的延迟必须很小同时活跃的定时器数自很天:查找和操作定时器的延迟必须很小*当网络速度提高时,以上问题更突出:*定时器精度相应要提高:比如需要更细粒度的定时器测量RTT*定时器操作速度要提高:包速提高了,每个包都要涉及定时器操作
7.1 定时器 网络协议大量使用定时器实现与时间有关的功能 当以下任一情况发生时,定时器模块存在性能问题: 定时器算法由CPU实现:每一个时钟滴答都要中断CPU。若时钟精 度在微秒量级,中断处理开销很大(一次中断处理开销为几微秒) 要求细粒度定时器(如微秒量级):即使不用CPU处理每个时钟滴 答的中断,定时器操作(如启动、终止等)的延迟必须很小 同时活跃的定时器数目很大:查找和操作定时器的延迟必须很小 当网络速度提高时,以上问题更突出: 定时器精度相应要提高:比如需要更细粒度的定时器测量RTT 定时器操作速度要提高:包速提高了,每个包都要涉及定时器操作
定时器模块的组成*StartTimer (Interval, RequestID, ExpiryAction):*启动一个定时器,定时器在Interval个时间单位后超时*ExpiryAction:指出超时后采取的动作,如调用一个指定的处理例程StopTimer (RequestID):*利用客户和RequestID信息定位定时器,并终止定时器PerTickBookkeeping:*每隔1个定时器滴答(取决于定时器的粒度),检查是否有定时器超时;若有,调用ExpiryProcessing例程ExpiryProcessing*执行StartTimerO中指定的ExpiryAction前2个例程由客户调用,后两个例程由定时器管理程序调用
定时器模块的组成 StartTimer (Interval, RequestID, ExpiryAction): 启动一个定时器,定时器在Interval个时间单位后超时 ExpiryAction:指出超时后采取的动作,如调用一个指定的处理例程 StopTimer (RequestID): 利用客户和RequestID信息定位定时器,并终止定时器 PerTickBookkeeping: 每隔1个定时器滴答(取决于定时器的粒度),检查是否有定时器超 时;若有,调用ExpiryProcessing例程 ExpiryProcessing: 执行StartTimer()中指定的ExpiryAction 前2个例程由客户调用,后两个例程由定时器管理程序调用
定时器算法的性能指标*两个性能指标:*定时器数据结构占用的空间(空间复杂度)*定时器模块中例程的调用延迟(从调用到完成的时间)((时间复杂度)*以上两个性能指标都与定时器的数量有关:*定时器数量越多,占用空间越大*定时器数量越多,查找定时器的时间越长,每定时器滴答要完成的操作越多
定时器算法的性能指标 两个性能指标: 定时器数据结构占用的空间(空间复杂度) 定时器模块中例程的调用延迟(从调用到完成 的时间)(时间复杂度) 以上两个性能指标都与定时器的数量有关: 定时器数量越多,占用空间越大 定时器数量越多,查找定时器的时间越长,每 定时器滴答要完成的操作越多
7.2简单的定时器方案*方案一:*StartTimerO找到一个内存位置(变量),设置该位置的值为Interval*每隔1个定时器滴答,PerTickBookkeeping递减每个活跃的定时器;若某个定时器的值变为0,调用相应的ExpiryAction*复杂度分析:*每个定时器只使用一个内存位置,所用空间最小*PerTickBookkeeping的执行时间为O(n),其余为O(1)*适合活跃定时器少、PerTickBookkeeping实现快(如由专用硬件实现)的场合
7.2 简单的定时器方案 方案一: StartTimer()找到一个内存位置(变量),设置该位置的 值为Interval 每隔1个定时器滴答,PerTickBookkeeping递减每个活跃 的定时器;若某个定时器的值变为0,调用相应的 ExpiryAction 复杂度分析: 每个定时器只使用一个内存位置,所用空间最小 PerTickBookkeeping的执行时间为O(n),其余为O(1) 适合活跃定时器少、PerTickBookkeeping实现快(如由 专用硬件实现)的场合