路由器公平排队仿真模型研究与实现( 二 )


该模型是由信元产生器、交换结构、输出队列组成 , 其中输出队列包含用于存储各个会话的信元的缓存和WFQ调度器 。根据假设(1) , 在仿真模型中 , 信元的产生、交换和调度输出都将在一个时隙内同时进行 。本文使用模块化的设计思路实现该模型 , 基于两点考虑:一是模型各主要组成部分交互关系简单、直接;二是方便模型的改进和扩展 。图2表示了模型的工作流程 。
 
 
我们使用标准C语言在Linux下实现了该模型 。进行仿真时 , 各模块的参数全部放在一个配置文件内 , 在初始化步骤中对WFQ模型设置参数 , 仿真结果可以输出到屏幕上 , 也可以输出到文件中 , 不支持图形输出 。
3.1 信元产生器
信元产生器负责生成信元 , 是模型的数据源 , 在每个时隙到来时最先运行 。根据假设(2) , 每个端口的信元产生器相互独立的工作 , 依据各个会话负载参数p(0≤p≤1) , 主要产生服从独立同分布的贝努利到达过程信元:每个时隙内产生信元的数目服从p的0~1二项式分布 。产生的信元假如均匀地分配给各个会话 , 称为均匀独立同分布的贝努利过程;否则称为非均匀独立同分布的贝努利过程 。
在模型中 , 信元的产生只是生成一个复杂的数据结构 , 并没有类似现实的信元的具体内容 , 释放这个数据结构的过程模拟了信元的输出过程 。
3.2 交换结构
交换结构主要负责信元的传送 , 完成输入与输出端之间的连接 。本模型提供一种逻辑的支持输出排队的交换结构 , 当输入端产生信元后 , 负责将信元传送到正确的目的地 , 即把产生的信元元素转移到输出缓存中 。
此外 , 交换结构还负责为每个到达的信元计算时间标签 , 与式(1)不同的是 , 这里只为会话i维护2个时间标签:会话i当前等待调度的信元的服务结束时间标签F(i)和会话i的服务结束时间标签SF(i)(会话最后一个信元的服务结束时间标签) , 并不需要为每个信元记录时间标签 。和“WFQ调度器”协助工作 , 共同完成信元的调度输出 。
3.3 输出队列
由于信元在输出端发生输出竞争 , 为了缓解拥塞 , 需要设置输出队列用于缓存信元 , 并负责队列的治理 。模型中输出队列包含2部分:输出缓存和WFQ调度器 。
输出缓存用于存储等待发送的信元 , 每个逻辑独立的输出缓存只为一个会话服务 。每个输出队列中只包含N个输出缓存 , 每个输出缓存对应一个输入端 。输出缓存使用双向链表实现 , 链表的数据项为信元 。如上所述 , 每个输出端维护N个这样的链表 。
WFQ调度器负责按SFF策略调度并输出信元 , 同时更新系统虚时间函数 。WFQ调度器每个时隙执行一次 。具体形式化描述见文献[4] 。
4 仿真结果
本节主要对基于信元的WFQ模型进行仿真研究 , 分析了带宽分配公平性性能 , 并与FIFO做了比较 。为绘图清楚 , 假设每个输出端有4个会话 , 对于输出端1 , 4个会话分别标示为flow(1 , 1) , flow(2 , 1) , flow(3 , 1)和flow(4 , 1) , 预约归一化带宽为0.4 , 0.3 , 0.2 , 0.1 , 并且每个会话负载是相同的 。
在上述数据流到达情况下 , 图3和图4分别表示在FIFO和WFQ调度下带宽的分配 。
(1)当各会话负载p≤0.25时 , 输出队列能满足他们的带宽需求 , 因此在FIFO和WFQ分配给各会话所需的带宽 。
(2)当p>0.25时 , FIFO不考虑各会话的预约 , 将带宽平均分配给4个会话 , 这违反了文献[1]中的公平性原则 。也就是说 , FIFO不具备公平排队的能力 。而对于WFQ , 我们从图4中可以看出 , 当p>0.4时 , 各个会话带宽需求都超出他们的预约 , WFQ则按预约带宽分配给相应的会话 。当0.25≤p≤0.4时 , WFQ仍然是公平的 。

推荐阅读