总结:PeerSim cycle-based

来源:互联网 发布:碰撞检测算法 编辑:程序博客网 时间:2024/05/08 07:24
1.搭建
第一步参照:http://hyhx2008.github.io/peersimshi-yong-jiao-cheng-1-ru-men.html   (内容有介绍cycle-based 和 event-based,有详细的讲解cycle-based的example。也有作者自己添加的,但是没有提到如何实现
第一步运行后出错

解决参照:http://blog.csdn.net/jo_say/article/details/6437385   运行成功   (该博客只是能成功配置及运行,没有其它拓展)
-cp后面需要注明classpath,例如: java -cp peersim-1.0.5.jar;jep-2.3.0.jar;djep-1.0.0.jar peersim.Simulator example/config-example1.txt
2.
第二步参照:http://m.blog.csdn.net/article/details?id=39318011   (也是只有搭建,后期没有拓展)

3.调试
首先,先载入配置文件
Simulator: loading configuration
ConfigProperties: File C:\Users\Administrator.YJVJ16GQQCQ4SCT\Desktop\peersim-1.0.5\example\config-example1.txt loaded.
main方法执行步骤:
(1)Simulator的main()方法加载配置并执行实验。 独立实验的数量由配置参数“simulation.experiments”给出。 在所有实验中,配置是相同的,只有随机种子在实验之间不重新初始化
(2)加载配置目前通过使用构造函数ParsedProperties.ParsedProperties(String [])构造ParsedProperties的实例来完成。 参数args只是传递给这个类。 然后,此类用于初始化配置
(3)加载配置后,通过调用适当的引擎运行实验,其标识如下:
  • CDSimulator: if CDSimulator.isConfigurationCycleDriven() returns true
  • EDSimulator: if EDSimulator.isConfigurationEventDriven() returns true
  • 此列表表示检查这些备选方案的顺序。 也就是说,如果多个返回true,那么第一个将被取。 注意,这个类只检查这些线索,不检查配置是否一致或有效。

    4.教程
    找到中文教程:http://hyhx2008.github.io/peersimshi-yong-jiao-cheng-2-jie-xi-cycle-basedmo-shi-fang-zhen.html (是第一步中第一个链接。有图片,有示例。)

    http://blog.csdn.net/qianfu111/article/details/7286021有几种P2P仿真平台对比。



    项目结构:

    ConfigProperties 用于处理配置文件的类。 通过处理文件,系统资源和命令行来扩展属性的功能。——>子类

    ParsedProperties

    ParsedProperties 扩展类配置属性与基本解析功能。

    ConfigContainer 这个类是Configuration中使用的配置数据的容器; 看到类的更多信息。



    整体释义:
    笔记:
    P2P网络是由节点组成的,节点是协议的容器。Node接口提供了对Node 节点所包含的协议的访问方法,并为节点提供了固定的ID。这是一个特定的协议,被设计用来在Cycle-based模型中运行,它只CDProtocol 定义了在每一个周期中要运行的操作。

    般都由协议来实现,这个接口为其它协议提供了访问邻居节点集合Linkable 的服务,节点间相同的linkable协议类的实例定义了一个覆盖网络。

    实现了这个接口的类可以在仿真期间的某个时间点调度执行,这些类Control 一般用于观察或修改仿真过程。

    整体流程:
    1. 
    读取配置文件(通过命令行参数传递进来),然后仿真器初始化网络中的节点和节点中的协议,每个节点都拥有相同的协议栈。节点和协议的实例是通过克隆来创建的,只有一个原型是通过构造方法创建,其它的节点和协议都是从这个原型中克隆而来。基于这个原因,协议类中clone方法的实现是很重要的。
    2. 
    初始化操作,设置每个协议的初始状态。初始化阶段是由Control对象控制运行的,仅在实验开始时运行一次。在配置文件中,初始化的组件可以由init前缀识别,在下面讨论的initializer对象也是controls,但为了标记其功能以区别于一般的Control对象,它被配置用来在初始阶段运行。
    3. 
    在初始化完成后,Cycle-based引擎在每一个周期中调用所有组件(protocols和controls)一次,直到完成了指定的周期数,或者某个组件决定终止仿真为止。在PeerSim中每一个对象(controls和protocols)都被赋以一个Scheduler对象,它定义了什么时候本组件将会被执行。在默认情况下,所有对象都会在每个周期中运行。但我们也可以配置一个protocol或control只在某些特定的周期中运行,也可以在每一个周期中指定组件的执行顺序。



    摘取:

    在Peersim中首先要建立节点(节点模型),之后把节点连接起来(拓扑模型)

    节点是由一个类实现的,当被实例化后,每个节点将拥有独立的内存空间和协议栈

    节点由ID和INDEX两个量来标识,

    其中ID是在节点初始化后不会发生变化的,所以在任何时候ID都可以唯一地标识一个节点,它可以被理解为代表了现实中节点的IP地址,

    而INDEX则是和网络动态演进相关的一个标识,当仿真一轮结束后,执行“洗牌”(Shuffle)动作后,节点的INDEX可能会变化。

    当在网络中查找某个节点时,总是按照INDEX遍历所有节点,以搜寻ID为某个特定值的节点。




    ConfigContainer:
                |——maxdepth=100;
                |——private Map<String, Integer> protocols;  //存放{lnk=1, avg=0}
                |——private Map<String, Integer> protocols;  //存放{lnk=1, avg=0}


    CommonState:
                |
                |——private static Node node;  //存放current node

                |父类
    CDState:
                |
                |——
    -------------------------------------------------------------------------------------------------------------------


    Network:
                |——public static Node prototype = tmp; //原型节点
                |——static Node[] node = null;  //存放了网络中所有节点 
                |——reset();    //两个Protocol中AverageFunction(此步什么也没做)和IdleProtocol()。  reset()中创建原型节点,克隆原型节点生成50000个new GeneralNode(),GeneralNode下包含IdleProtocol和AverageFunction两个协议。 


    GeneralNode:
                |——index     //在节点列表的内部表示中设置此节点的索引
                |——protected Protocol[] protocol = null;  //存放了protocol[]={"protocol.avg","protocol.lnk"} //IdleProtocol


    IdleProtocol://是存储邻居节点链路的一个静态容器
                |——protected Node[] neighbors;  //Neighbors            |——

    SingleValueHolder:
                |——value;    //通过本类中setValue()方法赋值。
                |——setValue(double);    // (i*step+min.double)赋值(i是Node(i))
                |父类
    AverageFunction-----implements------- CDProtocol
    -------------------------------------------------------------------------------------------------------------------


    CDSimulator
                |——runInitializers();    //两个Control中WireKOut()和LinearDistribution()。    WireKOut时node[i]上的protocol[1]向邻居生出20条边,即构成图,在node[i]的IdleProtocol下包含Node[20]存放邻居节点。   LinearDistribution时可以得到AverageFunction的父类SingleValueHolder中的value通过setValue(i*step+min.double)赋值(i是Node(i))。
                |——private static Control[] controls = new FullNextCycle(" ");    //含有3个controls,前两个赋值,第三个默认[control.avgo  AverageObserver(),control.shf  Shuffle(),FullNextCycle()]
                |——private static Scheduler[] ctrlSchedules = new Scheduler(" ");
                |——loadControls();    //给controls[3]赋值,给ctrlSchedules[3]赋值。   controls[]是对 (AverageObserver, ShuffleFullNextCycle)这三个实现类的初始化。  ctrSchedules[]为Scheduler();
    Scheduler






    网上也很少找到peersim的资源,本文也是有cycle-based , 对于cycle-based的大体解释应该还是有点用途的,了解cycle模拟需要一步一步的debug调试。总体来说难度不大,只是相关资源欠缺,且质量不太高。