NS中事件调度机制

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

NS中事件调度机制

(2009-12-16 16:53:57)

转载

标签:

事件度

最近研究NS2仿真工具,在学习源代码的过程中查看了一下NS2中的事件调度相关内容,对其流程有了一些粗浅认识,特分享如下。本人新手,以下内容有错误和不足之处恳请指教:)

1. 事件调度相关类简介

类结构如图1所示:

图1 NS2事件调度相关类结构图

重要类简介:

1)Handler类:

定义位置:~\Common\Scheduler[.h .cc]

作用概述:

NS2中用于执行对事件的处理动作(在handle()方法中实现);

作为Event类的属性,所有的事件都会保存用于处理自己的Handler,以供分派(dispatch)时使用;

属性/方法概述:

public virtual void handle(Event * event);

2)Event类:

定义位置:~\Common\Scheduler[.h .cc]

作用概述:

作为NS2事件调度机制的重要组成,是所有事件的父类(例如Packet类就是其子类);

属性/方法概述:

public Event* next_; //用于生成事件链表

public Event* prev_;

public Handler* handler_; //用于记录该事件的处理器,也就记录了处理方法

3)NSObject类:

定义位置:~\Common\Object[.h .cc]

作用概述:

继承自Handler类(应该同时继承Handler类和TCLObject类),因此其子类可以作为参数传递给 Scheduler::schedule()方法,以便之后处理事件时调用其handle方法;

各种Connector类通常继承自此类;

属性/方法概述:

protected void handle(Event* e);

protected void recv(Packet *p, const char*); //直接调用Packet::free(p);

(介绍了上面三个类,接着就可以看看它们是被什么类使用、如何被使用的了)

4)Scheduler类:

定义位置:~\Common\Scheduler[.h .cc]

作用概述:

一个以时间为触发条件的离散事件调度器,NS2事件调度机制的基础;

完成事件的出/入队列、维护、分发等;

具有三个具体实现的子类(NS2通常默认为CalendarScheduler);

属性/方法概述:

public void schedule(Handler*, Event*, double delay) //代码摘录如下

{

...//判断参数有效性

e->uid_ = uid_++;

e->handler_ = h;

double t = clock_ + delay;

e->time_ = t;

insert(e);

}

public virtual void run();

protected void dispatch(Event*, double);

2.事件调度过程举例

结合以上内容,举例说明Packet的从Channel传递到Phy的调度过程,如图2所示:

图2 事件调度过程示意图

1)在Channel::sendUp(Packet* p, Phy *tifp)方法中最终会调用

s.schedule(rifp, newp,propdelay)方法,其中s为Scheduler实例,rifp为Phy*,newp 为Packet*;

2)Scheduler获得该Packet后先判断参数有效性判断,然后执行newp->handler_ = rifp 以保存该包的处理器(即Phy对象),然后insert入队列;

3)当调度到该Packet后,执行dispatch(Event* p, double t)方法,进而执

p->handler_->handle(p)方法处理Packet;

4)上述handle(p)实际执行Phy类的handle(p)方法,最终会调用recv()方法;

5)Phy类的recv()方法执行,根据包头中的方向字段,调用sendUp()或者sendDown()方法,此处是从下层Channel接收,因此调用sendUp();

6)sendUp()方法中再次包含schedule()方法,至此完成一次Packet调度。

3. 总结

从以上可以看出,各个协议层功能实体之间的事件(包)传递便是通过Scheduler 调度完成的,各层实体之间并不直接调用彼此的方法,这就使得各实体之间的耦合更弱,从而便于各层协议替换和扩展。

相关文档
最新文档