《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 測試測量 > 業(yè)界動(dòng)態(tài) > 基于LabVIEW的多線程編程技術(shù)比較研究

基于LabVIEW的多線程編程技術(shù)比較研究

2009-03-31
作者:張紅民1,2, 李曉峰2

  摘 要: 為了充分利用系統(tǒng)資源,提高數(shù)據(jù)采集系統(tǒng)的運(yùn)行效率,對(duì)LabVIEW編程框架下的數(shù)據(jù)采集系統(tǒng)進(jìn)行了模塊化分解。分別使用單線程技術(shù),隊(duì)列與集合相結(jié)合、僅使用隊(duì)列兩種多線程技術(shù)實(shí)現(xiàn)了系統(tǒng)主要功能,并對(duì)結(jié)果進(jìn)行了比較和分析。結(jié)果表明,與單線程相比,多線程編程技術(shù)能有效地縮短數(shù)據(jù)采集與分析時(shí)間,且僅使用隊(duì)列的多線程方案具有更高的執(zhí)行效率。
  關(guān)鍵詞: LabVIEW;多線程;隊(duì)列;集合

?

  LabVIEW是NI公司推出的一種基于圖形化編程語言的虛擬儀器開發(fā)平臺(tái),以其諸多的優(yōu)點(diǎn)得到了廣泛的認(rèn)可,是進(jìn)行虛擬儀器開發(fā)的強(qiáng)大軟件工具。LabVIEW在編程中引入了數(shù)據(jù)流的概念,程序嚴(yán)格按照數(shù)據(jù)流的方向順序執(zhí)行[1-2]。一個(gè)基本的數(shù)據(jù)采集系統(tǒng)框圖如圖1所示,主要包括數(shù)據(jù)采集、采集顯示(顯示1)、處理分析、分析顯示(顯示2)、結(jié)果存儲(chǔ)五個(gè)部分。如果采用單線程編程,則數(shù)據(jù)依次進(jìn)入各個(gè)模塊,后面的模塊必須等前面的模塊執(zhí)行完后才能開始執(zhí)行。當(dāng)用時(shí)較長的I/O操作模塊(如數(shù)據(jù)高速連續(xù)采集)在運(yùn)行時(shí),其他模塊等待時(shí)間較長,影響整個(gè)采集系統(tǒng)的實(shí)時(shí)性[3]。多線程技術(shù)是解決該問題的有效方法之一。本文根據(jù)LabVIEW的編程特點(diǎn),對(duì)數(shù)據(jù)流進(jìn)行分解,利用同步機(jī)制中的隊(duì)列與集合相結(jié)合及僅使用隊(duì)列兩種多線程編程技術(shù)對(duì)LabVIEW編程環(huán)境下的多線程編程技術(shù)進(jìn)行了研究,并從執(zhí)行效率上進(jìn)行比較和結(jié)果分析。

?

?

1 多線程技術(shù)及其LabVIEW編程
  進(jìn)程是應(yīng)用程序的運(yùn)行實(shí)例,而線程是進(jìn)程內(nèi)部的可獨(dú)立執(zhí)行的單元,是操作系統(tǒng)對(duì)系統(tǒng)資源的基本調(diào)度單位。同屬于一個(gè)進(jìn)程的所有線程都共享進(jìn)程的虛擬地址空間,線程之間可以共享進(jìn)程的全部數(shù)據(jù)和資源。
  多線程是指操作系統(tǒng)支持一個(gè)進(jìn)程中執(zhí)行多個(gè)線程的能力。采用多線程編程技術(shù),整個(gè)軟件程序含有完成不同功能的多個(gè)線程,如數(shù)據(jù)采集、實(shí)時(shí)數(shù)據(jù)和曲線顯示、數(shù)據(jù)處理與分析線程和用戶界面線程等。這樣,多個(gè)線程同時(shí)執(zhí)行,在一段時(shí)間內(nèi)并行完成多個(gè)任務(wù),既加快了系統(tǒng)的反應(yīng)速度,又提高了執(zhí)行效率[4-5]。在現(xiàn)代測控技術(shù)中,多線程編程技術(shù)常常是必須采用的技術(shù)。
1.1 多線程在LabVIEW中的實(shí)現(xiàn)
  LabVIEW圖形化編程語言與其他成熟的計(jì)算機(jī)編程語言相比有較大的差別,主要特點(diǎn)是它引入了數(shù)據(jù)流的概念,程序執(zhí)行過程中數(shù)據(jù)的流向、程序執(zhí)行的順序和方向都是可預(yù)見的[6]。然而,這種順序化執(zhí)行方式對(duì)多線程編程是不利的。因?yàn)楦鱾€(gè)線程并行運(yùn)行,同時(shí)還要共享進(jìn)程數(shù)據(jù),從左至右的數(shù)據(jù)流方式似乎是不太可能實(shí)現(xiàn)多個(gè)線程的并行運(yùn)行的。為了解決這個(gè)問題,LabVIEW采用將沒有直接數(shù)據(jù)連接的程序塊單獨(dú)創(chuàng)建一個(gè)線程,將各個(gè)模塊放在循環(huán)結(jié)構(gòu)中并行執(zhí)行而實(shí)現(xiàn)多線程,它是LabVIEW中創(chuàng)建多線程的一般方法。但是,創(chuàng)建了多個(gè)線程并不能保證它們能正確有序地運(yùn)行,而是需要在線程間傳遞和共享數(shù)據(jù),以及線程之間進(jìn)行同步與通信。
1.2 多線程間的通信
  LabVIEW中提供了局部變量與全局變量,可以用局部變量在兩個(gè)甚至多個(gè)線程間傳遞和共享數(shù)據(jù)。如對(duì)數(shù)據(jù)采集模塊的輸出設(shè)置一個(gè)寫局部變量,處理分析模塊設(shè)置一個(gè)讀局部變量,兩個(gè)模塊間沒有直接的數(shù)據(jù)連接,通過局部變量傳遞數(shù)據(jù),數(shù)據(jù)采集和處理分析兩個(gè)線程并行運(yùn)行。然而,這種數(shù)據(jù)傳遞方式是不安全的,若處理分析模塊運(yùn)行所需的時(shí)間比數(shù)據(jù)采集模塊要短,可能導(dǎo)致處理分析模塊對(duì)局部變量多次重復(fù)讀取,從而引起錯(cuò)誤的的數(shù)據(jù)分析結(jié)果,這顯然不是我們所期望的。
  在LabVIEW多線程程序設(shè)計(jì)的系統(tǒng)中,線程之間數(shù)據(jù)傳遞和共享、線程間的同步是實(shí)現(xiàn)多線程編程的關(guān)鍵。LabVIEW在Synchronization中提供通知(Notifier)、隊(duì)列(Queue)、旗語(Semaphore)、集合(Rendezvous)、事件(Occurrences)等函數(shù),以解決多線程間的數(shù)據(jù)傳遞和同步問題。
2 LabVIEW中線程編程技術(shù)比較
  將數(shù)據(jù)采集系統(tǒng)分解成如圖1的數(shù)據(jù)采集、采集顯示(顯示1)、處理分析、分析顯示(顯示2)、結(jié)果存儲(chǔ)這五個(gè)模塊,假設(shè)數(shù)據(jù)采集所需時(shí)間為60ms,處理分析為70ms,采集顯示和分析顯示均為30ms,結(jié)果存儲(chǔ)為100ms,數(shù)據(jù)采集和結(jié)果存儲(chǔ)VI的優(yōu)先級(jí)設(shè)置為高于正常,顯示VI設(shè)置成可重入,其他所有用戶子VI的執(zhí)行系統(tǒng)和優(yōu)先級(jí)都按默認(rèn)設(shè)置。連續(xù)運(yùn)行30次,每次采集正弦函數(shù)產(chǎn)生的150個(gè)點(diǎn)的數(shù)據(jù),分別用單線程、多線程方案來統(tǒng)計(jì)程序運(yùn)行的時(shí)間,然后對(duì)測試結(jié)果進(jìn)行分析和比較,以此來驗(yàn)證多線程編程技術(shù)的效果。
2.1 單線程實(shí)現(xiàn)
  單線程的實(shí)現(xiàn)就是程序按數(shù)據(jù)采集、采集顯示、處理分析、分析顯示、結(jié)果存儲(chǔ)的順序執(zhí)行,數(shù)據(jù)流從左至右依次流進(jìn)這幾個(gè)模塊,程序框圖如圖2所示。

2.2 隊(duì)列與集合實(shí)現(xiàn)
  可以肯定,采用單線程這種順序化的執(zhí)行方式效率較低,因?yàn)楦鱾€(gè)模塊都要等待數(shù)據(jù),不能并行執(zhí)行。對(duì)系統(tǒng)進(jìn)行分解,可以明顯看出,除了分成五個(gè)模塊外,已采集數(shù)據(jù)的采集顯示、處理分析可以并行執(zhí)行。同樣,處理分析后的數(shù)據(jù)也可以同時(shí)進(jìn)行分析顯示、結(jié)果存儲(chǔ)。這樣,系統(tǒng)就簡化成了三個(gè)部分和兩條主要的數(shù)據(jù)流,分別為數(shù)據(jù)采集到采集顯示、處理分析的數(shù)據(jù)流,處理分析后的數(shù)據(jù)到分析顯示、結(jié)果存儲(chǔ)的數(shù)據(jù)流。而且,這三部分之間傳遞的數(shù)據(jù)還是有序的,因此可以采用兩個(gè)隊(duì)列(Queue)來傳遞數(shù)據(jù)。而已采集數(shù)據(jù)的采集顯示、處理分析,處理分析后的分析顯示、結(jié)果存儲(chǔ)的并行執(zhí)行使用集合(Rendezvous)來實(shí)現(xiàn),具體的程序框圖如圖3所示。


  在數(shù)據(jù)采集模塊、處理分析模塊完成后讓輸出的數(shù)據(jù)分別進(jìn)入各自的隊(duì)列(Enqueue Element),同時(shí)創(chuàng)建集合(Rendezvous),已采集數(shù)據(jù)的采集顯示、處理分析,處理分析后的數(shù)據(jù)的分析顯示、結(jié)果存儲(chǔ)分別從兩個(gè)隊(duì)列中取出各自的數(shù)據(jù),只有當(dāng)?shù)却?Wait at Rendezvous)收到集合信號(hào)后同時(shí)執(zhí)行。
2.3 隊(duì)列實(shí)現(xiàn)
  若全部采用隊(duì)列來實(shí)現(xiàn)五個(gè)模塊的并行運(yùn)行和模塊間的數(shù)據(jù)傳遞、共享及模塊間的同步,這時(shí)會(huì)有四個(gè)數(shù)據(jù)隊(duì)列,分別為數(shù)據(jù)采集到采集顯示的隊(duì)列、采集顯示到處理分析的隊(duì)列、處理分析到分析顯示的隊(duì)列、分析顯示到結(jié)果存儲(chǔ)的隊(duì)列。除了結(jié)果存儲(chǔ)模塊外,各個(gè)模塊的輸出均進(jìn)入下一個(gè)隊(duì)列,而除了數(shù)據(jù)采集模塊外,各個(gè)模塊的輸入均來自上一個(gè)隊(duì)列(Dequeue Element),程序框圖如圖4所示。

3 試驗(yàn)結(jié)果與分析
  在Intel Pentium D CPU 3GHz,1GB內(nèi)存(DDR2 533),Windows XP SP2,LabVIEW7.1環(huán)境下運(yùn)行,單線程的運(yùn)行時(shí)間是8 792ms,同時(shí)使用隊(duì)列和集合實(shí)現(xiàn)的多線程方案的運(yùn)行時(shí)間是6 940ms,僅使用隊(duì)列實(shí)現(xiàn)的多線程方案的運(yùn)行時(shí)間為4 978ms。同時(shí)使用隊(duì)列和集合的方案運(yùn)行時(shí)間占單線程方案的78.9%,僅使用隊(duì)列的多線程方案運(yùn)行時(shí)間占單線程方案的56.6%。毫無疑問,使用多線程編程技術(shù)的確能有效地減少程序的執(zhí)行時(shí)間。但是,兩種方案實(shí)現(xiàn)的多線程效果有比較明顯的差異,同時(shí)使用隊(duì)列和集合的方案僅節(jié)約了20%左右的時(shí)間,而僅使用隊(duì)列的多線程方案節(jié)約了近50%的時(shí)間。
  分析和比較發(fā)現(xiàn):隊(duì)列加集合的方案雖然更符合人們編程的思維,但并沒有達(dá)到理想的效果,原因在于采集顯示模塊所需時(shí)間和處理分析模塊相差較大,兩者并行運(yùn)行的時(shí)間基本上取決于處理分析模塊所用的時(shí)間,只有在處理分析模塊運(yùn)行完成后才發(fā)出集合信號(hào),分析顯示模塊與結(jié)果存儲(chǔ)模塊才開始運(yùn)行。同理,分析顯示模塊和結(jié)果存儲(chǔ)模塊相比也是如此,兩者并行運(yùn)行的時(shí)間基本上取決于結(jié)果存儲(chǔ)模塊所用的時(shí)間。因此,處理分析與結(jié)果存儲(chǔ)這兩個(gè)最占用時(shí)間的模塊之間仍是串行運(yùn)行的。相比而言,僅采用隊(duì)列實(shí)現(xiàn)的多線程方案,四個(gè)隊(duì)列的首尾是相連的,當(dāng)一個(gè)數(shù)據(jù)進(jìn)入隊(duì)列后,馬上就可以通過隊(duì)列傳遞給其他的模塊,因此五個(gè)模塊都是并行運(yùn)行的,大大節(jié)約了整個(gè)系統(tǒng)執(zhí)行時(shí)間。由此可見,單線程的執(zhí)行時(shí)間基本上等于各個(gè)模塊的時(shí)間總和,僅采用隊(duì)列實(shí)現(xiàn)的多線程方案的執(zhí)行時(shí)間基本上由執(zhí)行時(shí)間最長的那個(gè)模塊決定。
  對(duì)于一個(gè)數(shù)據(jù)采集系統(tǒng),根據(jù)其任務(wù)功能恰當(dāng)?shù)胤纸獬蓭讉€(gè)獨(dú)立的模塊,利用多線程編程技術(shù),恰當(dāng)?shù)厥褂肔abVIEW同步機(jī)制中提供的函數(shù),尤其是隊(duì)列,可以有效地縮短系統(tǒng)整體的執(zhí)行時(shí)間,提高數(shù)據(jù)采集系統(tǒng)的時(shí)效性。在LabVIEW虛擬儀器平臺(tái)下,多線程編程技術(shù)比單線程更能有效地縮短數(shù)據(jù)采集、分析和存儲(chǔ)的時(shí)間,而且,僅使用隊(duì)列的多線程編程方式具有更高的執(zhí)行效率。

參考文獻(xiàn)
[1] 楊樂平,李海濤,趙勇,等.LabVIEW高級(jí)程序設(shè)計(jì)[M].北京:清華大學(xué)出版社,2003.
[2] ?高亞奎,支超有.多線程虛擬儀器測試軟件的開發(fā)[J].計(jì)算機(jī)測量與控制,2003,11(12):986-987.
[3] ?李成,丁天懷,傅志斌,等.可多線程測量的模擬鉆桿四分量力虛擬儀器[J].清華大學(xué)學(xué)報(bào)(自然科學(xué)版),2006,46(8):1414-1417.
[4] ?林康紅.基于LabVIEW的遠(yuǎn)程虛擬儀器多線程技術(shù)[J].自動(dòng)化儀表,2003,24(8):25-27.
[5] ?張靚,黃海于,張翠芳.基于Lab Windows/CVI多線程數(shù)據(jù)采集的研究與設(shè)計(jì)[J].中國儀器儀表,2005(8):72-76.
[6] ?蘇維嘉,李大琳.虛擬儀器設(shè)計(jì)中多線程技術(shù)的應(yīng)用[J].工業(yè)控制計(jì)算機(jī),2007(9):92-93.

本站內(nèi)容除特別聲明的原創(chuàng)文章之外,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,并不代表本網(wǎng)站贊同其觀點(diǎn)。轉(zhuǎn)載的所有的文章、圖片、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無法一一聯(lián)系確認(rèn)版權(quán)者。如涉及作品內(nèi)容、版權(quán)和其它問題,請(qǐng)及時(shí)通過電子郵件或電話通知我們,以便迅速采取適當(dāng)措施,避免給雙方造成不必要的經(jīng)濟(jì)損失。聯(lián)系電話:010-82306118;郵箱:aet@chinaaet.com。