Event Scheduler
NS的离散的事件调度机制。 事件调度机制的主要用途是网络组件模拟包处理时的延迟或计时器。Figure 5 演示每个网络对象使用一个事件调度器。 注意一个网络对象发起一个事件后,这个事件将交给同一个对象(发起者)来处理当到达预定的时间。 网络对象之间的data path 与他们的 event path 不同。实际上, 当数据包从一个网络对象传到另一个发送者sender使用 send(Packet* p) {target_->recv(p)}; 方法并且接收者receiver使用 recv(Packet*, Handler* h = 0) 方法。
Figure 5. Discrete Event Scheduler
NS 有2种事件调度器event schedulers。 real-time 和 非 real-time。 非 real-time 调度器可以使用List, Heap and Calendar这3种工具implementations,尽管他们在逻辑执行上是一样的。产生这个现象是由于向后的兼容性: 一些早期的用户加入的网络组件的实现中可能使用一种特定的调度器,这个调度器并非通过公共的函数得到而是内部使用的。 默认的非 real-time 调度器是 Calendar。 real-time 调度器用于仿真, 允许模拟程序与真实的网络交互。目前还在开发中。下面是选择一个明确的事件调度器的例子:
. . .
set ns [new Simulator]
$ns use-scheduler Heap
. . .
另一个事件调度器的用途是去安排事件, 比如当一个FTP应用程序开始, 当一个模拟结束, 或者在模拟开始前生成模拟场景。一个事件调度器对象含有一个调度函数 at time "string" , 他发起一个特殊的事件叫 AtEvent 在特定的simulation time。 "AtEvent" 实际上是"Event"的子类, 他添加了一个额外的变量去带入被给予的 string。 然而,他被视为普通的事件。 在模拟开始后, 当AtEvent预定的时间到达时, AtEvent被传递到 "AtEvent handler" 处理程序(AtEvent handler只需建立一次并且处理所有的 AtEvent), 并且定义在AtEvent中的 string 中的 OTcl命令开始执行。 下面是在上面例子的基础上加入了一个模拟事件调度的代码。
. . .
set ns [ew Simulator]
$ns use-scheduler Heap
$ns at 300.5 "complete_sim"
. . .
proc complete_sim {} {
. . .
}
上面 at time "string" 是模拟对象(set ns [new Simulator])的一个成员函数。 但是这个模拟对象只是起一个用户界面的作用, 并且实际上他调用网络对象或调度器对象的成员函数去做实际的工作。 下列的是部分名单和简要描述关于模拟对象的成员函数, 这些函数与调度器的成员函数相接应。(Simulator object member functions that interface with scheduler member functions):
Simulator instproc now | # return scheduler's notion of current time | |
Simulator instproc at args | # schedule execution of code at specified time | |
Simulator instproc at-now args | # schedule execution of code at now | |
Simulator instproc after n args | # schedule execution of code after n secs | |
Simulator instproc run args | # start scheduler | |
Simulator instproc halt | # stop (pause) scheduler |