




已阅读5页,还剩176页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
OmNeT 手册 带有列表的标题和内容版式 在此处添加第一个要点在此处添加第二个要点在此处添加第三个要点 什么是OMNeT OMNeT 是面向对象的模块化离散事件网络仿真框架 不是 不是仿真器是 一个写仿真模型的基础架构和工具 提供组件和模块 像LEGO积木块一样 OMNeT 应用领域 有通用架构 应用各种领域 有线和无线通信网络的建模协议建模排队网建模多处理器和其他分布式硬件系统的建模硬件架构的验证复杂软件系统各方面性能评价采用离散事件方法的任何系统通过交换消息映射为实体通信的任何系统 OMNeT 模型 OMNeT 模型是由模块组成的 模块之间通过消息传递方式进行通信 OMNeT 的整个模型称为network模型结构通过NED语言描述Messages代表网络中的帧或者包 排队网络中的工作或者客户Gates是模块的输入输出接口Connection link 用于对物理链路建模 channel具有参数 数据率 datarate 传播延时 propagationdelay 误码率 biterrorrate 误包率 packeterrorrate connection支持这些参数Module也有参数 在NED文件中指定 或者在配置文件omnetpp ini中指定 OMNeT 模型 参数的类型 string numeric boolean XML数据树网络模型拓扑结构使用NED语言描述 算法编程 模型模块中包含算法 仿真对象由C 类描述OMNeT 模型包含如下几个部分 1 NED语言拓扑描述 ned文件 2 消息定义 msg文件 3 简单模块源代码 h cc文件 仿真系统包含的组建 1 仿真内核 管理仿真和仿真类库 2 用户接口 用于仿真执行 用于调试 显示 批处理仿真执行 NED语言 NED代表网络描述 是用户描述仿真结构的语言 OMNeT 中 NED可以声明简单模块 连接以及它们组合的复合模块等等 NED语言的特征 继承性 基于组件 接口 层级 包结构 内部类型 元数据注解 属性 NED语言有树形代表的等价形式 可以序列化为XML NED语言表示真实的通信网 通信网描述 包含很多节点 每个节点有一个运行的应用程序 应用程序随机发送数据包 节点也是路由 假设应用程序时数据包基础的通信 所以传输层细节可以不用考虑 建模方法 首先 建立一个network 然后 定义一个网络引入信道Channel建立App Rounting Queue等模块建立节点复合模块所有对象组合在一起 定义一个网络 networkNetwork submodules node1 Node node2 Node node3 Node connectionsnode1 port datarate 100Mbps node2 port node2 port datarate 100Mbps node4 port node4 port datarate 100Mbps node6 port Network的类型是network node1 node2 的类型为Node Node在下面定义 然后定义节点之间的连接 连接点称为gate port 的意思是将一个gate加入到port 中 datarate 100Mbps 代表数据率为100Mbps 定义信道 每个连接重复写数据率是很麻烦的 所以 创建一个新的信道类型封装数据率设置networkNetwork types channelcextendsned DatarateChannel datarate 100Mbps submodules node1 Node node2 Node node3 Node connections node1 port Cnode2 port 简单模块定义 定义流量生成器 路由 队列包等类型simpleApp parameters intdestAddress display i block browser gates inputin outputout simpleRouting simpleQueue 模块App Routing Queue名以大写开头以 开头的单词称为 属性 定义Node复合模块 将App Routing和Queue组成Node模块moduleNode parameters intaddress display i misc node vs gold gates inoutport submodules app App routing Routing queue sizeof port Queue connections routing localOut app in routing localInqueue i in routing in i port i 简单模块的定义 使用simple关键字 复合模块的定义 复合模块将其他模块组成一个单元moduleHost types parameters gates submodules connections 组装复合模块的例子 moduleWirelessHostBase gates inputradioIn submodules tcp TCP ip IP wlan Ieee80211 connections tcp ipOut ip tcpIn tcp ipInwlan ipIn ip nicIn wlan ipOut wlan radioIn radioIn 组装复合模块的例子 moduleWirelessHostextendsWirelessHostBase submodules webAgent WebAgent connections webAgent tcpOut tcp appIn webAgent tcpIn tcp appOut 组装复合模块的例子 moduleDesktopHostextendsWirelessHost gates inoutethg submodules eth EthernetNic connections ip nicOut eth ipIn ip nicIn ethg 信道channels 信道封装与连接有关的参数和行为信道后边有C 类定义默认的类名是NED中的类型名 如果有 class和 namespace属性 默认的类名可以不是NED中的类型名系统内置预定义的信道 ned IdealChannel ned DelayChannel ned DatarateChannel 如果引入ned包importned 则不需要写前面的ned IdealChannel没有任何参数DelayChannel有2个参数 delay disabledDatarateChannel的参数datarate ber per 创建一个新的信道 channelEthernet100extendsned DatarateChannel datarate 100Mbps delay 100us ber 1e 10 通过子类化来添加参数和属性 也可以修改已有的属性channelDatarateChannel2extendsned DatarateChannel doubledistance unit m delay this distance 200000km 1s 添加cost属性channelBackboneextendsned DatarateChannel backbone doublecost default 1 参数 参数是模块的变量 用于构建拓扑结构 作为C 代码的输入参数的类型有 doubel int bool string xml 也可以声明为volatile单位可以使用 unit属性来指定参数可以从NED文件或者配置文件omnetpp ini中读取值 参数 simpleApp parameters stringprotocol protocoltouse UDP IP ICMP intdestAddress destinationaddressvolatiledoublesendInterval unit s default exponential 1s timebetweengeneratingpacketsvolatileintpacketLength unit byte default 100B lengthofonepacketvolatileinttimeToLive default 32 maximumnumberofnetworkhopstosurvivegates inputin outputout 上面的模块有5个参数 其中三个有默认值 参数赋值 参数赋值有几个途径 从NED代码赋值 从配置文件omnetpp ini 从用户交互赋值NED赋值的几个位置 在继承的子类中 NED类型实例化的子模块和连接定义中 包含子模块或者连接的网络和复合模块中 1 继承的子类中simplePingAppextendsApp parameters protocol ICMP ECHO sendInterval default 1s packetLength default 64byte 参数赋值 2 在复合模块中的子模块中moduleHost submodules ping PingApp packetLength 128B alwayspingwith128 bytepackets 3 在网络的子模块中networkNetwork submodules host 100 Host ping timeToLive default 3 ping destAddress default 0 参数赋值 4 在网络或复合模块的参数快中networkNetwork parameters host ping timeToLive default 3 host 0 49 ping destAddress default 50 host 50 ping destAddress default 0 submodules host 100 Host 任何索引下标 是索引下标范围 0 49 称为模式赋值或者深度赋值 用于匹配多路元素 networkNetwork parameters host ping timeToLive default 3 host 0 49 ping destAddress default 50 host 50 ping destAddress default 0 submodules host0 Host host1 Host host2 Host host99 Host networkNetwork parameters timeToLive default 3 destAddress default 0 submodules host0 Host host1 Host 参数赋值 5 在配置文件中赋值Network host ping sendInterval 500ms forthehost 100 exampleNetwork host ping sendInterval 500ms forthehost0 host1 example sendInterval 500ms ping sendInterval 500ms sendInterval 500ms sendInterval 1s normal 0s 0 001s orjust normal 1s 0 001s 设置值为默认值 sendInterval default要求用户输入 sendInterval ask 表达式 NED语言表达式和C语法类似二进制异或 逻辑异或 是指数 是串联接函数 fabs toUpper uniform erlang k 表达式可以使用模块参数 门向量 模块向量 当前向量索引等来引用 volatile volatile修饰符使得参数表达式在每次读参数的时候重新计算 非volatile参数只计算一次 单位 同过添加 unit属性可以为参数设置相关的度量单位simpleApp parameters volatiledoublesendInterval unit s default exponential 350ms volatileintpacketLength unit byte default 4KiB XML参数 模块需要复杂数据输入OMNeT 包含XML内置支持 读取DTD验证文件 缓存文件 使用XPath子集选择文档部分 提供DOM形式对象树的内容 使用类型xml 通过xmldoc 函数将xml类型参数指向一个xml文件simpleTrafGen parameters xmlprofile gates outputout moduleNode submodules trafGen1 TrafGen profile xmldoc data xml 359 moduleNode submodules trafGen1 TrafGen profile xmldoc all xml root profile id gen1 trafGen2 TrafGen profile xmldoc all xml root profile id gen2 XML参数 simpleTrafGen parameters xmlprofile xml emptydocumentasdefault 使用xml 函数创建一个xml类型的变量 门 门是模块的连接点有三种类型 input output inout一般NED要求所有门都有连接 为了放松这个条件 可以使用 loose来注解simpleGridNode gates inoutneighbour 4 loose 如果输入门收到的消息是sendDirect 函数发出的 使用注解 directInsimpleWirelessNode gates inputradioIn directIn 子模块 复合模块包含的模块 称为子模块 子模块有名 类型 可以静态指定 也可以通过字符串表达式来指定 这种特性称为参数化子模块类型 NED支持子模块数组和条件子模块 子模块数组的大小必须明确指定 添加子模块 可以对已有的复合模块子类化moduleNode gates inoutport submodules routing Routing parameters thiskeywordisoptionalroutingTable routingtable txt assignparametergates in sizeof port setgatevectorsizeout sizeof port queue sizeof port Queue display t queueid id modifydisplaystringid 1000 index usesubmoduleindextogeneratedifferentIDs connections 子模块 子模块或者子模块向量可以是条件的 if关键字和条件放在子模块类型的后面moduleHost parameters boolwithTCP default true submodules tcp TCPifwithTCP 连接 连接在复合模块的connections节中定义连接不能跨层级 2个子模块门可以连接 子模块门和父模块的内部门可以连接input output门使用箭头连接 inout使用双箭头连接 2个门连接有信道 则使用2个箭头 并将信道放在箭头之间 display属性也一样 inout门是input和output两个门胶合在一起的 如果需要的时候 可以分开 分别为port i和port o门的引用形式是 modulespec gatespecgatename 表示使用第一个没有连接的门连接 信道规约 用户自定义信道a g Ethernet100b g a g Backbone cost 100 length 52km ber 1e 8 b g a g Backbone display ls green 2 b g 内置信道a g delay 10ms b g a g delay 10ms ber 1e 8 b g a g display ls red b g 信道名称 语法类似于子模块定义 name typer1 pppg eth1 EthernetChannelr2 pppg a out foo delay 1ms b in a out bar b in 如果没有明确信道名称 信道名词来自于 defaultname属性channelEth10Gextendsned DatarateChannellikeIEth defaultname eth10G 多连接 链moduleChain parameters intcount submodules node count Node gates port 2 connectionsallowunconnected fori 0 count 2 node i port 1 node i 1 port 0 多连接 2叉树simpleBinaryTreeNode gates inoutleft inoutright inoutparent moduleBinaryTree parameters intheight submodules node 2 height 1 BinaryTreeNode connectionsallowunconnected fori 0 2 height 1 2 node i leftnode 2 i 1 parent node i rightnode 2 i 2 parent 多连接 随机图moduleRandomGraph parameters intcount doubleconnectedness 0 0node j in i ifi j 连接模式 全图的子图每个节点互连枚举所有的连接 参数化子模块类型 子模块可以用类型string的模块参数来指定 语法是使用like关键字networkNet6 parameters stringnodeType submodules node 6 likeINode address index connections INode是一个存在的接口 参数化子模块类型 之间可以使用表达式networkNet6 parameters stringnodeTypePrefix intvariant submodules node 6 likeINode 参数化子模块类型 尖括号之间的表达式可以为空moduleNode submodules nic likeINic typenameexpressionleftunspecified 这时候 子模块类型名通过typename模式赋值来定义networkNetwork parameters node nic typename Ieee80211g submodules node Node 100 参数化子模块类型 尖括号之间也可以指定一个默认值 用于typename没有赋值的时候moduleNode submodules nic likeINic 参数化连接类型 和参数化模块类型类似a g likeIMyChannelb g a g likeIMyChannel display ls red b g 类型表达式可以为空 所以类型使用typename模式赋值a g o 0 channel typename Ethernet1000 A Bchannelb g o 0 channel typename Ethernet1000 B Achannel还可以给定默认值a g likeIMyChannelb g a g likeIMyChannelb g 元数据注解 属性 NED属性是元数据注解 能够添加到模块 参数 门 连接 NED文件 包和NED任何元素上 提过的属性 display class namespace unit prompt loose directIn使用属性 可以让NED元素挂接额外的信息 一些属性由NED解释 一些由仿真内核解释 其他属性用于仿真模型以内 属性作用于类型 namespace foo filepropertymoduleExample parameters node moduleproperty display i device pc modulepropertyinta unit s default 1 parameterpropertygates outputout loose labels pk gatepropertiessubmodules src Source parameters display p 150 100 submodulepropertycount prompt Entercount addingapropertytoaparametergates out loose addingapropertytoagate connections src out display ls green 2 sink1 in connectionprop src out Channel display ls green 2 sink2 in 属性索引 属性索引用于具有同样名字的多个属性 属性索引位于属性名之后方括号中的数字或者标识符simpleApp statistic eed title end to enddelayofreceivedpackets unit s statistic jitter title jitterofreceivedpackets 上例声明了2个统计属性 statistic 属性索引可以方便地使用C API访问 例如询问 statistics 的索引 会返回包含 eed 和 jitter 的列表 属性索引也可以通过继承重载simpleDummy foo 1 what apples amount 2 foo 2 what oranges amount 5 simpleDummyExtextendsDummy foo 2 what grapefruits 5grapefruitsinsteadof5oranges 数据模型 属性可能也包含数据不包含值 node node sameas node包含一个值 class FtpApp2 包含一个列表 foo Sneezy Sleepy Dopey Doc Happy Bashful Grumpy 包含键值对 foo x 10 31 y 30 2 unit km foo coords 47 549 19 034 labels vehicle router critical 重载和扩展属性值 当子类化NED类型 使用模块类型作为子模块或者使用信道类型作为一个连接 就可以添加新属性到模块或者信道 参数和门中 也可以修改现有的属性 代表移除相应位置的元素 包 当一个项目增长时 迟早有必要引入一个目录结构 NED支持目录树结构 将这些目录称为包 包可以减少命名冲突当仿真运行时 仿真内核需要确定包树的根目录 然后遍历整个目录树 加载每个目录中的NED文件 可以有多个NED目录树 但是它们的根目录存在放在内核的NEDPATH变量中 指定NEDPATH环境变量的几个途径 在系统环境变量NEDPATH中指定 在配置文件ned path中指定 作为一个命令行选项加入仿真运行库总 n 在NED文件中 包名在最上面声明packagea b c 包 package ned package ned有一个特殊的作用 它们代表整个包 注释当作包的文档 该文件中 namespace属性影响该目录下所有的ned文件和下面的目录 顶层package ned用于指定根包 使得包名导致的目录层数减少 如 需要包名org example myproject 但是又不想建立这几个目录 就可以在package ned中定义包名packageorg example myproject 其他的NED文件中相应定义该包名 包 命名解析 使用import使用like默认包 简单模块 仿真概念 离散事件系统 DES 状态改变以离散实例发生 事件的发生经历时间为0 假设2个连续事件之间没有其他事件发生 即 状态在2个事件之间不会改变 看作DES 离散事件 的系统可以用DES仿真器进行建模仿真 例如 计算机网络可以堪称DES 包传输开始 包传输结束 重传超时等未来事件集合或者未来事件列表 DES系统能够维护的未来事件集合的数据结构 伪代码描述为 initialize thisincludesbuildingthemodelandinsertinginitialeventstoFESwhile FESnotemptyandsimulationnotyetcomplete retrievefirsteventfromFESt timestampofthiseventprocessevent processingmayinsertneweventsinFESordeleteexistingones finishsimulation writestatisticalresults etc 简单模块 仿真概念 初始化过程建立代表仿真模型的数据结构 然后 进入循环过程 从FES中得到事件 并处理它们 当没有事件时 仿真过程停止执行 OMNeT 中事件和事件执行的顺序 使用那个消息代表事件每个事件使用cMessage类或者其子类代表消息从一个模块发送到另一个模块 消息发生地 称为 消息目的模块 消息发生的时间称为消息到达时间 超时失效 事件的实现是让模块发送消息给自己 事件按照到达时间的顺序从FES中取2个消息遵守的规则 如果到达时间相等 早到达早执行 如果优先级一样 更小调度优先级值得先执行 调度的或者早发送的先执行 仿真时间 当前的仿真时间可以使用simTime 函数获得仿真时间使用OMNeT 的C 类型simtime t代表其他的函数str 返回字符串值parse 将串转换为SimTimeraw 返回int64类型的值getScaleExp 返回全球指数 theglobalscaleexponent getMaxTime返回当前指数代表的最大仿真时间兼容性 早期版本使用double作为仿真时间 加入预处理符号USE DOUBLE SIMTIME就可以使用double来代表simtime t还有一些其他的宏 FES的实现 FES使用binaryheap来实现的 二叉堆 虽然skiplist跳表性能比堆更好 但是堆认为是最好的算法 FES在cMessageHeap类中实现 组件 简单模块 信道 OMNeT 仿真模型包括模块和连接模块可以是简单模块 也可以是复合模块简单模块是模型中的活跃组件 行为可以使用C 代码定义连接时信道对象的联系 信道对象封装信道的行为 传播和传输时间建模 误码建模以及其他行为 信道也是用户用C 代码定义的模块和信道的代表类分别为 cModule和cChannel 简单模块代表类为cSimpleModule 复合模块使用cModule实例化cChannel包括三个内置信道类型 cIdealChannel cDelayChannel和cDatarateChannel 组件 简单模块 信道 类继承图如下所示 简单模块和信道通过子类化创建时需要重新定义一些函数 initialize 用于初始化代码 在仿真系统安装网络之后调用 finish 当仿真器成功终止时调用 用于总统计量的记录 定义简单模块的动态行为 需要重定义下面的一个成员函数 handleMessage cMessage msg 无论何时模块收到一条消息时 调用该函数activity 在仿真器开始的时候 以一个协同程序开始 仿真结束时终止 消息通过receive 获得 仿真时间在receive 中流逝总的来说 handleMessage比activity要好用一些 定义简单模块类型 简单模块类型就是从cSimpleModule子类化得到的C 类 通过重定义一个或者多个虚函数来定义行为 该类必须通过Define Module 宏在OMNe 中注册 Define Module 宏放在 cc或者 cpp文件中 file HelloModule cc includeclassHelloModule publiccSimpleModule protected virtualvoidinitialize virtualvoidhandleMessage cMessage msg Define Module HelloModule registermoduleclasswithOMNeT voidHelloModule initialize ev HelloWorld n voidHelloModule handleMessage cMessage msg deletemsg justdiscardeverythingwereceive 定义简单模块类型 为了能在NED文件中使用上述建立的模块类型 需要一个相关的NED声明simpleHelloModule gates inputin 构造函数 简单模块是仿真内核直接实例化 而不是用户进行的 这就意味着不能随意写构造函数 签名必须由仿真内核指定 幸运地是 这条协议很简单 构造函数必须是public 且没有参数publc HelloModule cSimpleModule本身有2个构造函数 cSimpleModule cSimpleModule size tstacksize 用于接收协同程序的堆栈尺寸 前者用于handleMessage 后者用于activity HelloModule HelloModule HelloModule HelloModule cSimpleModule 使用handleMessageHelloModule HelloModule cSimpleModule 16384 选择activity 初始化和结束过程 构造函数 析构函数 initialize finish四个函数有下面使用惯例 构造函数 将模块的成员变量指针设为NULL 其他初始化工作放到initialize中initialize 进行初始化任务 读模块参数 初始化类变量 使用new分配动态数据结构 分配和初始化自定义的消息 计时器 finish 记录统计 不要delete任何对象 不要取消计时器析构函数 delete所有使用new创建的对象 使用cancelAndDelete删除自消息 计时器 调用顺序 最初的事件 startermessages 放入FES 所有模块的initialize函数 进入事件循环 第一个事件被处理 结束事件循环 所有模块的finish函数复合模块的initialize 子模块initialize如果仿真器因为运行时错误而终止 finish函数不会被调用finish调用方式和initialize相反 子模块finish 复合模块finish 调用顺序 调用顺序的伪代码描述performsimulationrun buildnetwork i e thesystemmoduleanditssubmodulesrecursively insertstartermessagesforallsubmodulesusingactivity docallInitialize onsystemmoduleentereventloop describedearlier if eventloopterminatednormally i e noerrorsdocallFinish onsystemmodulecleanupcallInitialize calltouser definedinitialize functionif moduleiscompound for eachsubmodule docallInitialize onsubmodule callFinish if moduleiscompound for eachsubmodule docallFinish onsubmodulecalltouser definedfinish function 多阶段初始化 仿真模型中 如果initialize提供的一个阶段初始化不够用 可以使用多阶段初始化 这个功能是通过重定义voidinitialize intstage intnumInitStages const两个函数来实现的 仿真开始时 initialize 0 被调用 然后initalize 1 initialize 2 依次被调用 numInitStages返回需要初始化阶段的数目 例如 2级初始化中 numInitStages返回2 initialize intstage 必须实现stage 0和stage 1的处理过程 callInitialize函数执行所有模块和子模块的多阶段初始化如果没有定义多阶段初始化函数 默认的行为是单级初始化 numInitStage返回1 默认initialize intstage 简单调用initialize End of Simulation 事件 OMNeT 没有使用仿真结束事件 cSimpleModule添加功能 handleMessage handleMessage函数被每个事件调用想法就是 每个事件发生 消息到达 的时候调用一个用户定义的函数 handleMessage是cSimpleModule的虚成员函数 函数体默认是空的 在子类中用户需要重新定义 并添加消息处理的代码 模块每个消息到达的时候 handleMessage函数会被调用仿真器中的事件循环同时处理activity和handMessage函数 对应于如下的伪代码 带有handleMessage的模块不是自动开始的 仿真内核只为带有activity的模块创建开始消息startermessage 这就意味着 必须从initialize函数调度自消息self messages 才可以让handMessage模块自己开始工作 不是从其他模块收到第一个消息 while FESnotemptyandsimulationnotyetcomplete retrievefirsteventfromFESt timestampofthiseventm modulecontainingthiseventif mworkswithhandleMessage m handleMessage event else mworkswithactivity transferTo m handleMessage编程 为了在简单模块中使用handleMessage机制 应该为模块指定堆栈大小为0 在handleMessage中能使用的函数有send scheduleAt cancelEventsend 这一类的函数 发送消息给其他模块scheduleAt 调度一个事件 模块 发送消息给自己 cancelEvent 删除由schedleAt函数调度的事件不能在handleMessage中使用receive和wait函数 因为它们天然是协同程序基础的 用于activity想保存的每个数据信息必须在模块类中添加为数据成员 不能够作为handleMessage的本地变量存储 同时 也不能存放在静态变量中 因为静态变量在类的所有实例中共享 加入模块类中的数据成员变量包括如下的情形 状态 属于模块状态的其他变量 重试次数 包队列等 计算 获取的一次值保存 模块参数值 门索引 路由信息等 统计集合的变量 对象 这些变量都可以在initialize函数中初始化 initialize的另一个任务是初始化首次触发handleMessage的最初时间 首次调用之后 handleMessage必须注意为自己调度事件以保持 链 不会断裂 应用领域 handleMessage在大多数情况下比activity要好 1 当希望模块用于包括几千个模块的大规模仿真 这种情况下 activity的模块堆栈大小会消耗很多内存 2 对不维护状态信息的模块 如包sinks handleMessage更方便 3 有大规模状态空间和许多任意状态转移可能性的模块 这些模块的算法使用activity会很复杂 更适合handleMessage 这种情况更加适合通信协议 应用领域 例子1协议模型 通信网的协议层模型在上层有公共的结构 它们都响应3类事件 来自于上层协议的消息 来自底层协议的消息 计时器和超时消息 即自消息 classFooProtocol publiccSimpleModule protected statevariablesvirtualvoidprocessMsgFromHigherLayer cMessage packet virtualvoidprocessMsgFromLowerLayer FooPacket packet virtualvoidprocessTimer cMessage timer virtualvoidinitialize virtualvoidhandleMessage cMessage msg voidFooProtocol handleMessage cMessage msg if msg isSelfMessage processTimer msg elseif msg arrivedOn fromNetw processMsgFromLowerLayer check and cast msg elseprocessMsgFromHigherLayer msg 应用领域 例子2简单流量产生器和接收器 PacketGenerator handleMessage msg createandsendoutanewpacket schedulemsgagaintotriggernextcalltohandleMessage PacketSink handleMessage msg deletemsg PackageGenerator需要重定义initialize 以创建m以及调度第一个事件 应用领域 例子2简单流量产生器和接收器 classGenerator publiccSimpleModule public Generator cSimpleModule protected virtualvoidinitialize virtualvoidhandleMessage cMessage msg Define Module Generator voidGenerator initialize schedulefirstsendingscheduleAt simTime newcMessage voidGenerator handleMessage cMessage msg generate 应用领域 例子3脉冲流量产生器 更为现实的例子是传输包脉冲的发生器 包含burstLength的包classBurstyGenerator publiccSimpleModule protected intburstLength intburstCounter virtualvoidinitialize virtualvoidhandleMessage cMessage msg Define Module BurstyGenerator voidBurstyGenerator initialize initparametersandstatevariablesburstLength par burstLength burstCounter burstLength schedulefirstpacketoffirstburstscheduleAt simTime newcMessage voidBurstyGenerator handleMessage cMessage msg generate 使用handleMessage的优势和限制 优势 消耗更少的内存 调用速度快限制 本地变量不能存放状态信息 需要重新定义initialize activity 处理过程描述 使用activity 可以想编写操作系统进程或线程一样对简单模块进行编程 可以等待输入消息 可以停止执行一段时间 当activity退出时 模块终止 activity包含一个无限循环 函数体中可以使用的重要函数如下 receive 收到消息 事件 wait 停止执行一段时间send 发送消息给其他模块scheduleAt 调度一个事件cancelEvent 删除使用scheduleAt调度的事件end 结束这个模块的执行 activity 处理过程应用领域 一般使用handleMessage比activity要好 activity的主要问题是由于每个模块需要分别指定协同程序的堆栈大小而不具备可扩展性 而且activity的编程风格不是很好 但是 有一种情况使用activty很方便 当过程有很多状态 但是状态转移有限 例如 当编写一个网络应用 只使用单个网络连接时 伪代码如下 activity while true openconnectionbysendingOPENcommandtotransportlayerreceivereplyfromtransportlayerif opennotsuccessful wait sometime continue loopbacktowhile while thereismoretodo senddataonnetworkconnectionif connectionbroken continueouterloop wait sometime receivedataonnetworkconnectionif connectionbroken continueouterloop wait sometime closeconnectionbysendingCLOSEcommandtotransportlayerif closenotsuccessssful handleerror wait sometime activity 处理过程应用领域 如果必须同时处理多个连接 可以动态创建为简单模块的实例 如果不包含wait 同时receive中调用一次 就没有必要使用activity 使用handleMessage就足够了 无限循环的函数体就变成handleMessage函数体了 activity中de状态变量就成了模块类的成员函数 必须在initialize中初始化 activity运行于一个协同程序中 协同程序类似于线程 但是非优先调度 通过调用transferTo otherCoroutine 可以从一个协程切换到另一个协程 这时候 当前协程挂起 otherCoroutine开始运行 之后 ot
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 难点解析京改版数学9年级上册期末试卷及参考答案详解(研优卷)
- 地质类专业生产实习报告
- 冷链运输免责合同协议书
- 工厂搬迁设备运输合同范本
- 小儿推拿知识课件
- 出售平板合同协议书范本
- 关于相邻采光协议书范本
- 公司与工厂合作合同范本
- 消防维修消防安装合同范本
- 小儿扁桃体炎课件
- 四年级数学上册《大数的认识》单元测试卷
- DB23∕1270-2019 黑龙江省居住建筑节能设计标准
- 浅谈地下室底板无梁楼盖设计
- ISO14001内部审核检查表
- 立柱桩施工汇总
- 双块式无砟轨道施工工艺及质量控制
- 管理会计知识点整理
- 导管相关血流感染的治疗
- 工程进度款支付申请书
- 我国常见的草坪草
- 后腹腔镜下肾囊肿去顶减压术ppt课件
评论
0/150
提交评论