完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
labview对用户屏蔽了内存使用的细节,作为用户很难了解内存是如何使用的以及如何提高程序的运行性能。这份PPT是难得一见的性能与内存管理方面的资料,所以高老师希望我能翻译其中重要的部分,介绍给大家。 对于英文资料,在翻译的同时,不可避免地会参杂一些个人的理解,如果对其中的内容有歧义,欢迎大家留言讨论。 性能与内存管理 目标:
LABVIEW执行系统
LABVIEW执行系统可以使我们的代码自动并行运行。在其它编程语言中,必须通过人工方式进行多线程管理,但是LABVIEW在可能的情况下,编译器和执行系统共同写作,自动并行运行我们的代码。在大多数情况下,执行系统对我们来说并不是很重要,因为执行系统不需要我们参与就会做的很好。 但是在某些情况下,我们有必要了解执行系统是如何工作的,因为这有助于我们改进程序的运行性能。
LABVIEW执行系统的工作类似一个线程池。所谓线程池是多个线程的集合,这些线程协同工作,通过从一个共享的队列,共同完成从队列中提取的任务。在LABVIEW中,这些任务称作“队列元素”,每个队列元素代表一小段需要执行的代码。 LABVIEW实际拥有6个通用的执行系统,每个执行系统拥有一个独立的队列。另外,每个定时循环拥有自己独特的执行系统。
上图是LABVIEW执行系统如何工作的模型图。对于每个执行系统(上图中示意了三个执行系统),我们各自创建了一个队列。入队的数据代表了VI代码中需要执行的片段。当这个需要执行的片段准备好要运行时,LABVIEW把它放入到某个执行系统的队列中。 每个执行系统包括一个或者几个线程,这些线程中一个包括一个循环,负责把代码片段出队列并执行之。UI执行系统只拥有一个UI线程,其它执行系统可以拥有多个线程,但是共享 一个队列。当VI代码并行运行时,由执行系统的不同线程进行管理。 除了操作系统的抢先式多任务系统外,LABVIEW引入了协作式多任务系统。在编译过程中,LABVIEW分析VI,定位那些可以共同执行的节点组,称作CLUMPS,每个由优先级和执行系统组成的运行数据队列结构把这些可以共同运行的CLUMPS保存在一起。当执行系统激活一个线程时,执行系统解析这些CLUMPS并执行之。当执行系统执行完后,运行队列存入其它的符合输入条件的CLUMP进队列,这使得程序框图可以在任意的有效线程中运行。如果程序框图包含了足够的并行机制,就可以在所有的线程中同时运行。 LABVIEW并不是对某个CLUMP分配特定的线程,在VI再次运行时,同样的CLUMP可能被分配到不同的线程中。每个CLUMP都会产生一小段代码由LABVIEW调度。在CLUMP内部,LABVIEW不会使用并行机制,在CLUMP之间,LABVIEW利用执行系统执行多任务。 上图展示的CLUMP代表了程序框图开始到结束的过程,当执行中间两个FOR循环时,CLUMP处于“睡眠”状态。然后被“唤醒”完成VI(执行两个除法运算)。 当一个节点进入“睡眠”状态时,它把自己放入一个等待队列中,然会再返回到执行系统中。当等待结束后,它脱离等待队列,再次放入到执行队列中。 首选执行系统
某些节点具有首选的执行系统。最为常见的首选执行系统是UI执行系统。有些节点必须运行在UI线程中,比如VI服务器属性节点、VI服务器调用节点和打开VI引用节点必须工作在UI线程中。DAQ中的属性节点和调用节点不在UI线程中,LABVIEW中的类的属性节点和调用节点也同样不在UI线程中。 另外,每个VI都可以选择首选的执行系统,默认情况下为“与调用者相同”,这意味着VI可以运行在任何执行系统中。 切换执行系统
当一个节点需要运行,但是节点需要运行在另外的执行系统(非当前运行)中时,这会导致队列元素处于“睡眠”状态,并在其它的执行系统中被唤醒。这意味着这段代码将停止运行,把自己放入到希望运行的那个执行系统队列中。当那个执行系统有时间时,执行系统从队列中取出元素并执行之。这种执行系统的切换需要耗费时间,可能会引起性能的下降。 为了避免这种执行系统的切换,我们应该避免不必要的UI代码(比如服务器属性节点)。对子VI使用“与调用者相同”的执行系统可以有效地避免不必要的执行系统切换。 在下列两种情况下,我们可能会对VI使用特定的首选执行系统.
优先级
子程序优先级
子程序优先级并非真正的VI优先级。VI的优先级是通过改变队列中元素的优先级实现的,而子程序优先级是把整个VI放入在一个CLUMP中,这就保证了VI一旦执行就不会进入睡眠状态。这意味着我们不能在子程序内部调用有可能导致进入睡眠状态的其它子VI,在VI内部也不能引发执行系统的切换。设定为“子程序优先级”的VI在内部只能调用同样设置为“子程序优先级”的其它子Vi。“子程序优先级”的VI的代码在内部执行时都是按照次序执行,而不是并行运行。 内嵌(内联)VI
封锁线程
LABVIEW的执行系统是基于多线程相互协作的基础上,但是其它语言编写的代码并非如此。这意味着当我们从LABVIEW中调用外部代码时,LABVIEW只有在外部代码操作完成后才能继续线程操作。当外部代码需要等待运行权限或者其它原因进入等待状态时,当前的执行系统必须等待外部操作代码运行结束,因此等待期间,执行系统内不会有其它VI运行。如果外部代码无法完成,经常会导致出现“重置VI”对话框。如果使用调用库函数节点调用外部代码,则需要在配置对话框中的“回调”也选择合适的选项,避免这个问题的发生。 连线的含义
LABVIEW的数据流编程模式意味着每一条数据连线都操作着它自身的数据拷贝,在子VI内部同样也需要创建数据的拷贝。由于两个分支创建了数据拷贝,因此两个分支可以同时独立工作,不 会出现数据锁定的情况。 =========================================================== 待续 |
|
相关推荐
6 个讨论
|
|
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-20 11:57 , Processed in 0.485688 second(s), Total 49, Slave 41 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号