ONE相关知识整理之二——仿真前的初始化.docx
-
资源ID:86395170
资源大小:14.91KB
全文页数:3页
- 资源格式: DOCX
下载积分:15金币
快捷下载
![游客一键下载](/images/hot.gif)
会员登录下载
微信登录下载
三方登录下载:
微信扫一扫登录
友情提示
2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
|
ONE相关知识整理之二——仿真前的初始化.docx
ONE相关知识整理之二一一仿真前的初始化仿真实验前的初始化是整个仿真过程中十分关键的一步,它将创立仿真中使 用到的节点以及其上的所有“附加物,如运动模型、路由等,本文将简要介绍ONE 仿真过程中的整个初始化过程。1、宏观视角一一方法的调用顺序1.1、 读入配置Core包下的DTNSim是整个ONE仿真的主类,它定义了 Main方法作为整个 程序的开始点,在仿真开始前,DTNSim首先从命令行输入的args中取得仿真配 置文件的名称,并将配置文件载入到Setting对象中,以便后续创立节点、运动 模型、路由等过程时读取,这里需要注意的是,无论是否在命令行中有给出配置 文件的参数,只要默认配置(default.)存在,它就一定会被读取并写入Setting 对象,而命令行中给出的配置文件仅仅是“覆盖了默认配置,所以,当仿真实验 出现了一些与配置文件相异的情况时,首先要想到是否是因为default_settings中 局部参数的影响,所以建议直接删掉这个文件,以免影响最终实验结果。1.2、 启动UIpublic static void init(String propFile) throws SettingsError String outFile;try (/先读入 de fault settingif (new File (DEF_SETTINGS_FILE) .exists () ) /内部机制是直接通过Properties来读的Properties defProperties = new Properties();(new Fileinput Stream (DEF_SETTTNGS_FTLE);props = new Properties(defProperties);在读取完数据后,ONE会根据用户在命令行给出的指令,选择命令行UI或 图形化UI界面对象进行创立,并调用其中的start。方法,该方法在命令行UI和 图形化UI的基类DTNSimUI中实现,分别调用了两个方法,initModel()和runSim(), 其中initModel。由该基类进行实现,完成仿真的初始化过程,runSim。在基类中 被声明为abstract,根据UI的不同,采用不同的实现。1.3、 模型初始化initModel行的初始化过程主要分成三步,首先是创立了新的Settings对象用 以读取刚才由DTNSim读入的配置项,随后,调用SimScenario的getlnstance方 法获取到当前仿真场景对象,getlnstance方法是Singleton思想的表达,在进行 调用时,它会检查当前是否已有仿真场景存在,假设有,返回该场景,假设无,那么创 建一个新场景。这一过程保证了单次仿真过程中不会有多个SimScenario出现。public static SimScenario getlnstance() if (myinstance = null) myinstance = new SimScenario();) return myinstance;创立场景的过程即是模型初始化中最重要的一步,它包含了仿真节点的创立 (调用enario中的createHosts方法)与仿真世界(World)的创立(调用对象的 参数构造器),前者即是网络中进行通信的节点,是仿真的主体,而后者那么负责 承载所有节点,当仿真时间线向前推进时,负责调用update方法来更新各个节 点的状态(移动模型),以及消息(路由)。当场景创立完毕后,UI对象会根据Settings中定义的Report的名称,调用 createObject方法来创立相应的Report,这一过程是通过java的反射机制完成的, 该过程是java反射机制非常经典的用例(ngs类loadobject方法),通过类名动 态找到相应的类文件,调用相应的构造器来创立对象,非常值得研究,因为在平 时的学习、开发过程中,很少会直接接触反射(几乎都由Spring这样的框架来完 成了反射的工作),故,建议详细阅读这局部代码(较长,此处不贴),深入了解 Java中反射的相关机制。最后,假设在配置文件中定义了移动模型的“预热时间"S,那么UI对象将会将 仿真时钟SimClock回拨S,并进行移动模型的预热,该过程即让节点根据其移动 模型,先进行S时间的运动,再开始消息传递。double warmupTime = 0;/如果移动模型有''预热时间,那么把模拟器的时钟回拨,以实现预热效果if (ins (MM_WARMUP_S) ) warmupTime = uble (MM_WARMUP_S);if (warmupTime > 0) SimClock c = stance();c setTime(-warmupTime);)/world对象在场景被创立时,即在构造器中创立了= getWorld();/移动模型的预热pMovementModel(warmupTime);至此,场景的初始化全部完成。2、微观的小坑一一节点的创立的细节SimScenario中节点创立的过程因为有特殊性,所以值得详细解读。在createHost方法中,节点按照group来进行创立,也就是说,同一个group 中的节点的对象是“几乎一样的,它们拥有完全相同的移动模型、路由模型、网 卡和 Application o对于每一个group,为了减小创立对象时的开销,ONE并不是对于每个节点 都去创立相应的移动模型、路由模型、网卡和Application,而是先读取配置项, 创立出它们的原型(Prototype)(该过程亦是通过反射完成的),然后在创立各个 节点时,各个节点通过调用移动、路由、网卡、Application类的replicate方法, “复制”出一个对象出来,这样减小了直接去构造整个对象的开销,但同时也带来 了坑一一这一过程调用的是拷贝构造器(即形如Type(Typet)的方法),而不是参 数构造器来创造新对象,如下MapBasedMovement的replicate方法所示public MapBasedMovement replicate() return new MapBasedMovement(this); )当实现自己的移动模型和路由模型时,要特别注意这一点,如果要让这些模 型在不同的节点上有不同表现,必须在拷贝构造器中有所表达,而不能只在参数 构造器中做操作,因为参数构造器仅在创立那个“Prototype的时候被调用一次!