labview深入探索-----内存管理和缓存重用

发布者:游走人间最新更新时间:2015-08-24 来源: eefocus关键字:labview  内存管理  缓存重用 手机看文章 扫描二维码
随时随地手机看文章
使用过常规C语言的朋友都知道,C允许编程者,申请内存,再分配内存和释放内存,这为编程者提供了极大的方便的同时,也造成了非常多的隐患,可以说,C程序的运行中许多莫名其妙的错误都和内存泄露有关.程序可能连续运行几个小时没有任何问题,但突然就发生错误,对于一个比较复杂的程序,追踪内存泄露非常困难,经常要借用第三方的专门的内存分析工具.

C的内存错误最多的是两种情况:

1.数组越界:

  int Array[10];//系统自动分配10*4BYTE的空间

  for(int i=0;i<100;i++) Array[i]=i;  //写入前10个元素时没有问题,超过10个,C会继续向连续的内存空间写数据

  如果该内存空间无用,没有问题.如果这段内存空间被系统或者其它应用程序占用,错误的写入可能会导致系统崩溃,经常提示的是发生意外错误,比较新的操作系统一般不会崩溃,会提示内存写错误,应用程序退出.

2.分配内存没有释放(内存泄露)

 int *p;//定义整型指针

 p=(int *)malloc(100*sizeof(int)); //申请100*4个字节的内存

 if(p==NULL)  //系统无法分配,退出程序

{

   return (errro);

}

free(p);  //释放申请的内存空间  如果没有这个语句,重复调用这段程序,导致占用的内存空间越来越多.


labview则完全不同,它的内存分配是由LV的内存管理器自动完成的,因此不存在用户内存释放的问题,也不存在数组越界的问题,既然如此,讨论LV的内存管理有意义吗?

答案是:非常重要.经常有人抱怨,LV的运行速度缓慢,性能很差,这里主要的原因都是内存使用不当的原因.


LV随时都在不断地进行内存分配,再分配和释放的工作,只不过这些工作是由LV内存管理器自动进行的,对用户来说是在后台进行的,是不受用户控制的.同时,内存管理器的工作是非常繁重和缓慢的,它的大量无意义的工作将会导致程序运行效率的急剧下降.

改进LV内存使用的最好办法是良好的编程风格.


一个VI占用的内存空间分成四个部分.

1.PANEL                   前面板

2.BLOCK DIAGRAM           程序框图

3.CODE SPACE              代码空间

4.DATA SPACE              数据空间


代码空间指的是框图编译后形成的机器码所占的空间.

数据空间包括前面板控制器和指示器的值和默认值,常量和动态定义的数据.

当打开一个VI的时候,面板空间,代码空间和数据空间载入内存,该VI的子VI的代码空间和数据空间载入内存.

如果选择显示程序框图,则程序框图空间也载入内存.


可以看出,当打开一个VI时,LV只载入需要的部分,自VI只载入代码空间和数据空间.所以不必要考虑子VI的前面板和程序框图.如上图,如果把主VI的部分分成多个SUBVI,可以有效地节约内存的使用.因为SUBVI一方面不再需要前面板和程序框图,只有代码空间和数据空间载入内存,并且在需要的时候,LV可以收回数据空间内存并重新利用.当我们打开一个非常大的,包含很少SUBVI的程序,速度会非常缓慢,相反,一个很大的包含很多的SUBVI的程序打开速度非常快,就是这个原因.


当我们编写VI的时候经常要查看它的内存使用情况,有几种方法:

一.通过ABOUT对话框,可以查到操作系统为LV分配的全部内存.全部内存包括打开的VI占用的和LV本身占用的.在打开LV之后,记录下这个值(LV本身占用的),然后编辑你的VI,再查看ABOUT对话框,他们的差就是你的VI占用的内存,这个方法可以大概估计您的VI的内存使用情况

 


 二:通过FILE菜单中的show vi property(CTRL+I)来查看当前VI的内存使用情况.
 



三.通过Profile Window 来查看.

 



总结以上内容,得出几个要点:

.因为LV控制内存管理,因此很难知道LV的内存是如何分配的.

.良好的编程风格会改进LV的内存使用情况.

.VI的内存使用分成PANEL,BLOCK,CODE,DATA四部分.


下面的部分详细分析这四部分的内存是如何使用的.

首先看看PANEL和BLOCK,这两个部分是占用内存的主要部分.

前面板主要是由控制器(control)和指示器(indicator)组成的,每个控制器和指示器都有自己的数据拷贝,在编辑的情况下我们可以随意更改控制器和指示器的值,即使他们通过数据流连在一起,只要不运行,指示器没有新的数据流到来,它始终保持原来的值.控制器和指示器的数据拷贝称作操作数据,因为只用通过具体操作才能改变它的值,框图的中的数据(数据流)称作执行数据,因为只有VI运行时候才起作用.可以理解成连线上的数据.[page]



 对于一个不显示的子VI是不存在操作数据的,如果打开了SUBVI的前面板,则包含的控制器和指示器的操作数据.

在下面的情况下,将包括操作数据.

.前面板打开.

.框图程序使用的属性节点,导致前面板载入内存,可能不显示,但是存在.

.局部变量读写了控制器和指示器.

.设置了VI属性,OPEN WHEN CALLED.

对于BLOCK的operate数据只有在BLOCK显示的情况下才发生,编译成执行文件时可以不考虑.


代码空间,包括所有子VI的代码空间在主VI载入内存时,一起载入,并长期存在,它包含的是框图编译形成的机器码.

子VI的代码空间一般比较小,但是当几百个以上的SUBVI时,这个内存占用就不能不考虑了,当你执行主VI时候,不管这段代码是否有用,它都是一直存在的.

如果是通过VI服务器动态调用的SUBVI,那代码空间是否载入,何时载入,取决于用户了.所以使用动态调用的方法可以有效地节约内存,但是同时如果经常重复调用,将影响到运行速度,节约内存是以牺牲速度为代价的.

LV内存管理是自动的,但并不是完全不可干预的,通过研究它的基本运行规则加上我们良好的编程风格,就可以提高使用效率.

看一些实际的例子. 


 
 

 因为循环计数端子数据类型是I32,占四个字节,所以1000个数据占4K字节,从循环流出的数据占数据空间4K,

最上面的图是数组索引,是读的操作,对数据流上的数据不做任何改变,所以不需要分配新的内存,而是重用了内存.而下面的图是替换数组元素.替换后数组将发生变化,因为3个并行的替换是独立的,没有先后次序,所以LV不得不为2,3处分配额外的4K+4K字节,加上循环后分配的4K字节,这样1,2,3处就一共占用了12K.


 这个图中,替换是要改写数据的,索引是不需要改写的,如果替换先执行,则必须为索引部分重新分配4K内存,避免因数据改动读回错误的数据.LV的内存管理器是非常智能化的,因此,它会先执行索引操作,然后在执行替换操作,这样就重用了4K内存,因此占用数据空间还是4K.



这两个框图的功能是完全一样的,但是数据空间内存占有量是完全不同的.LV内存重用它首先选择从上到下的方式,

循环中随机数的数据类型是DOUBLE,8个字节,因此数据流出8K,1.2加上指示器的操作数据共24K,

下面的图中,在ADD的过程,它首先试图选择1的重用,但是1在乘法的输入需要,所以无法重用,因此在3处又占用了8K的字节,令人感到疑惑的是它为什么不重用2的内存那,因为它首先选的是上面的1,可见,LV的内存管理器也不是万能的.


 

既然LV首先选择上面的重用,那上图的字节应该是8K+8K+8K=24K啊,它为什么用的是16K那,这是另外一个原则,因为最上面的是标量,而运算结果是数组,显然标量是无法重用成数组的,因此,它选择了下面的数组输出来重用.8K+8K(指示器)=16K


 从上面的图可以看出,未连接的输出并不占内存空间,因为未连接的输出没有后续的数据需要流动,所以LV并不为其分配内存.


 SUBVI中的默认值也是内存空间占用比较大的,尤其是数组和字符串,它会在VI内部保持它的默认值,并随着VI一起保存在磁盘中,当然,设定默认值对子VI的调试非常有好处,如果测试完毕,不需要子VI的默认值,记住要清理掉.

还有一些主要是涉及数据类型转换的问题,结合数据类型再分析.





 

关键字:labview  内存管理  缓存重用 引用地址:labview深入探索-----内存管理和缓存重用

上一篇:LABVIEW深入探索之MDB数据库写入速度问题。
下一篇:大量数据的内存管理

推荐阅读最新更新时间:2024-03-30 23:03

基于LabVIEW的多路时序控制脉冲发生器设计
  0 引 言   在过程控制和自动测量中,经常需要一些时序控制脉冲来触发和关闭不同的控制单元和功能部件的工作。时序脉冲信号的产生,传统上一般采用硬件方式实现,早期大多采用计数器和寄存器进行设计,近年普遍采用可编程逻辑器件(PFGA)或数字信号处理器(DSA)。采用硬件方式实现的时序脉冲信号发生器存在仪器功能单一,信号输出通道路数较少,参数调节不方便,仪器的升级换代困难等缺点;而采用基于LabVIEW的“虚拟仪器”概念设计制作的时序脉冲发生器却具有界面直观、功能多样、参数调节方便、容易升级换代等特点。   1 LabVIEW简介   实验室虚拟仪器集成环境(Laboratory Virtual Instrument Engi
[测试测量]
基于<font color='red'>LabVIEW</font>的多路时序控制脉冲发生器设计
使用LabVIEW软件为自动化麻醉系统开发闭环控制方法
Author(s): Dr. Thomas M.. Hemmerling - Department of Anesthesiology, McGill University Industry: Biotechnology, Research, Medical, Education Products: LabVIEW The Challenge: 将全身麻醉的控制过程自动化,并在手术中监控病人,让麻醉医师可以在手术时照顾多位病人。 The Solution: 使用 NI LabVIEW 图形化程序软件开发闭环控制系统,以自动监控病人的知觉深度、疼痛程度还有肌肉松弛度,以计算并施打适当的麻醉药剂量。 医生在进行手术
[测试测量]
使用<font color='red'>LabVIEW</font>软件为自动化麻醉系统开发闭环控制方法
Dr. T与Jeff Kodosky入选美国国家发明家名人堂
1976年,Dr. T与Jeff Kodosky等人共同创立NI公司。40多年来,NI致力于开发高性能的自动化测试和测量系统,旨在帮助客户解决当前和未来的工程挑战。 eff Kodosky(右一)与Dr. T(右二) 三十年磨一剑,NI LabVIEW平台自面世以来,提供无与伦比的图形化编程方法,为用户轻松集成测量硬件、在程序框图上展示复杂的逻辑、开发数据分析算法以及设计自定义工程用户界面。目前,NI已推出全新的LabVIEW 2018与LabVIEW NXG版本,持续为工程设计提供最佳测试性能。 到2018年为止,已有562名发明家入选美国国家发明家名人堂,其中包括电话发明者Alexander Graham Be
[测试测量]
Dr. T与Jeff Kodosky入选美国国家发明家名人堂
labview编程技巧-----chart 如何不连续显示数据
chart的内部数据结构是一个FIFO缓冲区,默认长度是1024,它即可可以输入单点数据也可以输入数组类型数据,即可以显示单条曲线,也可以同时显示多条曲线. 以单条曲线为例,有的时候,需要根据外部要求决定是否显示采集的数据,比如按钮,开关等 有两种方法可以满足这个要求: 一:在WHILE循环中加CASE结构,决定是否显示. 当BOOLEAN=TRUE时,CHART更新,当BOOLEAN=FALSE时,CHART停止不动,X轴点数不增加,如果采用时间显示,似乎采集处于停止状态,当BOOLEAN 由FALSE--- TURE时,延续上一次的曲线. 二:一直保持CHART的更新状态,在BOOLEAN=FALSE时,仅仅不显
[测试测量]
<font color='red'>labview</font>编程技巧-----chart 如何不连续显示数据
Labview实现单边带信号调制(SSB)[移相法]
时域上的表达式为 调制器模型为 这个实验中需要相位偏移比较多,因为一共用了四个信号仿真器,一个是无偏移的调制信号,一个是偏移的调制信号,一个是无偏移的载波信号,一个是偏移的载波信号。然后根据调制器模型进行相应的操作。 最后的输出为载波信号的时域图像,结果信号的单边带调制下边带的频域图像,结果信号的单边带调制的上边带的频域图像。 实现效果 载波频率为280的大小,以280为中界的原正弦信号为两个双峰,经过了移相法得到两个单峰。 后端实现
[测试测量]
<font color='red'>Labview</font>实现单边带信号调制(SSB)[移相法]
LabView学习笔记(6)跑马灯之顺序结构与局部变量的使用
本例使用局部变量,通过练习使用顺序结构和While循环,又一次实现了跑马灯的效果。 前面板设计: 程序框图设计: 运行发现与前面while循环+移位寄存器效果一样!
[测试测量]
LabVIEW的深入探索-----LabVIEW中的时间节点函数
LabVIEW专门提供了时间类型的控件---时间标识(TIMESTAMP),时间控件是8.X的新增数据类型,内部用18位整数或者19位浮点数表示时间,以秒为单位,开始时间是1904年1月1日星期5 12:00 am(UTC). LabVIEW在函数面板中有几个时间相关的节点函数 时间计数器----获得计算机启动以来的毫秒数 等待(MS)-----线程休眠指定的毫秒数,让出控制权 等待下一个整数倍毫秒----与等待类似,等待到当时间计数器的值是设定值的整数倍,可以保持循环间同步. 这几个函数我在LABVIEW的软件定时器中介绍过. 今天主要探讨的是几个日期时间相关的函数节点 1、获取日期时间(秒)---------取得当
[测试测量]
<font color='red'>LabVIEW</font>的深入探索-----<font color='red'>LabVIEW</font>中的时间节点函数
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
最新测试测量文章
换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved