NS3 Events和Simulator内容翻译

以下内容是NS3手册翻译。

1.4 Events and Simulator

ns-3是一个离散事件网络仿真器。从概念上讲,仿真器跟踪了大量的在指定的仿真时间内按计划执行的事件。仿真器的工作就是以顺序的时间序列执行事件。一旦一个事件执行完毕,仿真器将转到执行下一个事件(或者将退出如果在事件队列中没有更多的事件)。例如,如果一个事件在100秒的仿真时间被执行了,下一个事件不会执行止到到200秒,仿真器会从100秒跳到200秒(仿真时间)执行下一个事件。也就是离散事件仿真器的意义。
为按照上面执行,仿真器需要一些事情:

1.仿真器对象可以访问存放事件的事件队列,并可以管理事件的执行。
2.调度器负责从对列中插入和删除事件。
3.一种表示仿真时间的方式
4.事件自身

手册的这一章节描述了这些基本的对象(simulator,scheduler,time,event)和如何使用它们。

1.4.1 Event
待完成

1.4.2 Simulator

simulator类是访问事件调度设施的公共入口点。一旦一对事件已经计划启动仿真,用户可以通过输入模拟器主循环来执行它们(调用Simulator::Run)。一旦主循环开始运行,它将会按着顺序从最老的事件到最近添加的事件执行所有计划的事件,止到剩下没有更多的事件或者调用Simulator::Stop。

为了调度被仿真器主循环执行的事件,Simulator类提供了Simulator::Schedule函数组。

1.不同签名的处理事件的处理器

void handler (int arg0, int arg1)
{
    std::cout << "handler called with argument arg0=" << arg0 << " and
    arg1=" << arg1 << std::endl;
}
Simulator::Schedule(Seconds(10), &handler, 10, 5);

这些代码的输出:

handler called with argument arg0=10 and arg1=5

自然,这些C++模板也可透明的处理C++对象的成员方法:
To be completed: member method example
注意:

• 只有少于5个参数的情况下,ns-3 Schedule methods自动组织调度函数和方法。如果你需要它们支持更多的参数,请提交bug报告。
• 读者与术语“fully-bound functor”类似将组织Simulator::Schedule方法作为一个自动构造这些对象的方法。  

2.通用的调度操作

Simulator API被设计来简单的完成调度大部分事件。它提供了三个变种来完成这些(从使用最多到使用最少进行排序):

• Schedule methods允许你在当前仿真时间和目标事件的过期时间之间,通过在未来内提供一个延时来调度一个事件。
• ScheduleNow方法允许你在当前仿真时间调度一个事件:它们将会在当前事件执行完成之后执行,但是在下一个事件仿真时间被改变前执行。
• ScheduleDestroy方法允许你设置仿真器的关闭过程的一个钩子来清理仿真资源:当用户调用Simulator::Destroy方法,每一次“destroy”事件就会被执行。

3.保存仿真上下文

有两个调度事件的基本方法,带上下文和不带上下文。这是什么意思呢?

Simulator::Schedule (Time const &time, MEM mem_ptr, OBJ obj);
vs.
Simulator::ScheduleWithContext (uint32_t context, Time const &time, MEM mem_ptr, OBJ obj);

投入了很大时间和精力来开发或者使用一个不平凡的仿真模型的读者会知道ns-3日志框架的价值,使得debug的简单和复杂的仿真一样。重要的特性之一就是通过提供日志框架自动展现与当前运行的事件相关联的网络节点id。

当前执行的网络节点的node id事实上已被Simulator追踪。它可以使用Simulator::GetContext方法访问,该方法返回相关联的和存储在当前正在执行的事件的“context”(一个32位整数)。在某些罕见的情况下,当一个事件没有与一个具体的网络节点关联,它的“context”被设置成0xffffffff。

为了给每一个事件关联一个context,Schedule和ScheduleNow方法自动重用当前正在执行事件的context作为计划稍候执行的事件的context。

在某些情况下,特别是仿真一个包从一个节点传输到另一个节点的情况,这种行为是不好的,由于接收事件的期望的context是接收节点的,而不是发送节点的。为了避免这个问题,Simulator类提供了一个具体的调度方法:ScheduleWithContext,它允许提供关联到接收事件的接收节点一个明确的node id。

XXX:code example

在某些极其罕见的情况,开发者可能需要改变或者理解第一个事件的“context”(也就是node id)是如何与它关联的节点(node)进行设置的。这是通过NodeList类完成的:无论何时一个新的node节点被创建了,NodeList类使用ScheduleWithContext来为这个node节点调度一个“initialize”初始化事件。因此这个“initialize”事件使用设置的context,也就是node id来进行执行,并可以使用调度方法的正常的重载(注:这里的意思应该是能够调用调度方法的不同的重载</font>)。它调用Node::Initialize方法,这个方法通过为关联到这个node节点的每个对象调用DoInitialize方法来传播“initialize”事件。这个DoInitialize方法在一些对象中被重载了(特别是在Application基类中),这将调度一些事件(特别是Application::StartApplication),这些事件反过来会调度流量产生事件,而流量产生事件反过来会调度网络层事件(network-level events)。

注意:

 •  Users need to be careful to propagate DoInitialize methods 
    across objects by calling Initialize explicitely on their member objects
 •  The context id associated with each ScheduleWithContext 
    method has other uses beyond logging: it is used by an experimental 
    branch of ns-3 to perform parallel simulation on multicore systems using multithreading.

Simulator::函数不知道context是什么:它们仅仅确保当相应的事件使用Simulator::GetContext执行的时候,你使用ScheduleWithContext指定的context是可用的。

根据在Simulator::上实现的模型解释了这个context值。在ns-3中,网络模型解释context作为产生事件的node节点的节点id(node id)。这就是为什么在ns3::Channel子类中调用ScheduleWithContext是重要的,以因为从节点i到节点j,我们产生了一个事件,并且我们想要确保运行在节点j上的事件具有正确的context。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,711评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,932评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,770评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,799评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,697评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,069评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,535评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,200评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,353评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,290评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,331评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,020评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,610评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,694评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,927评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,330评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,904评论 2 341

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,563评论 18 139
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,159评论 11 349
  • 一,懵懂 2015年11月26日,女孩谈恋爱了,这是她第一次谈恋爱,那晚男孩对女孩说:“我守护你一辈子”女孩笑了,...
    惯着李易峰阅读 1,411评论 0 0
  • 大学期间,我是在旁观着三个朋友的努力奋战,拉着两个闺蜜的吃喝、看戏、睡觉中混过的。当时我还在想,像我六个,两种截然...
    袁小葆阅读 397评论 0 0
  • 《初恋这件小事》!!几乎是伴着所有字幕看完的这部电影,有说看了十几遍的,有二十几遍的,甚至还有近四十遍的。但前三分...
    人间隐客阅读 502评论 0 0