我正在创建自己的有线仿真模型,其中节点具有分层架构。
应用层定期生成数据包,然后使用
进行自我调度scheduleAt(simTime() + 0.00000000625,AppModuleSelfTrigger);
然后将该数据包缓冲在下一个较低层模块中。然后,下层模块定期检查该缓冲区的数据包。我通过使用
安排此图层模块来实现这一目标scheduleAt(simTime() + 0.00000000625,LowerLayerModuleSelfTrigger);
类似地,每个使用缓冲区的较低层,我同样触发它们以周期性地触发自身并检查要发送的任何缓冲数据包。
这种方法很好用。但是,当我进一步减少延迟( 0.00000000625 )时,GUI数据包流接收速度变慢(例如,在看到一个数据包流事件后,我必须等待很长一段时间才能看到下一个数据包流OMNeT ++ GUI)。但是当我增加这个延迟值而不是使用更高的十进制值时,例如0.2,然后GUI数据包流事件似乎很快(我不必等待很多时间看到GUI中的下一个数据包)。
但将此延迟设置为较高值(如0.2)的问题会增加数据包延迟(测量为simTime() - PacketCreationTime
)。
所以,如果我正在使用整个自触发过程或者我需要做一些重大改进,我有疑问。
答案 0 :(得分:2)
每隔6.25e-9秒调度一次事件以轮询缓冲区中的更改,这似乎是构建模拟模型的次优方法。假设每个主机有七个层,那么每个主机每秒浪费超过一个十亿个事件只是为了确保缓冲区未被修改。即使每个事件只需要几个CPU周期来处理,事情也很快就会增加。
我建议您编写模拟模型,以便他们在缓冲区更改时利用知道这一事实。在模拟模型中,无需轮询。
例如,假设我们要模拟一个需要10毫秒来处理数据包并每5毫秒轮询其缓冲区状态的层。进一步假设帧在时间t = 3ms到达空缓冲区。在那个时刻,我们可以立即计算出在下一次轮询缓冲区时(t = 5 ms)将注意到帧,并在10 ms之后(t = 15 ms)发送出帧。因此,模拟该过程所需的全部是在t = 15ms处安排“帧发送”事件。我们从不需要进行民意调查。