ns2学习(一) 调度器Scheduler

来源:互联网 发布:永久免费空间php 编辑:程序博客网 时间:2024/05/17 01:29

  NS2中事件调度的主要功能是处理分组的延迟以及充当定时器。时间调度器的执行过程如下:

1.从所有事件(Event)中选择发送时刻最早的事件

2.调用它的handle_函数

3.执行完毕后,从剩余的所有事件中选择发生时刻最早的事件执行,如此反复

单位:秒

调度器分为4中:链表调度器(List Scheduler)、堆调度器(Heap Scheduler)、日历队列调度器(Calendar Queue Scheduler)、实时调取器(Real-timeScheduler)。默认为日历调度器

ns只支持单线程,故在任何时刻只有一个时间执行。


Event类的定义

class Event {public:Event* next_;/* 事件链表中的下一个时间 */Event* prev_;<span>/* 事件链表中的上一个时间 */Handler* handler_;/* 要处理的事件 */double time_;/* 时间处理的时间 */scheduler_uid_t uid_;/* 时间的唯一 ID */Event() : time_(0), uid_(0) {}};


Hander基类

class Handler { public:virtual ~Handler () {}virtual void handle(Event* event) = 0;};
它是所有hander的基类


Scheduler类

class Scheduler : public clObject {public:static Scheduler& instance() {return (*instance_);// 调度器的通用入口}void schedule(Handler*, Event*, double delay)</span>;// sched later eventvirtual void run();// execute the simulatorvirtual void cancel(Event*) = 0;// cancel eventvirtual void insert(Event*) = 0;// schedule eventvirtual Event* lookup(scheduler_uid_t uid) = 0;// look for eventvirtual Event* deque() = 0;// next event (removes from q)virtual const Event* head() = 0;// next event (not removed from q)double clock() const {// simulator virtual timereturn (clock_);}virtual void sync() {};virtual double start() {// start timereturn SCHED_START;}virtual void reset();protected:void dumpq();// for debug: remove + print remaining eventsvoid dispatch(Event*);// execute an eventvoid dispatch(Event*, double);// exec event, set clock_Scheduler();virtual ~Scheduler();int command(int argc, const char*const* argv);double clock_;int halted_;static Scheduler* instance_;static scheduler_uid_t uid_;};


如何把事件加入调度器

voidwaveDeferTimer::start(double time){Scheduler &s = Scheduler::instance();assert(busy_ == 0);busy_ = 1;paused_ = 0;stime = s.clock();rtime = time;#ifdef USE_SLOT_TIMEROUND_TIME();#endifassert(rtime >= 0.0);s.schedule(this, &event, rtime);}

在一个类的方法中,实例化一个调度器对象Scheduler &s = Scheduler::instance(); ,然后设置完参数后调用s.schedule(this, &intr, rtime);

这样就把一个事件放入调度器






0 0
原创粉丝点击