OPNET 了解与学习


一.仿真研究流程

(一)理解系统

•建模者必须理解所提出的系统,以便准确建模。•模型不会比建模者所理解的更准确。

•建议:获取所建模系统的说明书(标准、细则等)。

(二)理解目标
•需要通过仿真来回答的问题是那些?
•例如
• 通过将以太网集线器更换为FDDI集线器,将会得到多大的吞吐率提升?
• 在我的蜂窝网中采用自定义的协议将会提升多少效能?
(三)确定内容
•从问题中提炼出具体的研究目标,例如
• 定量分析特定接收机的吞吐率。
• 测量改变一条链路的传输速率后对系统的影响。

(四)目标决定了模型的粒度

什么是粒度?•粒度是细致程度。•选择足够回答所提问题的粒度

• 粗粒度(牺牲细节)允许更快速的执行和更简单的设计。

• 细粒度(牺牲性能)允许更高的准确度,但是仿真运行更慢,设计更复杂。

(五)定义数据输入和输出
•选择输入相当重要。•如果已经 理解了系统,理解了目标, 确定了内容, 明确了问题,你将能够定义合适的数据输入。

输入可以代表模型的先天特性(例如连接性等),或者是一组参数(例如负载量等)。
•在研究系统的时候,固定大部分输入,仅在一定范围内更改一两个输入。

•确定哪些输出是需要的(吞吐率、时延等),并采用最佳形式表达(图、表、动画等)。

(六)结果的准确性
•应该对输出的准确性做出判断
• 所有的输出是否都有意义?• 能够给出证明吗?• 模型行为是否符合设想?

•技巧:先预测输出,然后与实际所得结果做比较

(七)结果的细致性
•根据需要,调整输入范围——放大、缩小。

•考虑• 收集更丰富的统计量?• 改变粒度?• 对系统的其他方面进行建模?

(八)结果的统计有效性
•模型运行是否达到稳态?
• 从早先的瞬态收敛到之后的稳态。
• 观察平均值的上升情况、队列的增加情况或者其他还在变化的输出。这往往意味

着系统尚未达到稳态。

•增加仿真时间,直到得到稳定的输出。
•无法达到稳态的模型往往意味着系统不稳定。

•观察各统计值,确保模型达到稳态。

•仿真是否足量?

• 运行多次仿真,改变随机数种子并采用不同的间隔。• 做足量仿真,确保可信区间足够紧凑

二.OPNET了解

•网络对象:节点(固定、移动、卫星),子网,节点(点对 点,总线,无线)。

•节点对象:模块(处理器、队列、发射机、接收机、天线) ,连接(报文流、统计线)。
•进程对象:状态(初始、强制、非强制),转换线。
•核心函数:预先写好的用于通信和常用操作的函数。
•对象属性:用于配置对象行为的动态参数。

•报文:信息交换的基本单元。

事件驱动仿真
事件是在一个特定时刻的一个特定动作的请求。

•OPNET仿真由事件驱动。在仿真中,时间在事件发生时前进。

事件表
•OPNET仿真维护一个全局事件表。
•所有对象共享同一个仿真时钟。•事件依照时间先后顺序排列。第一个事件位于表头。•事件包含一套数据。
•事件完成后,从表中删除

仿真核心
•仿真核心(Simulation Kernel,简称SK)是管理事件表的实体。
•SK向对应模块依次递交事件。

•SK接收来自模块的请求,并将新事件插入事件表。

中断
•中断是位于表头的事件,而该事件由仿真核心递交给对应模块。

•事件所含数据可以由被中断的模块访问。•某些模块可以设置初始中断。

中断的递交
•当一个中断被递交到一个模块,控制权由仿真核心转移到对应模块。
•如果模块是处理器或队列,中断被递交到对应模块中的进程。


有些事件必须在仿真初始进入事件表
• 数据发生器的初始事件
• 处理器或队列的begsim事件
•事件表通常只含少量事件——一个事件同时引发另外一两个事件后,被删除。
•事件表大小总是在不断缩胀。
•事件在执行前挂起,挂起的事件可以被取消

并发事件

•当两个事件同时发生时,如何处理?•事件仍然顺序处理,尽管看起来是在同一个时刻发生的。

•仿真核心用两种方法确定事件先后次序
• 先预约先服务

• 优先级  •模块和事件被设置优先级•高优先级的先服务

状态转换
•在出口代码执行完毕后,测试所有状态转换线的转换条件。
•有且只有一个条件被满足。•转换到对应状态。
•具有条件“default”的状态转换当且仅当其他所有转换条件不满足。

•没有设置转换条件的转换线是无条件转换。

例子:

1. BEGSIM中断被递交到src.gen对象。

2. 进程从初始状态Init执行(黑色箭头所指)。

3. 执行Init的入口代码。

4. Init是强制状态,因此立即执行出口代码。

5. 执行状态转换到Wait。

6. 执行Wait的入口代码。

7. 使用KP预约自中断(第8行),此举在事件表中增加一项。
8. 在Wait设置中断点。

9. 阻塞,并释放控制权。

10.仿真核心删除第一个事件,使下一个事件处于事件表头。仿真时钟依然在0.0秒。
11.仿真核心向src.queue递交一个BEGSIM中断。

12.src.queue中的进程获得控制权。执行到非强制状态后,阻塞并归还控制权

13.仿真核心删除前一个事件。仿真时钟变为4.3秒。
14.该中断是src.gen之前产生的自中断,中断点在Wait状态处。

15.执行Wait状态的出口代码。

16.测试状态转换条件

17.转换到Send状态。
18.执行Send状态的入口代码,调用op_pk_send ()发送报文。此举在事件表中增加一项类型为STRM的事件。

19.注意Send是强制状态,立即执行其出口代码。
20.状态转换到Wait。
21.Wait状态的入口代码设置自中断,阻塞。

22.仿真核心处理下一个事件。

仿真结束-仿真结束的条件
• 事件表置空
• 仿真时间
• 某进程调用核心函数op_sim_end()

• 出现致命错误

总结
•强制状态与非强制状态的执行时序。
•处理器或队列的begsim intrpt属性与BEGSIM中断。

•控制权在进程与仿真核心间的动态转换。

进程建模的步骤
• 前四个步骤:设计
• 步骤 1:定义上下文
• 步骤 2:进程级分解
• 步骤 3:事件列表(每进程)
• 步骤 4:事件响应表(每进程)
• 以上步骤反复进行
• 最后的步骤:在OPNET中实现
• 步骤 5:进程行为的规范(每进程)



状态类型:Init初始状态   Idle空闲状态   ACK Wait等待应答   Link Down链路失效




事件类型



猜你喜欢

转载自blog.csdn.net/qq_33329468/article/details/80047539