[OPNET学习总结——事件推进机制]

仿真核心实际上为离散事件驱动的事件调度器(Event Scheduler),它对所有进程模块希望完成的事件和计划该事件发生的时间进行列表和维护。
事件调度器主要维护一个具有优先级的队列,它按照事件发生的时间对其中的工作排序,并遵循先进先出(FIFO,First In First Out)顺序执行事件。而各个模块之间的通信主要依靠传递包的方式来实现。
OPNET 采用的离散事件驱动模拟机理决定了其时间推进机制:仿真核心处理完当前事件 A 后,把它从事件列表(Event List)中删除,并且获得下一事件 B(这时事件 B 变为中断B,所有的事件都渴望变成中断,但是只有被仿真核心获取的事件才能变成中断,事件有可能在执行之前被进程销毁),如果事件 B 发生的时间 t2 大于当前仿真时间 t1,OPNET 将仿真时间(Simulation time)推进到 t2,并触发中断 B;如果 t1 等于 t2,仿真时间将不推进,直接触发中断 B。
有时可能会出现仿真时间始终停留在某个时间点上,这肯定是由于程序的逻辑错误导致的,具体来说,在某个时刻循环触发事件,例如,在某个循环语句中执行了以下程序op_intrpt_schedule_self (op_sim_time() , 中断码)),这样仿真核心永远处理不完当前时刻的时间,因此仿真总是无法结束。仿真结束条件有两个:
(1)Event List 为空。
(2)仿真时间推进到所设定的时间。
执行事件不需要任何时间,假如同一时刻有多个事件存在仿真核心事件列表中,那么它们将按照先进先出 FIFO 的顺序被仿真核心处理,我们很难确定这些事件执行的优先级。当我们在时间上不能区分事件优先级,那只好手动设定事件优先级来区分同一时间内事件执行的顺序,OPNET 提供了三种方法,分别是(1)在进程界面上设置事件优先级;(2)编程指定特定事件优先级;(3)增加冗余的红色状态。

图为无线局域网 MAC 层接口进程模型(wlan_mac_interface.pr.m),在“init”状态中的入口执行代码中有语句 op_intrpt_schedule_self(op_sim_time(), 0),而出口执行代码中也有语句 op_intrpt_schedule_self(op_sim_time(), 0),两句零时刻调度语句和两个红色的非强制(unforced)状态(init 和 init2 状态)互相抵消,因此 init2 状态看似冗余状态,其实不然,它起着为多个进程模块协同初始化的作用。
在这里插入图片描述
因为在仿真开始时候(零时刻),许多模块需要通过仿真核心触发仿真开始事件(begsim intrpt)来进行初始化,然而有些模块的初始化依赖于其他模块初始化的结果,换句话说,它需要等待其他模块初始化完毕后才能进一步设置参数或做出某种决定。因为都是同一时刻的事件,仿真核心没有能力安排它们合理的顺序,因此通过引入冗余的非强制状态来界定同一时刻事件的发生顺序。
对于 OPNET 编写的标准 OSI 协议栈(application、tpal、ip 等模块),它们是一个整体,互相关联,缺一不可而且一般情况下不允许出现重复的协议模块,为了在仿真开始时验证协议栈的完整性和兼容性,仿真初始化时存在一个协议注册(register)和发现(discover)的过程。为了保证在协议发现之前其他协议模块都已完成注册,这时需要添加一个冗余状态,这样协议发现事件将发生在协议注册事件之后。

状态分类:
在这里插入图片描述
状态与状态之间通过转移线 transitions 相连。转移线可以是带条件的(必须满足条件才能转移)或者无条件的(直接转移)。 图包含两条转移线,一条是从 wait 状态到 open 状态的条件转移线(虚线表示)。虚线中间的 OPEN 条件必须满足,wait 状态才能转移到 open 状态。然而,从 open 状态到 wait 状态的转移(实线表示)是无条件的,因此当执行完 open 状态的代码后立即转移到 wait 状态。
在这里插入图片描述

中断类型
在这里插入图片描述
在这里插入图片描述

摘录自陈敏 OPNET网络仿真

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值