LabVIEW中的多任务
- 更新时间2025-08-27
- 阅读时长5分钟
LabVIEW使用抢占式和合作式的多线程机制。在抢占式多线程技术中,操作系统和处理器只能使用有限数量的线程,所以在特定情况下,这些系统会使用协同式多线程技术。
执行系统利用线程将VI进行抢占式多任务化。然而,可用线程的数量是有限的。对于高度并行的应用程序,当可用线程忙的情况下,执行系统使用协同式多任务。操作系统也会在应用程序和其他任务之间处理抢占式多任务。
基本执行系统
基本执行系统维护一个活动任务队列。例如,如果有三个任务循环并行运行,任何给定时间内一个任务在运行,另外两个任务将在队列中等待。假设所有任务有同等的优先级,一个任务在运行一段时间后,该任务被移动到队列的末尾,下一个任务将运行。当一个任务完成以后,执行系统将其从队列中移出。
执行系统通过调用VI生成的代码来运行队列中的第一个元素。有些时候,VI生成的代码检查执行系统是否分配了其他任务,如果没有,VI的代码才继续运行。
同步/封锁节点
程序框图上的一些节点或者项目是同步的,这意味着它们不能和其他节点进行多任务处理。在一个多线程应用程序中,这些节点或项目会独占线程直到任务完成。
控件引用或应用程序引用的属性节点和调用节点,甚至是控件引用的值属性,将与用户界面(UI)线程保持同步。因此,如果UI线程处于忙碌状态(如在图形中显示大量数据时),属性节点或调用节点将在UI线程完成其当前工作后才运行。
共享库调用同步运行的计算函数。多数分析VI和数据采集VI都包含共享库调用,同步运行。配置一个单独的非重入VI来调用共享库,以确保一个线程一次只调用一个非重入的共享库。如一个以上非重入VI调用某共享库,LabVIEW可能会返回非预期值。
其他节点几乎都是异步的。例如,结构、I/O函数、定时函数以及子VI都不是同步运行。
等待事件发生、定时、GPIB、VISA以及串口VI和函数将在不中断线程的情况下等待这些任务完成。任务完成以后,执行系统将这些任务从队列中移出,同时将其移到队列的末尾。例如,当用户单击三按钮对话框VI显示的对话框上的按钮时,执行系统会把这个任务放在队列的末尾。
死锁
当两个或多个任务因竞争相同的系统资源而使任务无法完成时,便发生了死锁。例如,两个应用程序需要同时打印文件时会发生死锁。第一个应用程序在线程1上运行,获取文件并将其锁定在它应用程序上。第二个应用程序在线程2上运行,对打印机执行同样的操作。在非抢占式环境中,操作系统不参与资源的占用和释放,两个应用程序都在等待另外一个释放资源,但是任何二者都不会释放已占用的资源。避免死锁的方法之一是将VI配置为以相同的顺序访问公共资源。
在执行系统中管理用户界面
执行系统除运行VI外,还必须调整与用户界面之间的交互操作。当单击按钮,移动窗口或者修改滑动杆控件的值时,执行系统管理这些操作并确保VI在后台继续运行。
单线程执行系统通过在响应用户交互和运行VI之间的来回切换实现多任务处理。执行系统检查是否有任何用户交互事件亟待处理,如果没有,执行系统将返回以运行VI或接受队列中的下一个任务。
当单击按钮或下拉菜单时,此行为可能会由于LabVIEW在后台运行VI而需过一段时间才完成。LabVIEW在响应与控件或菜单的交互和VI的运行之间来回切换。
LabVIEW中的执行系统
LabVIEW有6个多执行系统。选择文件»VI属性,然后在VI属性对话框中选择执行,可分配执行系统。有以下执行系统可供选择:
- 用户界面 - 处理用户界面。此行为在多线程应用程序和单线程应用程序中完全一致。VI在用户界面线程上运行,但执行系统在协同式多任务和用户界面事件响应之间轮流切换。
- 标准 - 用户界面在不同的线程上运行。
- 仪器I/O - 防止VISA、GPIB和串行I/O干扰其他VI。
- 数据采集 - 防止数据采集干扰其他VI。
- 其他1和其他2 - 当应用程序的任务需要独立的线程时,可采用该系统。
- 与调用方相同 - 对于子VI而言,将与调用该子VI的VI在同一个执行系统中运行。对于顶层VI,与调用方相同选项与标准优先级选项效果相同。
以上执行系统为那些必须独立运行的VI提供了大致的分区。默认状态下,VI在标准执行系统上运行。
在这些执行系统中,建议以任务的类型为仪器I/O和数据采集命名。I/O和数据采集可以在其他系统上工作,但是通过这些标签可划分应用程序并有助于理解其组织结构。
执行系统并不负责管理用户界面。如某个执行系统中的VI需更新控件,执行系统将该任务交给用户界面执行系统。把用户界面执行系统分配给带有数个属性节点的VI。
LabVIEW分配的线程与计算机上处理器的个数成正比。每一个线程处理一个任务。例如,如VI调用共享库,执行系统中将会有一个独立的线程继续运行其他VI。因为每个执行系统的线程数量有限,如线程繁忙,任务将一直处于就绪状态。
即使新创建的VI能在标准执行系统上运行无误,也可考虑其他执行系统。例如,如开发仪器驱动程序,可能需使用仪器I/O执行系统。
即使使用标准执行系统,用户界面仍然会被分配到它自己的线程。用户界面中的任何操作,如前面板的绘图、对鼠标点击的响应等等,都不会影响程序框图上代码的执行时间。同样,执行长期运算任务也不会妨碍用户界面响应、鼠标点击和键盘输入等。
具有多处理器的计算机能从多线程技术中获取更多益处。在单处理器计算机上,操作系统优先占用线程并给处理器上每个线程分配时间,在多处理器计算机上,不同处理器上的线程能同时运行,所以一个以上的行为能够同时发生。