ns-3离散事件仿真引擎实现分析

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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()方法来创建具体的SimulatorImpl对象,具体的类型由factory的SetTypeId(类型名)来设定。在中定义了一个全局变量:GlobalValue类型的g_simTypeImpl,默认实现的仿真器类型为ns3::DefaultSimulatorImpl。具体的SimulatorImpl对象创建好后,调用其

相关文档
最新文档