首先进入的是主模拟类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()方法,此中是用来随机选择一个邻居节点进行信息即值的更新。