ns2 (Handler, Event, Scheduler, Timer)

 首先是SchedulerHandlerEvent类的关系。

      NS2中,事件 (Event)是基本的调度单元,比如发送一个Packet、接收一个Packet等等。每个Event都有自己的处理工具,这个工具就是一个 Handler类的对象handler_Handler中仅包含一个函数,描述对Event的处理方法,即handle(Event *e)

      给定一个事件,Scheduler将调用schedule(Handler* h, Event* e, double delay)函数,该函数设定Eventuid_,并设定用于处理该事件的Handlere->handler_ = h,然后将该事件插入Scheduler维护的事件队列中。一般说来,处理事件的Handler都是产生该事件的实体本身,所以我们常常可以看到schedule函数在调用的时候*h用到this指针。

      NS2运行仿真时,Scheduler::run()函数不停地运行来处理队列中的事件,队列中的事件逐个dequeue()出来,随后运行Scheduler::dispatch(Event* p, double time)函数,将一个事件从队列中弹出来,调用它对应的Handlerhandle()函数处理该它。

      这样就完成了一个事件从  产生    排队    派出被处理  的过程。

 

      接下来看一下TimerHandler的作用。

      计时器(Timer)NS2仿真的关键手段,它用来设置一个未来的事件,在它到时后事件将被dispatch出来进行处理。Timer都是TimerHandler基类的派生类TimerHandlerScheduler交互的函数是sched(double delay),它调用Scheduler::schedule(Handler* h, Event* e, double delay)插入一个delay时间后的事件进入队列,Handler设置为TimerHandler本身(this)

      delay时间到了后,Scheduler会从事件队列中dequeue出该事件,调用其处理函数,也就是TimerHandler::handle() 。而handle()除了做一些计时器的状态设定工作外,核心的处理由虚函数expire(Event* e)来做。C++的动态特性不难理解,expire()将在各种自定义的Timer(也就是TimerHandler的派生类)中进行重写,实现各Timer的不同处理方法。

 

      看一个具体的例子

      NIST Wimax模块中的DlTimer为例,该Timer用于触发一个下行帧的生成:

class DlTimer : public TimerHandler {

public:

DlTimer(Mac802_16 *m) : TimerHandler() {m_=m;}

 

void    expire(Event *e);

private:

Mac802_16 *m_;

};

在使用该TimerMAC实体中,Mac802_16BS::init()函数中打开了该Timer

double stime = getFrameDuration () + Random::uniform(0, getFrameDuration ());

dl_timer_->sched (stime);

这个

inline void _sched(double delay) {

     (void)Scheduler::instance().schedule(this, &event_, delay);

}

该函数设定event_Handlerthis,也就是调用schedule()的对象,而这个对象回溯回去正是dl_timer_于是我们知道,该定时器到时后将会调用dl_timer_handle()函数做事情,而DlTimer又是直接继承了TimerHandlerhandle()函数,而TimerHandler::handle()函数是靠虚函数expire(Event* e)做事的。DlTimer继承TimerHandler时正好重写了expire函数:

void DlTimer::expire (Event *e)

{

m_->start_dlsubframe();

}

现在事情就变得明朗了,dl_timer_到时后Scheduler触发了一个事件,这个事件引发的是MAC802_16类的start_dlsubframe()动作,这个函数正是“开始下行子帧”。这样就完成了用一个Timer完成一个调度工作的全过程。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值