OPNET学习心得(1): OPNET结构

时间:2022-12-14 00:16:57

OPNET学习心得(1): OPNET结构

OPNET结构 (OPNET Architecture)
(注:此部分可参考OPNET Documentation: Main Menu->Modeling Concepts->Modeling Overview->OPNET Architecture)
OPNET为通信网络和分布式系统的性能评估提供了一个全面的开发环境。由许多工具组成,这些工具暗中建模和仿真的步骤分为三个门类:定制(Specification),数据收集和仿真(Data Collection and Simulation),分析(Analysis)。
 
1.模型定制(Model Specification)
 
1.1定制编辑器(Specification Editors)
    a)Project Editor:定义网络模型(network models),network models由子网(subnets)和节点模型(node models)。Project editor具有基本的仿真和分析能力(还包括统计)。
    b)Node Editor:定义节点模型(node models),node models是network models中的一部分。Node models由一系列模块(modules)组成,这些模块内部含有进程模型(Process models)。模块还有可能包含参数模型(?! parameter models)。
    c)Process Editor:定义进程模型。进程模型控制module的行为,也有可能会涉及parameter models(?!)。
    d)Link Model Editor:创建,编辑,查看链路模型(link models)。
    e)Packet Format Editor:定义包格式模型(packet formats models)。packet format指明packet所存储的信息的结构和顺序。
    f)ICI Editor:创建,编辑,查看接口控制信息(interface control information ICI)格式。ICI用来进程间交流控制信息。
    g)Antenna Pattern Editor:创建,编辑,查看发送器和接收器的天线类型。(for radio)
    h)Modulation Cure Editor:创建,编辑,查看发送器的模型曲线。(for radio)
    i)PDF Editor:创建,编辑,查看概率密度函数。PDFs用来控制一些事情,比如源模块的发送频率。
 
1.2模型域
    OPNET分为三个模型域:网络域(network domain)、节点域(node domain)和进程域(process domain),也是整个模型的主要层次。
1.2.1网络域(network domain)
    network domain定义了通信网的拓扑结构。通信的实体是nodes。
    OPNET提供单向和全双工的点到点链路,也提供总线链路用以允许对任意大小的节点组尽心广播通信。
1.2.2节点域(node domain)
    node domain用来对通信设备进行建模,诸如路由器、网桥、工作站、终端等等。Node model是通过Node Editor生成,通过一些更小的模块(module)来表现。一些模块具有一定的功能,这些功能已经定义好了,只用通过配置一组内部参数(built-in parameters)就可以了。它们包括各种各样用来在network domain连接通信连路的发送器和接收器。还有一些模块:处理器(processors)和队列(queues),也是高度可编程的,它们的动作通过进程(Process model)来描述。
    node model中的各个module通过三种链接互连,分别是:packet streams,statistic wires,logical associations。Packet streams传送格式化的消息,我们称为packet。Statistic wire传送简单的数字信号和控制信息,一般用于一个module用来监测其他module的性能和状态。Statistic wire和Packet stream都有参数用来配置它们的行为。Logical associations用来确认module之间的绑定。目前,它们只被用在发送器和接收器之间,用来表明它们在接入到Network domain上的链路时,应当被当作一对module来使用。
1.2.3进程域(process domain)
    一个进程(process)可以被认为近似于一个执行程序。OPNET中的Process是基于Process model,他们是在Process Editor中定义的。
    进程组(process group)由许多process组成,这些process都是在同一个processor或者queue中执行。当仿真开始的时候,每个module只能有一个process,称之为root process。这个process之后能够创建新的process,他们之后也能再创建其他的process。在仿真中被创建的process称之为动态进程(dynamic process)。
    任何时刻只能有一个process处于执行状态。当一个Process开始执行后,我们说这个process被调用(invoked)了。
    当一个process调用另一个process时,调用(invoking)process被暂时挂起直到被调用(invoked)process被阻止(block)。一个process如果完成了它当前调用的处理就将被阻止。当invoked process被阻止时,invoking process就将从它挂起的地方继续执行。
    OPNET中的Process能够对中断(interrupt)或者调用(invocation)产生响应。Interrupt可能产生自process group之外的源,或者process group中的其他成员,或者这个process自己。Interrupt一般对应于一些事件,包括消息到达、计时器到时、资源释放或者其他模块的状态改变等等。
    OPNET的process editor使用Proto-C的语言来描述process model。Proto-C基于状态转移图(State Transition Diagrams STD)、一个高级指令库(kernel Procedures)和C或C++的通用部件。STD定义了模型的各个process所处的状态,以及使进程在状态之间转移的条件。这种条件称之为transition。Kernel Procedures主要一系列的函数包组成,这些包详见参考文档。
    STD在Process Editor中生成。STD除了一些传统的STD具有的能力外,还有一系列扩展:
    a)状态变量(State Variables)。process可以拥有一些私有state variables,这些state variables可以是任意的数据类型,包括OPNET专有的、通用的C/C++、用户定义类型等等。这种能力使得process能够灵活的控制counter、routing tables、与性能相关的statistics、需要转发的message。任意组合的statevariable可以在一个process所有的动作和决定中使用。
    b)状态执行(State Executives)。通过C/C++语言描述了process进入和离开状态时的操作,典型的操作包括:修改状态信息,创建或接收消息,更新发送消息的内容,更新统计数据,设置计时器以及对计时器作出响应。
    c)转移条件(Transition Conditions)。通过C/C++语言描述布尔变量,要涉及interrupt的属性以及state variables的组合。
    d)转移执行(Transition Executives)。转移时可能会定义一些通用的操作。
 
1.3模型,对象,属性(Models,Object,Attributes)
1.3.1对象(Object)
    Object是Model的一部分,其可以在model中扮演下面的功能:
    a)定义行为
    b)创建信息
    c)储存和管理信息
    d)处理、修改、转发信息
    e)对事件作出响应
    f)包含其他的object
1.3.2属性(Attribute)
    object的Attribute和一些允许访问Attribute或者使Attribute生效的程序组成了object的接口。这些程序可以是OPNET自动生成的,也可以是用户编写的。包含有子object的object称之为复合对象(compound object)。
1.3.3模型(Model)
1.3.4模型属性(Model Attribute)和属性提升(Attribute Promotion)
    Attribute除了可以描述object外,还可以用在model上用来表示model的参数。model的attributes机制可以提高model的可重用性。具体地说,model的attribute被定义为model的一部分,但同时,他们也出现在object里,他们是在object的model被规定后被object获得的。这是object的本能操作。
    类似这种model attribute机制,object attribute也可以被向上传给model,这种机制就是所谓的attribute promotion。Promotion导致object attribute不再有值,而是作为model的attribute出现在上层属性中。对于一路promote到所有model之上的attribute,我们可以把它看作是simulation的attribute。从而把研究的系统看成是这些attributes的函数。
1.3.5衍生模型(Derived Models)
    有的时候,我们想只改变一个model的一些attributes就可以得到一个新的model。这种机制称为模型的衍生(model derivation)。衍生出的model称为derived model,被衍生的model称为parent model,没有parent model的model称为base model。
 
2.包通信建模(Modeling Communications with Packets)
    OPNET中的一种基本通信结构是packet。packet主要由三个存储域组成。第一个域是packet field,是一组用户定义的值。第二个域pre-defined field由一组预定义的值组成,用来跟踪和统计。第三个域是transmission data field,用来支持可定制的通信链路模型。
    Packet分为两类:格式化的(formatted)和非格式化的(unformatted)。formatted packet的各个域都是按照所谓的packet format的模版定义的。Packet format是在Packet Format Editor中创建的,在那里定制了一组域名、数据类型、大小(按bit)和缺省值。unformatted packet在刚创建时没有任何域,这些域都是后来一次一个加上去的,而且只能通过数字编号指示,而不是通过名字。
    Packet可以在OPNET模型中通过几种通信机制传输。在node level,是通过packet stream;在network level是通过links;还有第三种传送机制,称为packet delivery,支持各个module之间的packet发送,不管这些module在网络中的位置以及他们之间有没有物理连接。
 
3.数据采集和仿真(Data Collection and Simulation)
    建模的主要目的是为了获取对系统性能的测量或者对系统的一些行为作观察。OPNET通过在这个系统里创建一个可执行的model支持这个功能。有几种机制用来在一个或者更多的系统中收集所需的数据。
 
3.1仿真输出的数据类型(Simulation Output Data Types)
    OPNET提供了许多输出类型,主要有output vectors、output scalars、animation。当然,用户也可以自己定义所要的输出类型,但是一般情况下都直接使用OPNET提供的数据类型。
3.1.1输出向量(output vectors)
    output vector是输出数据中最常见的输出结果,它实际上是一组数据对(pairs of real value)的集合,被称之为条目(entry)。一个vector可以包含了任意数量的条目,这些条目采自单个仿真。条目的第一个值可以看作是独立变量(independent variable),第二个值则是依赖变量(dependent variable)。在OPNET中,这也被称做横坐标(abscissa)和纵坐标(ordinate)。在绝大多数情况下,independent variable都是仿真时间(simulation time),它随着仿真的进行单调的增加。换句话说,大多数情况下,vector代表了我们所关心的量值随时间的变化。当然也有随着别的东西变化的:)
3.1.2输出标量(output scalar)
    相比起vecotr,scalar则是一个值。一般来说,标量都是采集的测量数据的函数,比如:平均值,概率,或者峰值之类的。scalar更为有用的地方在于多次仿真后作出随系统参数变化的曲线。OPNET仿真在output scalar文件中记录scalar statistics。与output vector不同的是,output scalar包含的不仅是一个仿真的结果,而是多个仿真的结果。原因之前已经提到过了。
3.1.3特定应用的统计(Application-Specific Statistics)
    scalar和vector都可以被自动地计算和记录一些预定义的统计。这些预定义的统计一般都和模型中一些特定的对象的测量值有关,比如:queue sizes、link throughputs、error rates和queuing delays。而且,在仿真中记录对一些特定应用统计的计算也很常见, 这些统计也被放在了scalar和vector输出文件中。
    定制统计可以在process model中声明,在这种情况下,OPNET把他们加入到使用这个process的module的内建统计中去。定制统计按范围划分为本地的(local)和(global)。
    local statistic只由声明它的processors和queue单独维护。它适合记录那些只跟本地相关的事件,比如CPU利用率等等。
    global statistic由很多模型中的实体共享。它适合记录那些关系到整个系统性能和行为的信息。比如忽略源和目的的端到端延迟。
 
3.2采集数据选择(Selecting Data for Collection)
    OPNET数据采集机制的缺省设置是关闭的,所以要显式地激活特定的统计,从而让结果能够输出到合适的输出文件中去。这通过在仿真时设置一系列的探针(probe)实现。这些probe可以指向scalar、vector等等。这些probe通过Project Editor下的Chose Result(?!我的ms是Project Editor下Simulation->Choose Statistics)操作定义。更多的高级probe要在Probe Editor中定义。
    为了使统计更简单,指针还可以选择一些选项,比如通过选择时间窗来减少数据量等等。
 
4.分析(Analysis)
    仿真的第三阶段包括检查收集的数据。一般来说,绝大部分的数据都放在output scalar和output vector文件中。OPNET在Project Editor中提供了对这些数据的基本访问能力,在Analysis Tool中提供了更高级的图像和数值处理能力。

4.1数值数据分析
    Project Editor和Analysis Tool都可以选择output vector文件,并且导入单个或多个vector,并将他们的轨迹(traces)显示出来。多条traces可以显示在一张图上,我们称这张图为分析面板(analysis panel)。analysis panel的展示方式可以通过analysis configuration来配置。
    Analysis panels提供了许多数值处理的操作,用来对traces或者vector进行操作,从而产生新的数据做图。这些操作详见参考文档。
    Analysis Tools链接到了Filter Editor上,Filter Editor能够使用数学过滤器(mathematical filter)来处理vector和trace。这里不详述。