基于PeerSim平台config-example1配置下程序流程之我理解

来源:互联网 发布:薪酬数据分析 编辑:程序博客网 时间:2024/05/11 00:47

首先进入的是主模拟类Simulator:进入了main函数。读取配置文件,有一静态单例类Configuration,其中有一成员config(ConfigContainer类型,继承与Properties)。我们可以由此静态单例类对配置文件进行操作,诸如由类名称获取实例,获取类名称等基础操作。再由配置文件判断运行类型,在switch分支中的CDSIM(因为SIMID=CDSIM),即cycle驱动的模拟。接着进入CDSimulator的nextExperiment方法。

CDSimulator类有两个很重要的成员变量(都是数组):controls(包含cycle模拟的所有Control),ctrlSchedules(包含所有的Control调度器)

nextExperiment方法流程(包含其中核心方法的解说)

1.   Configuration.getInt(PAR_CYCLES)

读取参数配置(cycle次数)。另外,再设置终止时间(endtime),设置相值(pahse)。

2. Network.reset()

读取配置文件,从而设置网络节点容量(由network.size得),网络节点最大容量(由network.intialCapacity得),节点原型(由network.node得,如果没有定义就使用默认节点原型GeneralNode),最后根据网络节点最大容量和clone方法初始化所有节点。

网络中的节点包含:配置文件锁配置的所有Protocol类型的协议数组,索引,failState。其中的Protocol类型的协议数组对象已经构建,但其相关赋值之类的初始操作是由init前缀的类进行初始化。

3. runInitializers()

该私有方法运行初始化器

读取配置文件,根据init关键字获取初始化器的对象实例数组(构建出WireKOut对象与PeakDistribution对象)。对这些初始化对象按照顺序一个个进行循环,调用这些初始化器(本质为Control)的execute方法。

(1)      WireKOut对象:由 配置文件init.rndlink.protocol link,该对象初始化IdleProtocol协议。该协议存储有邻居节点的信息(Node[]),利用此初始化器初始化每个节点的IdleProtocol协议,即随机选择邻居节点。最终,我们可以看见其构建出了一个随机拓扑网络。该对象利用了GraphFactory的静态成员函数来构建网络拓扑。

(2)      LineDistributiion对象:由配置文件init.vals.protocolavg,该对象初始化AvergeFunction协议。该协议继承与SingleValueHolder(有单个的值),实现CDProtocol接口。CDProtocol接口实现了一个周期性的方法nextCycle(),该周期性的方法依赖FullNextCycle类来进行驱动。该初始化器主要就是用来给每个节点上的AvergerFunction协议赋值操作。

4. loadControls()

加载所有的控件:

该CDSimulator类中有两个成员:Control[]和Scheduler[],其主要是用来存储配置文件所定义的Control类型的类实例,并分配相应调度器Scheduler来控制Control的执行。最后我们应当注意的是Control[]额外存储一个FullNextCycle类型的类实例,该类在每个周期调用每个节点上实现CDProtocol接口的协议的execute()方法,使其实现周期性的操作。当然相应的也有分配调度器Scheduler来控制FullNexrtCycle的执行。

如:config-example1中的:

(1)control.shf Shuffle

(2)control.avgo example.aggregation.AverageObserver

那么初始化的数组为:

(1)Controls[0] = AverageObserver

     Controls[1] = Shuffle

     Controls[2] =FullNextCycle

(2)Schedule[0] = Schedule[1] = Schedule[2] = Scheduler

 注:Scheduler类作用是控制Control对象的周期性执行,其实现通过以下几个关键的参数:from开始时间,step一次周期所需时间,util最终结束时间,next下一次调用的时间。其中循环执行时有next += step。

5.周期性的循环执行,执行次数由cycles控制

在每个周期,按序根据调度器的active()方法,来判断此控制器是否应当执行,控制器执行的实质就是调用其execute()方法。

(1)     对于j=0执行AverageObserver对象的execute()方法,即对于统计该网络的节点上值得平均数。

利用IncrementalState类的对象,获取对网络中的每个节点的值,统计之后再打印输出。

(2)     对于j=1执行Shuffle对象的execute()方法,作用是重新打乱网络节点的编号。实质是调用静态单例类Network的shuffle()方法。

(3)对于j=2时执行FullNextCycle对象的execute(),该方法实质是执行每个节点上实现CDProtoocol接口的协议的nextCycle()方法。例如此配置文件下的AvergeFunction类实现CDProtocol接口的nextCycle()方法,此中是用来随机选择一个邻居节点进行信息即值的更新。
原创粉丝点击