欢迎来到天天文库
浏览记录
ID:57689485
大小:13.00 KB
页数:1页
时间:2020-09-01
《OPNET的队列调度模块.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、OPNET中的队列调度模块(2008-7-5)看完simple_source,开始对接收到的数据包进行处理拉,比如RED,漏桶,队列调度等等。做队列调度的朋友们注意拉,一定要看OPNET中的队列调度模块,相信肯定会有很大收获的^_^ 按数据包发送方式,这些模块分成两大类,一是被动方式,由接收节点发出ACCESS请求,然后队列模块发送数据包,有pc_fifo,pc_lifo,pc_prio,pf_fifo,prq_fifo共5个模块。二是主动方式,队列不为空,则发送,有acb_fifo,acb_fifo_ms,acp_fifo共3个模块。 第一
2、类模块相当简单。以pc_fifo为例,由3个状态组成:BRANCH(forced)、INS_TAIL(unforced)、SEND_HEAD(unforced)。并且INS_TAIL和SEND_HEAD都有一条没有条件的转移线指向BRANCH状态。 第一次收到ACCESS中断时,SERVICE条件满足,于是从BRANCH跳到SEND_HEAD,停在了此状态。然后有中断时,可能是ACCESS中断也可能是STRM中断,反正是无条件的,所以肯定会跳回BRANCH。由于BRANCH是forced嘛,所以又跳回SEND_HEAD(ACCESS中断)或者IN
3、S_TAIL(STRM中断),然后又停住等中断。如果第一次中断是STRM,也基本相同。 其他几个模块的处理过程大同小异:pc_lifo是lastcamefirstserved的;pc_prio是按优先级调度的,也就是PQ;prq_fifo对stream0的数据包进行FIFO,由op_subq_pk_insert(0,pkptr,OPC_QPOS_TAIL)实现,而对其它来源的数据包进行lastcamefirstserved,由(op_subq_pk_insert(0,pkptr,OPC_QPOS_HEAD)实现。而pf_fifo增加了对多个子队列的
4、支持,本质上就是pc_fifo的翻版。 最后是,使用第一类,必须让它连接一个能产生ACCESS中断的模块哈哈,所以可能使用得较少,基本上是用第二类噶:) 第二类稍微复杂一点,不过其实也是很基础的,但如果要做队列调度改进算法,相信这些模块可以帮大忙。这里以acb_fifo为例。 实现循环调度的关键是: pk_svc_time=(double)pk_len/service_rate; //按处理速率和包长计算包处理时间。 op_intrpt_schedule_self(op_sim_time()+pk_svc_t
5、ime,0);//定时,时间到则完成处理。 可见op_intrpt_schedule_self()实在是太有用了:) 而acb_fifo_ms支持多服务器,acp_fifo对所有的数据包,无论大小,保持恒定的处理速率。当然,由于这些模块都是FIFO的,更复杂的算法就要自己去改进拉。
此文档下载收益归作者所有