数据发送数据发送定时器的设计

数据发送数据发送定时器的设计(1)数据发送缓冲区队列为了解决数据发送出现问题后重新发送数据, 创建一个发送缓冲区来存放数据副本

发送缓冲区队列的记录由五个字段组成,它们分别为DevNo 字段、Data 字段、DataType 字段、SendTimes 字段和OverTime 字段,发送缓冲区的大小由应用程序来决定

①DevNo 字段:发送数据目的终端编号

Data 字段: 系统所要发送的数据; DataType 字段: 记录当前项Data 字段里数据的类型,用以加速与应答的匹配速度

②SendTimes 字段:主要用来记录Data 字段中的数据可重发的次数, 同时它反映了相应数据项的状态, 数据每次重发一次, 它的值就会被减1

如果该字段的值变为0,则表示数据无法到达目的地址,应该丢失该数据, 并向上层模块通知出错信息; 如果该字段为- 1,则说明该数据已经成功到达对方并得到对方的应答; 如果数据发送超时, 只要该字段不为0, 即数据的重发次数没有超过规定的次数( 如: 3 次) , 数据将被重发, 并被重新压到队列尾部

③OverTime 字段:说明该项数据距下次发送还剩余的时间单位数, 它是一个相对值

如果该字段的值变为0 且SendTimes 不为0,则重发此数据

( 2) 发送定时器的定时算法由于定时器的精确度要求相对比较高, 且维护频率比较频繁, 如果对每个数据都进行独立的计数器管理, 则会消耗系统的大量CPU 资源, 从而影响整个测控通信系统的效率和吞吐率, 因此本测控通信系统采用相对定时的方法, 即每个数据项的实际定时时间是前面的所有项的定时时间与本身的定时时间的总和

它的相对定时时间为2 个时间单位, 而它实际的定时时间为10+8+2+3+2+5+2=32个时间单位

数据项的二元组分别表示数据的相对定时时间和数据剩余发送次数, 如二元组( 10, 0) 表示该数据相对的定时时间为10 个时间单元,而它的重发机会只有0 次了

也就是说,数据如果在其定时器时限范围内不能收到应答, 就可断定数据无法到达目的地, 将被丢弃

由于测控系统一般网络结构不是太复杂, 所以数据发送定时时间设为固定值, 从而可知先入队的数据肯定先超时, 不可能出现排在队列后面的数据比先前的数据更早地超时

这种计算定时时间的方法, 只有队列头所对应数据的定时时间是绝对值, 而其他数据的定时值全是相对值, 所以无论缓冲队列中有多少数据, 只要维护队列头指针所对应的数据项的定时器, 就可以完成维护所有数据定时器的任务, 从而减少了维护定时器的频率, 减轻了系统的工作量

(3)发送定时器的定时值前面提到本设计的定时值是固定的, 那么这个值应该设为多长? 这个时隔短会引起不必要的发送, 正如Jacobson 记述的那样,当网络已经处于饱和状态时, 不必要的发送会增加网络的负载, 对网络而言这就像在火上浇油一样; 时隔长会影响测控性能

从理论上这个问题的解决方法是根据网络性能的不断测定, 通过一种动态的算法来不断调整, 才能达到一种最佳效果

如TCP 通常采用的Jacobson 算法, 对于每一条连接, 它保存一个变量RTT, 存放当前到目的端往返时间最接近的估计值, 当发送一个数据段, 同时启动相应的定时器后, 如果时间太长就触发重发机制

如果在定时器超过定时值之前得到了确认, TCP 测量该确认花费了多长时间( 假定为M) , 那么根据公式RTT=σRTT+(1- σ)M 来修正原有的RTT值

σ是一个推荐值为0.9 的平滑因子(Smoothing Factor) ,决定以前的RTT 值的权值(即所占比例)

但由于本测控通信系统路由器和网络流量均变化很小,同时为了减小系统的复杂度, 所以采用固定的定时值

经过测试得到数据在网络中一个往返传输时间的概率密度, 显然将定时值设为 40毫秒较合理, 因为在这个时间内, 绝大部分数据在网络没有故障的情况下都能够收到应答

研究与开发(4)发送定时器的定时改进算法从上面的定时算法可以看出, 其时钟的维护频率为一个计时单位(1ms),这样维护频率显然还是比较高

为了进一步减少定时器计数的维护频率, 使用定制时钟的方法, 即将队列头指针所对应的数据项的定时时间也改为相对值, 其值就是该项数据成为队列头时的时间

也就是说, 当一个数据移到队列头时, 就可以为其定制一个时钟, 其时钟的间隙即为该数据所对应的OverTime 字段值,这个时钟维护信息一到,队列头所对应数据肯定超时, 这样一个数据在一次发送过程中最多只会引发一次时钟维护, 大大降低了定时时钟的维护频率

设数据入队列的时刻为Ta,当前时刻为Tn,则当前数据已经逝去的时间为Tp=Tn- Ta

因此当数据入队列时, 操作与先前有所不同, 不能简单根据所有的OverTime 累加值来计算自己的相对值,而必须考虑Tp值:当数据由于超时重发而重新进入队列时, Tn= Ta, 即Tp=0, 计算方法与改进前无变化; 当新的数据入队列时, 则必须在改进前算法结果减去Tp值

再压入一个新的数据,则它的定时时间应为40- (10+8+2+3+2+5+2- Tp)=8+Tp

当时钟维护信息到来时, 队列头数据项可能出现三种不同的情况, 第一种情况:数据已经收到应答, 但为了保持定时计数的准确性, 不是从缓冲队列中删除, 而是将数据直接出队, 不再保留该项数据; 第二种情况:数据没有收到相应的代应答, 但其发送次数没有超过规定次数( 如3 次) , 这计时将数据出队, 送到发送模块对数据进行发送, 数据(5)发送定时器的发送缓冲区的空间收集相对定时的算法有效地解决了维护多个定时器而使系统增加的系统运行压力, 同时也带来了一定的负面作用, 发送缓冲区队列是一个有限的空间, 而相对定时算法, 其定时计算与它前面的数据项有着紧密的联系, 因此不能随便地增减队列中的数据项, 否则将引起系统定时的混乱

也就是说即使某项数据已经收到了应答, 也不能马上从队列中删除, 所以在某些情况下会造成严重的资源浪费, 甚至会导致队列空间的不足, 无法容纳更多需发送的数据

缓冲区空间收集就是解决这个问题的, 它会在需要的情况下对缓冲区队列的空间进行重新整理,释放不必要的空间,以使缓冲区队列拥有最大的可利用的空间

整理缓冲区队列空间最主要的整理对象就是那些已经收到应答, 但为了保持定时正确性而不得不留在缓冲区队列中的数据项, 将它们所占用的空间释放出来, 同时必须保证定时器的正确性

当清除一项数据时,该数据所对应的OverTime 值必须累加到下一个数据项上

队列的倒数第二项数据原来OverTime 值为10,在空间收集时,其前一数据项的空间被收集, 则前一项的相对定时值2被累加到该项上,故OverTime=OverTime+2=12

如果缓冲区队列中所有数据项都收到了应答, 则将缓冲队列清空

以上内容由大学时代综合整理自互联网,实际情况请以官方资料为准。

相关