以下内容基本上均可以在NS2手册中找到,现在记录于此,以便复习。
Simulator的init过程中有如下代码:
$self create_packetformat
$self use-scheduler Calendar
$self set nullAgent_ [new Agent/Null]
也就是说在创建一个新的模拟对象时,它将初始化包格式,创建一个默认的调度器和创建一个“空代理“,其作用是将接受被丢弃的包或者是作为目的地接受那些没有被计算或者记录的包。
现在的模拟器有四种调度器,每种由不同的数据结构实现:
. 一种简单的链表(a simple linked-list)
. 堆(heap)
. 时间队列(calendar queue)
. 实时类型(real-time)
与拓扑结构无关的模拟方法清单:
. Simulator instproc now ;
. Simulator instproc at args ;
. Simulator instproc cancel args ;
. Simulator instproc run args ;
. Simulator instproc halt ;
. Simulator instproc flush-trace ;
. Simulator instproc create-trace type files src dst ;
. Simulator instproc create-packetformat ;
这些过程对应的C++中的实现在command中,比如最常用的at,在command中有如下代码:
if (strcmp(argv[1], "at") == 0 ||
strcmp(argv[1], "cancel") == 0) {
Event* p = lookup(STRTOUID(argv[2]));
if (p != 0) {
/*XXX make sure it really is an atevent*/
cancel(p);
AtEvent* ae = (AtEvent*)p;
delete ae;
}
这里涉及到事件,事件的定义如下:
class Event {
public:
Event* next_; /* event list */
Event* prev_;
Handler* handler_; /* handler to call when event ready */
double time_; /* time at which event is ready */
scheduler_uid_t uid_; /* unique ID */
Event() : time_(0), uid_(0) {}
};
可见一个事件定义了其就绪时间与调用事件的句柄。
阅读(1701) | 评论(1) | 转发(0) |