ns3中事件调度机制

参考链接:

https://blog.csdn.net/rustfree/article/details/84558058

 https://blog.csdn.net/u013618190/article/details/88085152#commentBox

 ns3 simulator离散模拟机制_Hesy_H的博客-CSDN博客

https://blog.csdn.net/U__obliviate_H/article/details/118727713?spm=1001.2101.3001.6650.4&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-4.pc_relevant_paycolumn_v2&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-4.pc_relevant_paycolumn_v2&utm_relevant_index=8https://blog.csdn.net/U__obliviate_H/article/details/118727713?spm=1001.2101.3001.6650.4&utm_medium=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~default-4.pc_relevant_paycolumn_v2&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~default-4.pc_relevant_paycolumn_v2&utm_relevant_index=8

https://blog.csdn.net/U__obliviate_H/article/details/118720983?spm=1001.2014.3001.5502icon-default.png?t=M0H8https://blog.csdn.net/U__obliviate_H/article/details/118720983?spm=1001.2014.3001.5502 

概念:

(1)模拟器对象(Simulator),该对象可以访问事件队列,并可以管理事件的执行。

(2)调度器(Scheduler),负责插入和删除队列中的事件。

(3)Time: 一种表示模拟时间的方式。

(4)事件本身,通常是某个函数。

1. Time

NS3的Time类可以用来标识仿真时间,也可以对仿真的时间精度进行修改。默认时间精度是“纳秒ns”。如果程序中需要使用更高的时间精度(如皮秒)时,一定要记得在程序开始时调整时间精度,否则将会出现以下问题:

当执行PicoSecond(1).GetPicoSeconds(),会返回0,因为此时的时间精度不够。

要想使用皮秒级时间精度,可以用以下命令进行调整:

Time::SetResolution (Time::PS);

值得注意的是,提高时间精度意味着减小了仿真的时间范围。因为全局仿真时间变量为64bits整数型数据,数据最大值为2^64。当时间精度为皮秒时,最大仿真时间为2^64ps。

最后,需要提醒一下,不要在创建时间对象之后修改仿真时间精度!如果在调用Time::SetResolution之前创建了时间对象,这些对象都始终为更新精度之前的数值,在数值不变,时间精度发生改变的情况下就会引起错误。

下面给出几个提取仿真时间的例子

例1:提取当前仿真时间(使用默认时间精度ns)

uint64_t now = Simulator::Now().GetNanoSeconds();

例2:仿真时间可以进行算术运算和对比等操作。此处为仿真时间对比示例,定义一个结束时间,判断当前仿真时间是否到达结束时间,如果当前仿真时间小于结束时间则进一步执行相关操作。

 Time m_endtime = MicroSeconds(2);
    ...
     
 if( m_endtime.Compare(Simulator::Now()) == 1 )
  {
    ...
  }

Time::Compare函数功能是判断m_endtime与Simulator::Now()大小,该函数在NS3的nstime.h文件中

inline int Compare (const Time &o) const
{
    return (m_data < o.m_data) ? -1 : (m_data == o.m_data) ? 0 : 1;
}

此时m_data为m_endtime时间,o.m_data为Simulator::Now()时间。

当m_endtime < Simulator::Now()时 返回 -1;

当m_endtime = Simulator::Now()时 返回 0;

当m_endtime > Simulator::Now()时 返回 1;

因此,如果当前仿真时间未达到结束时间时,即m_endtime.Compare(Simulator::Now()) == 1,则继续执行if语句中的操作。
————————————————
版权声明:本文为CSDN博主「Yi Liang」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u013618190/article/details/88085152

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值