glomosim仿真的运行过程
1 glomosim系统启动的入口是.\main\driver.pc文件中的main()函数。main()函数首先调用parsec_main()函数。parsec_main()函数是parsec运行库函数,我们看不到它的源代码。
2 parsec系统的入口是driver实体。parsec系统启动时首先执行driver实体的代码。driver实体首先读取核心配置文件,解析出仿真场景区域范围、仿真随机数种子、仿真总时间、网络中节点总数等配置信息,随后生成取名为partitionEntityNameGLOMOPartition类型的实体,然后driver实体根据网络节点初始位置配置参数NODE-PLACEMENT的设置值确定各节点的初始位置,保存在消息NodePositionMsg中,接着利用send方法把消息NodePositionMsg发送给GLOMOPartition类型的实体partitionEntityName。此后driver实体将暂停以等待实体partitionEntityName完成初始化后发送过来信息Ready。
3 GLOMOPartition类型的实体partitionEntityName被创建时就立即申请所需内存空间。当接收到driver实体发送过来的消息NodePositionMsg时,实体partitionEntityName接收到根据消息中的信息更新本区域实体中各节点的初始位置,然后构造全局普通事件堆heapSplayTree,接着针对各节点各层模块调用其初始化函数以完成仿真初始化工作。初始化完成后实体partitionEntityName向driver实体发送信息Ready。
4 实体driver 接收到信息Ready 后得知partitionEntityName已经初始化完毕,所以它向partitionEntityName发送信息StartSim命令它开始仿真。
5 实体partitionEntityName接收到信息StartSim后即进入仿真事件处理循环。该循环将持续下去直到事件队列为空或设定的仿真时间已到。每次循环过程中,实体partitionEntityName从全局事件队列中取出队首事件,判断该事件由哪个节点处理,根据该事件的某些属性判断该事件应由哪个层次处理,并把该事件交给目标节点的相应层次的调度模块。该层调度模块进行进一步调度,将事件交给相应节点的具体功能模块进行处理。
6 退出循环后即进入仿真收尾阶段。该阶段中实体partitionEntityName将依次调用各节点的各层模块的收尾函数以将仿真过程中搜集的统计数据写入本区域实体的仿真数据临时文件中。仿真收尾阶段中,实体partitionEntityName针对每个节点依次调用radio、mac、网络层、传输层和应用层的收尾调度模块。收尾阶段完成后仿真过程结束,至此函数parsec_main()执行完毕,系统重新回到函数main()的控制下。函数main()中parsec_main()后的代码继续执行。