http://blog.sina.com.cn/s/blog_70e9ecab0100nzzb.html
Peersim的两种仿真模式
PeerSim有两种仿真模式:Cycle-based模式和Event-Driven模式。各自的特点如下:
1、Cycle-based模式:
(1)基于peersim.cdsim包中的CDSimulator类
(2)简化、忽略了细节;
(3)扩展性非常好,最多可支持千万级别节点数;
(4)不支持传输层模拟( nodes和protocols直接对话);
(5)不支持并发处理
2、event-based模式
(1)基于peersim.edsim包中的EDSimulator类
(2)实用性强;
(3)支持传输层模拟;
(4)基于cycle-based模式开发的协议均可在event-based引擎下运行;
(5)效率不高,最多支持十万级别节点数;
http://blog.sina.com.cn/s/blog_70e9ecab0100o285.html
cycle-based模式比较简单,主要环节如下:
(1)读取配置文件
配置文件中包含所有涉及到的对象的模拟参数,是纯文本文件(例如config-flooding.txt),它的功能是定义了一些运行过程中的协议类、初始化类、控制类,以及一些常数。这个配置文件会被ParsedProperties解析出来,在运行过程中将定义的各种类进行实例化。
(2)模拟器根据配置文件建立起一个网络并初始化网络中的节点和节点中的协议
每个节点拥有相同的协议类型。节点和协议的实例是通过克隆来创建的,也就是说只用构造方法来创建一个实例,然后以这个实例为原型克隆出网络中其他节点。
(3)初始化,设置每个协议的初始状态
初始化阶段由Control对象控制运行,仅在实验开始时运行一次,在配置文件中,初始化的组件可由init前缀识别。
(4)调用所有组件
初始化完成后,Cycle-based引擎在每个周期调用所有组件一次,直到完成了指定的周期数,或者某个组件决定中止仿真为止。
默认情况下,所有对象都会在每个周期运行,但也可以配置一个protocol只在特定周期运行,例如令一个名为dnet的control对象仅在第5~10这六个周期运行,相关配置如下:
control.dnet.from 5
control.dnet.until 10
默认情况下组件运行的顺序是按字母顺序,也可用属性(include.control, include.protocol)来指定组件的运行顺序例如include.init rnd lin语句使得rnd组件先于lin运行。
http://blog.sina.com.cn/s/blog_70e9ecab0100oah4.html
event-driven mode
1、判断为EDSimulator类型
2、节点协议栈初始化
3、调用各初始化器(initilizer)的execute()方法
CDSchedule为初始化control,执行其execute()方法时加载CDProtocol类型协议的NextCycleEvent类型事件对象进栈,并排序
4、调用EDSimulator的scheduleControls()方法
加载非初始化的controls,初始化相应调度器ctrlShedules,将controls和ctrlschedules封装成control类型的事件。调用addControlEvent()方法将事件入堆并排序。
5、首先执行control类型的事件,或者NextCycleEvent类型事件
执行NextCycleEvent事件时执行CDProtocol中的nextCycle()方法,然后将下一个NextCycleEvent事件入堆并排序。
在执行nextCycle()方法时调用传输层的send()方法,(这里的send()方法用于实现节点间信息的交流。将消息封装成一个事件加入堆),即第三种事件:transport类型事件。
6、在EDSimulator类中的循环判断while(!exit)将堆中的各类事件中按时间优先级调出来执行并加入新的事件入堆。
执行过程如图所示: