何时在 OMNet++ 中使用 send、sendDirect 和 sendDelayed?

use*_*499 2 omnet++

我正在 omnet++ 中构建自己的复合模块,其中包含多个简单模块并具有分层架构。但仅send()在模块间通信中使用(例如我的应用程序生成器使用 send() 将数据包发送到缓冲区下方)似乎会增加总网络延迟。

此外,我还看到了其他受支持的模型,如 inet、mixim 等。它们交替使用 sendDirect 和 send 和 sendDelayed。

所以,我的问题是,何时使用send(),sendDirect()和sendDelayed()? 他们有任何延迟差异吗?

Rud*_*udi 5

有几种方法可以在模块之间交换信息。您使用哪一个实际上取决于您传递的数据以及与协议本身相关的交换有多少。

所有的澄清首先:使用send()或sendDirect()不不增加延迟。如果您通过普通通道发送消息或使用sendDirect()该消息将在当前模拟时间(即现在)传递到目标模块。在目的地处理消息时,模拟时间将相同,因此模拟时间没有额外的延迟。sendDelayed()显然会增加延迟,但无论如何这是它的主要目的。

您必须决定是要使用消息传递作为模块之间的通信方式(这是异步的)还是要直接调用其他模块(即同步)。在第一种情况下,可以使用的OMNeT ++的调度功能(即send,sendDelayed,sendDirect等等)。在第二种情况下,您通常通过获取指向它的指针并可能使用check_and_cast<>. 像getParentModule()和findSubmodule()这样的方法在这里很有用以获得指向所需模块的指针。

当模块之间的通信被视为“实现”细节时,直接调用很有用。它也更快(就 CPU 使用而言)和同步(因此您可以获得返回值)。

如果您使用 GUI 运行时环境传递要在模拟期间检查的数据(即您想看到小点飞来飞去),那么您应该使用消息定义和send()/sendDirect()等。

最后,之间的差异send()和sendDirect()。如果您有一个拓扑结构,通过通道连接门(即您现在预先使用通信路径),则通常使用send()(例如有线网络)。如果您事先不知道通信路径,那么您通常会获得指向目标模块的指针,但之后您使用sendDirect(). 这通常是无线网络中的情况。