ns-3离散事件仿真引擎实现分析
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
NS-3离散事件仿真引擎实现
赵问道
浙江大学信息与通信工程研究所
2009年11月
目录
一、ns-3离散事件仿真引擎的基本概念 (3)
二、ns-3离散事件仿真引擎的基本原理 (4)
三、基本的仿真器类:Simulator (5)
四、仿真器实现类:SimulatorImpl类及其派生类 (10)
五、事件调度器类:Scheduler及其派生类 (12)
NS-3离散事件仿真引擎实现分析
一、ns-3离散事件仿真引擎的基本概念
Ns-3是一个基于事件的(event-based)仿真系统。除了系统状态变量和系统事件发生逻辑外,基于事件仿真还包括以下组成部分:
(1)时钟(Clock)
仿真系统必须要保持对当前仿真时间的跟踪。离散事件仿真与实时仿真(real time simulations)不同,在离散事件仿真中时间是跳跃的(time ‘hops’ ),因为事件是瞬时发生的– 随着仿真的进展,时钟跳跃到下一事件的开始时间。
Ns-3内部仿真时钟用一个64比特的整数表示,其单位由用户通过TimeStepPrecision::Set函数设定。
(2)事件列表(Events List)
仿真系统至少要维护一个仿真事件列表,一个事件用事件发生的时刻和类型来描述,事件类型标识用于仿真事件的代码,一般事件代码都是参数化的,事件描述中还包含表示事件代码的参数。
Ns-3的事件列表由Scheduler类及其派生类实现,Simulator类提供创建具体的Scheduler对象的方法,以及插入各种事件的静态接口函数。
(3)随机数发生器(Random-Number Generators)
根据系统模型,仿真系统需要产生各种类型的随机变量(random variables)。这由一个或多个伪随机数发生器(Pseudorandom number generators)产生。
NS-3包含一个内置的伪随机数发生器,随机数由RandomVariable类及其派生类实现,可以产生具有各种分布特性的随机数,具体有UniformVariable类、ConstantVariable类、SequentialVariable类、ExponentialVariable类、ParetoVariable类、WeibullVariable类、NormalVariable类、EmpiricalVariable类、IntEmpiricalVariable类、DeterministicVariable类、LogNormalVariable类、GammaVariable类、ErlangVariable类、ZipfVariable类和TriangularVariable类等。
(4)统计(Statistics)
仿真系统通常会记录系统的统计数据,用以表示感兴趣的一些统计量。
(5)结束条件(Ending Condition)
因为事件是自举的,理论上来说离散事件仿真系统可以永远运行下去。因此,仿真系统设计者必须决定仿真什么时候结束。典型的选择是“在事件t”(“at time t” )或者“在处理n个事件后”(“after processing n number of events”)或者,更一般地,“当统计量X达到值x时”(“when statistical measure X reaches the value x”)。
一个仿真系统的主循环结构如下:
(1)开始(Start):初始化结束条件(Ending Condition)为FALSE。初始化系统状态变量。初
始化时钟(Clock)(通常从仿真时刻0开始) 。调度(Schedule)初始化事件(例如,将初始事件缴入事件列表(Events List))。
(2)循环(“Do loop” or “While loop”):
While (结束条件(Ending Condition )为FALSE) then do:
{
将时钟设置成下一事件发生时刻。
执行下一事件,并将其从事件列表(Events List)中移除。
更新统计数据。
}
(3)结束(End):当设定的结束条件为真时,仿真循环结束,同时系统产生统计报告。二、ns-3离散事件仿真引擎的基本原理
Ns-3是一个面向Internet系统的离散事件网络仿真系统(a discrete-event network simulator)。Ns-3离散事件仿真引擎的入口是Simulator类,事件的调度、仿真系统启停等均通过Simulator类来操作。Simulator类所有的成员函数全部为静态类型的(static),因此,Simulator类是不需要实例化的,直接采用“类名::方法”的方式进行调用。
Simulator类提供了启动和停止仿真器、事件调度、取消事件、设置调度器、获得和设置仿真器、获得事件时间等方法接口。
具体的仿真器由SimulatorImpl类及其派生类实现。SimulatorImpl类派生自Object类,定义了仿真器的接口,所有成员函数均为虚函数,需要在其派生类中具体实现。目前Ns-3有两个派生类:DefaultSimulatorImpl类和RealtimeSimulatorImpl类。RealtimeSimulatorImpl类用于实时仿真。
调度器由Scheduler类及其派生类实现。Scheduler类派生自Object类,定义了调度器的接口,所有成员函数均为虚函数,需要在其派生类中具体实现。目前Ns-3有三个Scheduler类的派生类:CalendarScheduler类、ListScheduler类和MapScheduler类。
ns-3离散事件仿真引擎的工作原理如下:
1. 在所有的仿真脚本主程序中,在设置好仿真网络系统后,通过调用Simulator::Run()来启动仿真系统。通过调用GetImpl()来获得SimulatorImpl对象指针,这个SimulatorImpl对象指针是静态对象指针,只有一个实例。但在每次调用GetImpl()时,都会重新创建对象。在获得SimulatorImpl对象指针后调用SimulatorImpl对象的Run()方法。
2. SimulatorImpl对象的创建:在Simulator的静态成员方法GetImpl()中,由ObjectFactory对象factory的Create