资源描述
Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,Click to edit Master title style,Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,Click to edit Master title style,#,Http:/,Http:/,Thank you!,Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,#,Click to edit Master title style,#,Click to edit Master title style,#,Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,Click to edit Master title style,#,Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,Click to edit Master title style,#,Click to edit Master title style,#,#,Click to edit Master title style,#,Click to edit Master title style,Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,#,Click to edit Master title style,Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,#,Click to edit Master title style,Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,#,Click to edit Master title style,Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,#,LabVIEW,与多线程,Intelligent Electronics Institute,Huazhong University of Science&Technology,2,目录,多线程技术,LabVIEW,多线程环境,LabVIEW,多线程程序设计,LabVIEW,线程通信与同步,提示与建议,习题,3,3.1,多线程技术,基本概念,程序,是指一个静态的指令序列;,进程,为执行程序指令的线程而保留的一系列资源的集合;,线程,是操作系统用来调度执行的最小单位。,程序,进程,线程,3.1,多线程技术,多线程,在运行一个多线程的程序时,为了运行所有的线程,操作系统为每个独立线程安排一些,CPU,时间,每个线程在使用完时间片后交出控制权,系统再将,CPU,时间片分配给下一个线程。由于每个时间片足够短,这样就造成一种假象:好像这些线程在同时运行。,(a),从用户角度看多线程,(b),从系统角度看多线程,应用多线程技术的目的就是尽可能地利用,CPU,时间。,4,3.1,多线程技术,多处理器,多处理器是指在一台计算机中有两个以上的处理器,每个处理器可以同时执行不同的线程。,在多处理器的作用下,多个线程可以同时执行,从而以更少的时间完成更多的任务。,5,3.1,多线程技术,线程调度,无论进程还是线程都是操作系统中进行,CPU,任务调度的程序单元;,CPU,调度一个进程时必定发生一个进程上下文切换;,CPU,调度一个进程内的多个线程时则可以避免上下文切换的发生;,采用多线程可以减少因上下文切换导致的,CPU,时间开销。,6,3.1,多线程技术,在多进程操作系统中,当创建一个进程时系统同时就为进程创建了一个主线程,由这个主线程生成额外的子线程,然后这些线程又可以生成更多的子线程,所有的线程共同构成了一个进程的线程集。,7,3.1,多线程技术,线程优先级,线程被调度的先后顺序是依据线程的优先级来完成的;,当一个线程被创建时,操作系统将分配给线程一个优先级;,在调度周期的开始,系统从线程的就绪队列中选择拥有最高优先级的线程来执行。,8,3.1,多线程技术,影响线程调度的其它因素,线程调度除了依据线程优先级以外,还受系统调度策略和算法等因素的影响;,调度算法的优劣直接影响到,CPU,运行的效率和性能,不佳的调度算法不仅可能降低系统的反应时间,而且可能导致某些线程或进程长时间得不到调度;,目前操作系统一般采用抢占式调度。,9,3.1,多线程技术,抢占式调度,抢占式调度是指当一个线程或进程所分配的时间片过期或有更高优先级的线程或进程出现时,如果调度进程还需要进行上下文的切换,操作系统将暂停其在,CPU,上继续执行,调度另外的线程或进程到,CPU,上执行。,抢占式调度阻止了任何线程长期占用处理器的情况发生;,最短任务优先调度策略偏向于预估完成时间最短的线程,有利于迅速减少系统中线程数量,提高处理器的吞吐量。,10,3.1,多线程技术,线程通信,如果线程间的通信发生在一个进程中,可以通过从堆栈片段传递值的方式来完成;,如果一个进程中的线程同另一个进程中的线程进行通信,则不能以线程通信的方式来处理,而必须以进程间通信来对待,采取如环境变量、命名管道、共享内存等技术手段来解决;,在多数情况下,线程通信的代价要小于进程通信的代价。,11,3.1,多线程技术,线程同步,线程同步一般分为数据同步、设备同步和任务同步,3,种情况。,数据同步用于保证并发线程以一种安全的模式访问内存块;,设备同步用于多个线程访问单一设备时对实时操作和优先权的严格控制,阻止线程破坏设备的状态;,任务同步用于加强线程间逻辑关系上的前置条件和后置条件。,12,3.2LabVIEW,多线程环境,支持多线程模式的程序设计语言,用函数直接创建多线程,:在,Visual C+,语言中,提供了封装在,Win32 API,中的,CreateThread,、,ExitThread,等函数方法的,CWinThread,类,为创建多线程应用程序提供了基本框架;,从执行系统和,数据流控制,两个层次实现多线程程序设计:,LabVIEW,开发环境。,13,3.2LabVIEW,多线程环境,LabVIEW,执行系统,类似于,Java,虚拟机,是特有的中间执行平台。,LabVIEW,程序框图编译生成的,并不是操作系统平台上的可执行程序代码,而是一种特有的程序组织代码,这种代码必须通过,LabVIEW,的执行系统来实现在操作系统上的运行;,在创建,LabVIEW,发布的可执行程序时,对于没有,LabVIEW,执行系统环境的计算机需要在发布组件选项中包含,LabVIEW,运行引擎(,Run-Time Engine,)。,14,3.2LabVIEW,多线程环境,执行子系统,(6,个,),用户界面(,user interface,)、标准(,standard,)、仪器,I/O,(,instrument I/O,)、数据采集(,data acquisition,)、其他,1,(,other 1,)、其他,2,(,other 2,)。,在“文件,VI,属性,执行”面板中可以对执行子系统进行更改。,15,注意,:“与调用方相同”(,same as caller,)不是一个子系统,它表示其执行子系统与调用该子,VI,的程序的执行子系统相同,3.2LabVIEW,多线程环境,子系统分工,对执行系统进行细分的最初目的在于将不同用途的,VI,严格分配到不同的执行子系统中,各个执行子系统具体分工如下:,用户界面子系统,:主要用于屏幕画图,以及键盘、鼠标输入等,这个子系统也用于特定类型的,VI,执行。,标准子系统,:如果需要为用户界面保持专用运行时间,应当为,VI,指定这个子系统。,仪器,I/O,子系统,:该子系统主要用于完成与,VXI,系统、,GPIB,系统、串行仪器或网络之间的通信。,数据采集子系统,:该子系统主要用于数据采集。,其他子系统,1,:当程序中的任务需要自己的线程时使用。,其他子系统,2,:当程序中的任务需要自己的线程时使用。,16,3.2LabVIEW,多线程环境,用户界面子系统,用户界面子系统是,LabVIEW,系统运行时必须加载的,而其他几个执行子系统则是可选的;,用户界面子系统实际上是一个单线程系统,只有一个用户界面线程执行各种任务;,在,LabVIEW,中所有与用户界面相关的操作都由用户界面子系统负责,其他执行子系统不负责管理用户界面。,17,3.2LabVIEW,多线程环境,线程数量设置,无法通过编写程序来实现对,LabVIEW,执行系统中线程变化的控制,但作为辅助工具,,LabVIEW,提供了一个线程配置程序,threadconfig.vi,,它位于,LabVIEW,安装目录,vi.lib utilitiessysinfo.llb,中;,一般情况下,不需要修改,LabVIEW,系统环境的默认线程数量设置。当,LabVIEW,系统运行在一个,专用计算机,上,可以根据计算机的硬件配置情况适当增加线程的数量。而在一个,非专用计算机,上增加,LabVIEW,系统中线程的数量,则可能影响其他程序的运行,甚至可能由于线程过多导致计算机整体性能的下降。,18,3.2LabVIEW,多线程环境,线程配置程序,threadconfig.vi,线程配置程序界面,线程配置对话框,19,3.2LabVIEW,多线程环境,VI,优先级,LabVIEW,程序优先级的设置方法可以分为程序控制和系统控制两种。,程序控制方法,是指用户通过在程序框图中使用等待函数来控制程序内部并行任务的执行顺序;,系统控制方法,是通过在,VI,属性中选择相应的,VI,执行优先级别来控制,VI,的执行顺序。,20,任务,1,,优先级高,任务,2,,优先级低,3.2LabVIEW,多线程环境,注意,VI,的优先级问题,考虑修改,VI,的优先级设置时要慎重小心,一般情况下,用户创建,VI,的默认为普通优先级,应尽量避免修改,VI,的优先级,只有那些特殊的,VI,才被指定为非普通的优先级;,在当一个,VI,确有必要使用非普通的优先级时,应当遵循这条原则:不要让高优先级的,VI,持续运行;,VI,优先级是隐含的,只能通过查询,VI,属性才能了解。,21,3.2LabVIEW,多线程环境,子程序优先级,子程序优先级并不是一个真正的优先级,它并不标识,VI,的相对优先级别,仅用来标识一类特殊的,LabVIEW,程序,具有该优先级的,VI,不会被加入到执行子系统的运行队列中。,鲜明的特征:,VI,的用户界面不能更新,只能调用子程序优先级的子,VI,,不能调试等;,子程序优先级的,VI,可以调用其他子程序优先级的,VI,,不能调用其他优先级的,VI,。,22,3.2LabVIEW,多线程环境,子程序优先级,当选择了子程序优先级后,以下几个选项就不能选择了:,打开时运行(,Run when opened,);,调用时挂起(,Suspend when called,);,运行时自动处理菜单(,Auto handling of menus at launch,);,允许调试(,Allow debugging,);,调用时清除显示控件(,Clear indicators when called,)。,23,3.2LabVIEW,多线程环境,子程序优先级,VI,示例,“字符串”选项板下的“删除空白”,(Trim Whitespace.vi),24,3.2LabVIEW,多线程环境,多线程程序的优势,多线程技术在,LabVIEW,程序中充分发挥了重要的作用,具有以下几点优势,:,更高效地使用,CPU,;,更好的系统可靠性;,更优化的多处理器性能。,25,3.3LabVIEW,多线程程序设计,线程优化,示例,1,:,要求,:监控重物的速度变化过程,绘制,S-t,(距离,时间)曲线、,V-t,(速度,时间)曲线、,V-S,(速度,距离)曲线并显示所有数据。,初始程序分,3,步执行,26,第一帧:,得到,S-t,数据,3.3LabVIEW,多线程程序设计,线程优化,27,第二帧:,得到,V-t,数据,3.3LabVIEW,多线程程序设计,线程优化,28,第三帧:,得到,V-S,数据,3.3LabVIEW,多线程程序设计,线程优化,发挥多线程的优势,将程序优化为并行结构,29,并行结构下的优化程序,3.3LabVIEW,多线程程序设计,线程优化,示例,2,:,以一个数据采集程序为例来介绍最大化数据流的编程。,原程序由顺序结构实现,30,第,1,帧有两个执行流程:一是产生波形;二是配置模拟输入和输出。,3.3LabVIEW,多线程程序设计,线程优化,31,第,2,帧的功能是发送波形数据。,3.3LabVIEW,多线程程序设计,线程优化,32,第,3,帧的功能是采集波形。,3.3LabVIEW,多线程程序设计,线程优化,33,第,4,帧的功能是停止输入和输出的任务。,3.3LabVIEW,多线程程序设计,线程优化,线程优化后的程序框图,34,这个程序是按照配置、产生波形、读取波形的顺序执行的。只有等到前一步骤中错误簇的信息到达后,下一步骤才能执行。输入和输出配置,VI,函数采用并行结构,并使用合并错误函数来保证只有输入和输出都已经配置好之后才可以产生波形,。,3.3LabVIEW,多线程程序设计,超线程程序,无论是超线程计算机还是多处理器计算机,都可以采用超线程机制对应用程序进行性能优化。,示例:计算所有大于,2,的质数。,初步想法,35,单循环解质数程序框图。,3.3LabVIEW,多线程程序设计,超线程程序,优化程序,36,双循环解质数程序框图。,3.3LabVIEW,多线程程序设计,可重入技术,可以在“文件,VI,属性,执行”框中设置,VI,为可重入,在可重入,VI,中,每个调用都产生一个副本,有着独自的状态信息,这样在执行时,多个相同的子,VI,可以同时执行。,可重入执行在以下情况下是很有用的,:,VI,需要等待一个特定的时间或者超时后才执行;,VI,中含有不能与其他实例共享的数据。,37,3.3LabVIEW,多线程程序设计,可重入技术,示例:,设计一个仿真芯片,74LS14,74LS14,的功能图,施密特非门的传输特性,38,3.3LabVIEW,多线程程序设计,可重入技术,芯片,74LS14,是由,6,个施密特非门构成,因此,74LS14.vi,同时需要调用,6,个,shimit.vi,子,VI,。,39,shimit.vi,的程序框图。,3.3LabVIEW,多线程程序设计,可重入技术,40,74LS14.vi,的程序框图。,3.4LabVIEW,线程通信与同步,局部变量,局部变量(,Local Variable,)是,LabVIEW,为改善图形化编程灵活性而专门设计的特殊节点,主要是解决数据和对象在同一,VI,程序中的复用问题。,局部变量实际上是程序框图中已经存在的某个对象的复制品。,需要某个对象既可读(读出当前值)又可写(写入更新值)时,就可以使用局部变量。,41,3.4LabVIEW,线程通信与同步,创建局部变量,:两种方式,第一种方式是在按照“函数,编程,结构,局部变量”路径创建,此时局部变量的图标有一个问号,需要选择与之相关联的对象后方可使用;,第二种方式是选择目标对象的右键快捷菜单中的“创建,局部变量”菜单项,放置到背面板的相应位置,这样就直接创建了该对象的局部变量。,42,3.4LabVIEW,线程通信与同步,局部变量有两种状态,:读状态和写状态,读状态相当于控制对象,外观和控制对象的端子相似,为宽边框;,写状态相当于显示对象,外观和显示对象相似,为细边框。,局部变量最常用于两种情况,:并行循环控制和对变量数值的更新,并行循环控制主要用于用一个变量同时控制几个并行,While,循环的情况;,变量数值的更新是指在程序运行时,同一个对象既可作为输入给程序赋值,也可作为输出显示当前状态。,43,3.4LabVIEW,线程通信与同步,全局变量,如果要在几个,VI,间共享数据,局部变量无法解决,需要使用全局变量(,Global Variable,)来实现;,全局变量的创建方法为:按照“函数,编程,结构,全局变量”路径创建,在程序框图中会生成一个“,?,”端子,这表示该变量尚未定义,该端子上有一个地球图标,双击未定义的全局变量端子,或用右键快捷菜单中的“打开前面板”命令可打开一个全局变量前面板,它用于定义全局变量的内容。,44,3.4LabVIEW,线程通信与同步,全局变量应用示例:,测速系统,全局变量前面板看上去和普通,VI,的前面板相似,但没有背面板。工具栏中也没有运行和调试的相关工具图标。,45,全局变量前面板。,3.4LabVIEW,线程通信与同步,测距仪器初始化程序,46,3.4LabVIEW,线程通信与同步,测距仪器测试程序,47,3.4LabVIEW,线程通信与同步,事件发生,事件发生(,Occurrence,)技术可以用来在,VI,或部分框图程序之间传递触发时间,利用事件发生技术可以避免轮询带来的系统资源浪费,;,对于一般的应用来说,用户应从调用“产生事件发生”函数开始来创建事件发生参数值,该参数值必须要传递到所有其他事件操作中。然后,用户既可以通过调用“等待事件发生”函数来发生,也可以通过设置事件功能来创建一个事件的发生。在,LabVIEW,环境中,可以有多重的“等待事件发生”函数节点存在,然后当与之联系的设置事件功能被调用时,所有的事件都会在同一时间触发。,48,3.4LabVIEW,线程通信与同步,事件发生示例,事件发生测试程序前面板,49,3.4LabVIEW,线程通信与同步,事件发生的测试程序框图,50,3.4LabVIEW,线程通信与同步,事件发生用户子,VI,的程序框图,51,3.4LabVIEW,线程通信与同步,通知,通知(,Notification,)技术通常用于两个相互独立的框图程序之间或同一台计算机中两个不同,VI,之间的同步通信;,通知器(,Notifier,)是基于通知技术的通信工具,可以看做数据之间的邮箱,一部分框图程序向邮箱中发送数据,另一部分框图程序从这个邮箱中收取数据;,对于通知器,在没有通知消息发生时,程序框图处于等待状态,避免了无休止地循环检测,从而减少了计算机时间的浪费;,通知技术不能用于网络或,VI Servers,之间的通信。,52,3.4LabVIEW,线程通信与同步,通知流程,从调用“获取通知器引用”,(Obtain Notifier),函数来开始创建通知参数值,使用该函数时必须输入元素的数据类型;,通过“发送通知”,(Send Notifier),发送信息;,接收方通过“等待通知”,(Wait on Notifier),得到发送的信息。,53,3.4LabVIEW,线程通信与同步,通知器示例,Notification,测试程序前面板,54,3.4LabVIEW,线程通信与同步,通知测试程序框图,55,3.4LabVIEW,线程通信与同步,通知用户子,VI,的程序框图,56,3.4LabVIEW,线程通信与同步,通知的优缺点,通知和事件发生有些类似,不需要使用轮询技术,减少了系统开销;,通知相比事件发生机制有一定的优势:事件发生不能传递数据,只能触发事件,而通知不仅可以传递数据,还可以通过“取消通知”函数删除信息;,通知也有一些不足:没有数据队列,有时会丢失一些事件,因为新的事件会覆盖旧的没有响应的事件。,57,3.4LabVIEW,线程通信与同步,队列,队列(,Queue,)结构是一种先进先出(,FIFO,)的结构;,用队列技术,可以将一个有序的消息(或数据)从一个程序中传递到另一个与之相独立的并行运行的程序中;,队列技术把数据发送到一个队列缓存中,如果没有程序将这些数据读出,这些数据将一直保存在队列缓存中,直到有一个程序将其读出并删除;,如果有两个应用程序都在等待同一个队列中的同一条数据,只有那个动作快的程序会收到数据,动作慢的则不会收到预期的数据,因为这条数据已经被动作快的程序读出并删除了。,58,3.4LabVIEW,线程通信与同步,队列的应用示例,Queue,测试程序前面板,59,3.4LabVIEW,线程通信与同步,队列测试程序框图,60,3.4LabVIEW,线程通信与同步,队列用户子,VI,的程序框图,61,3.4LabVIEW,线程通信与同步,信号量,信号量(,Semaphore,)技术可以用于限制同时访问一个被保护的共享资源的任务数目;,通过一个公用的信号量,可以在某一时刻仅允许一个任务执行一个受保护的临界区代码;,信号量和其他同步机制是不同的,其他机制主要是唤醒一个等待任务,信号量则是告诉任务需要等待其他任务允许其执行时才执行,所以能够有效地保护公有资源。,62,3.4LabVIEW,线程通信与同步,信号量的应用示例,信号量测试程序前面板,63,3.4LabVIEW,线程通信与同步,信号量测试程序框图,64,3.4LabVIEW,线程通信与同步,信号量用户子,VI,的程序框图,65,3.4LabVIEW,线程通信与同步,集合点,集合点(,Rendezvous,)技术可以使若干并行的任务同步执行;,只有所有的任务到达后,才开始同步执行,就好比一个会议,只有等到参会人员到齐后才开始。,66,3.4LabVIEW,线程通信与同步,集合点的应用示例,集合点测试程序前面板,67,68,3.4LabVIEW,线程通信与同步,集合点测试程序框图,3.4LabVIEW,线程通信与同步,集合点用户子,VI,的程序框图,69,3.5,提示与建议,多线程应用程序有很多优势,如提高执行效率、获取更多有效,CPU,使用时间等,在,LabVIEW,中,写多线程程序及配置线程的优先级是相当容易的。,在有些情况下,使用多线程反而会降低执行效率,在以下情况中应该避免使用多线程:,应用程序的运行步骤有先后顺序;,应用程序有过多的线程切换;,高优先级的线程导致其他线程饥饿;,在系统中只有有限的资源可以利用;,过多使用没有安全保护线程的,CIN,和,DLL,;,大部分任务都访问用户界面线程;,死锁线程需要共享数据。,70,3.6,习题,简述局部变量、全局变量、事件发生、通知、队列、信号量及集合点之间的异同点。,在一个,VI,中有两个,While,循环,如何实现只用一个,Stop,控件控制,While,循环的停止?如下图所示。考虑使用局部变量、全局变量、队列、通知等方法。,71,3.6,习题,在一个,VI,中,含有一个,While,循环,循环中有一个子,VI,,子,VI,也是一个,While,循环,如何使用一个,Stop,控件使主,VI,和子,VI,同时停止?如下图所示。考虑使用全局变量、队列、通知等方法,另外是否可以使用局部变量来实现,为什么?,(a),主程序,(b),子程序,72,3.6,习题,打开和运行习题中第,3,章目录下或者,LabVIEW Example,中的,Timed loops in reentrant VIs Test.vi,,前面板如图所示。,(,1,)为什么第,2,部分的,White Plot,会报错?,(,2,)如果将,Reentrant SubVI.vi,这个子,VI,设置为不可重入,将会出现什么问题?,(,3,)在程序中队列所起的作用是什么?,73,
展开阅读全文