胡曉峰,張亮紅,劉文怡*,王紅亮(1.中北大學(xué)電子測(cè)試技術(shù)國(guó)家重點(diǎn)實(shí)驗(yàn)室,太原030051;2.中北大學(xué)儀器科學(xué)與動(dòng)態(tài)測(cè)試教育部重點(diǎn)實(shí)驗(yàn)室,太原030051)
VC多線程流水線在數(shù)據(jù)存儲(chǔ)系統(tǒng)中的設(shè)計(jì)與實(shí)現(xiàn)*
胡曉峰1,2,張亮紅1,2,劉文怡1,2*,王紅亮1,2
(1.中北大學(xué)電子測(cè)試技術(shù)國(guó)家重點(diǎn)實(shí)驗(yàn)室,太原030051;2.中北大學(xué)儀器科學(xué)與動(dòng)態(tài)測(cè)試教育部重點(diǎn)實(shí)驗(yàn)室,太原030051)
在航天測(cè)試領(lǐng)域,為分析測(cè)試系統(tǒng)的狀態(tài)和變化情況,經(jīng)常需要采集、處理并存儲(chǔ)狀態(tài)數(shù)據(jù)。針對(duì)狀態(tài)數(shù)據(jù)量大、分析處理復(fù)雜、存儲(chǔ)速度慢等問(wèn)題,基于VisualC++編程,采用多線程、流水線、分塊存取的方式,設(shè)計(jì)數(shù)據(jù)存儲(chǔ)系統(tǒng)軟件,實(shí)現(xiàn)快速循環(huán)讀取數(shù)據(jù)、實(shí)時(shí)處理顯示數(shù)據(jù),并保存數(shù)據(jù)至文件,該實(shí)現(xiàn)方法避免了數(shù)據(jù)的丟失、程序的阻塞,并對(duì)數(shù)據(jù)進(jìn)行實(shí)時(shí)、直觀地分析處理。經(jīng)測(cè)試,系統(tǒng)讀取數(shù)據(jù)、處理數(shù)據(jù)以及存儲(chǔ)數(shù)據(jù)的整體速度達(dá)400Mbyte/s以上。
大數(shù)據(jù);多線程;流水線;實(shí)時(shí)處理
在各類工業(yè)控制、工程測(cè)試領(lǐng)域中經(jīng)常需要采集、傳輸、存儲(chǔ)、處理大量數(shù)據(jù)[1]。例如,在航天測(cè)試領(lǐng)域的各類振動(dòng)、電壓、沖擊、緩變、溫度、速變、高速圖像、液位等數(shù)據(jù),其具有采樣率高、采集時(shí)間長(zhǎng)、數(shù)據(jù)量大等特點(diǎn)。為分析各種狀態(tài)數(shù)據(jù),需要對(duì)采集數(shù)據(jù)進(jìn)行實(shí)時(shí)處理并顯示,為達(dá)到多次使用數(shù)據(jù)的目的,需將數(shù)據(jù)進(jìn)行存儲(chǔ),。
軟件系統(tǒng)處理任務(wù)較多,運(yùn)算量大且具實(shí)時(shí)性[2],故采用多線程實(shí)現(xiàn)并發(fā)執(zhí)行。目前,軟件系統(tǒng)針對(duì)數(shù)據(jù)讀取、處理、存儲(chǔ)處理方案主要有兩種,第1種,采用單線程,在單個(gè)線程里順序執(zhí)行數(shù)據(jù)操作,該方法操作簡(jiǎn)單,但操作時(shí)間長(zhǎng),只適合采集速度慢、處理簡(jiǎn)單的數(shù)據(jù)存儲(chǔ)系統(tǒng)[3]。第2種,采用多線程,將數(shù)據(jù)操作分別在讀線程、處理線程、存儲(chǔ)線程中完成,并采用臨界區(qū)的方法解決各線程間的同步問(wèn)題,此方案在處理速度上較第1種方案快,但處理復(fù)雜,容易出現(xiàn)程序阻塞等問(wèn)題[4-5]。結(jié)合以上兩種方案,本系統(tǒng)采用多線程、流水線方法實(shí)現(xiàn)單個(gè)線程內(nèi)數(shù)據(jù)操作順序執(zhí)行,多個(gè)線程之間以流水線形式并行執(zhí)行。
本系統(tǒng)是基于VC++實(shí)現(xiàn)的數(shù)據(jù)存儲(chǔ)系統(tǒng),其系統(tǒng)組成框圖如圖1所示,系統(tǒng)通過(guò)PCI_E接口接收采集系統(tǒng)采集的數(shù)據(jù),單次數(shù)據(jù)傳輸量為8M單位。以用戶界面線程作為主線程,響應(yīng)用戶操作,顯示數(shù)據(jù)圖形,并通過(guò)3個(gè)工作者線程完成對(duì)數(shù)據(jù)的讀取、處理、存儲(chǔ),為避免數(shù)據(jù)混亂,將不同線程接收的數(shù)據(jù)存儲(chǔ)在不同的文件中。
圖1 系統(tǒng)組成框圖
2.1多線程簡(jiǎn)介
MFC應(yīng)用程序中的線程有兩種類型:用戶界面線程(User-interface thread)和工作者線程(Worker thread)。用戶界面線程負(fù)責(zé)處理用戶輸入、響應(yīng)用戶及系統(tǒng)所產(chǎn)生的事件和消息等。工作者線程通常用來(lái)執(zhí)行后臺(tái)計(jì)算和維護(hù)任務(wù)[6]。本系統(tǒng)根據(jù)兩種線程的不同特點(diǎn),將不同的任務(wù)分配給不同線程完成,實(shí)現(xiàn)數(shù)據(jù)的讀取、處理、存儲(chǔ)以及顯示。
在多線程應(yīng)用程序中,為是各線程協(xié)調(diào)一致的工作需采用線程同步。MFC提供了4種同步方法:臨界區(qū)(Critical Section)、信號(hào)燈(Semapore)、互斥量(Mutex)和事件(Event)[7]。本系統(tǒng)采用人工事件對(duì)象實(shí)現(xiàn)多線程間的通信。
2.2多線程流水線的應(yīng)用
由于數(shù)據(jù)采集時(shí)間長(zhǎng),數(shù)據(jù)總量遠(yuǎn)遠(yuǎn)大于內(nèi)存的總量,同時(shí)為實(shí)現(xiàn)數(shù)據(jù)處理的實(shí)時(shí)性,采取每次讀取8M單位大小的數(shù)據(jù)。又因數(shù)據(jù)操作主要包括讀取、處理、存儲(chǔ)三大操作階段,為充分利用CPU和I/ O資源,系統(tǒng)采用23個(gè)線程按流水線方式運(yùn)行。
本文采用Tr表示數(shù)據(jù)讀取耗時(shí),Td表示數(shù)據(jù)處理耗時(shí),Tw表示數(shù)據(jù)存儲(chǔ)時(shí)間,n表示數(shù)據(jù)塊的個(gè)數(shù)。若采用單線程總耗時(shí)T=n(Tr+Td+Tw)。最理想狀態(tài)為Tr≈Td≈Tw,多線程流水線示意圖如圖2所示,總耗時(shí)T=(n+2)Tr。
圖2 多線程流水線示意圖
通常情況下,Tr、Td、和Tw并不相等。例如在本系統(tǒng)中,由于數(shù)據(jù)的讀取通過(guò)PCI_E接口耗時(shí)較短,數(shù)據(jù)處理需進(jìn)行頻譜分析所以耗時(shí)較長(zhǎng),三者耗時(shí)排序?yàn)門r<Tw<Td。為防止線程之間爭(zhēng)奪資源,發(fā)生沖突,所以多線程流水線必須滿足以以下規(guī)則:
①第2個(gè)線程的第K次讀數(shù)據(jù)必須在第1個(gè)線程的第K個(gè)讀數(shù)據(jù)結(jié)束之后開(kāi)始;
②第3個(gè)線程的第K次讀數(shù)據(jù)必須在第2個(gè)線程的第K個(gè)讀數(shù)據(jù)結(jié)束之后開(kāi)始;
③第1個(gè)線程的第K次讀數(shù)據(jù)必須在第3個(gè)線程的第K-1個(gè)讀數(shù)據(jù)結(jié)束之后開(kāi)始。為此,采用事件對(duì)象實(shí)現(xiàn)線程間的同步。事件允許在一個(gè)線程工作時(shí),喚醒和啟動(dòng)另一個(gè)線程。每個(gè)事件對(duì)象都有兩種狀態(tài):有信號(hào)和無(wú)信號(hào)狀態(tài)[8]。通過(guò)調(diào)用SetEvent()函數(shù)設(shè)置事件對(duì)象為有信號(hào)狀態(tài),調(diào)用ResetEvent()函數(shù)設(shè)置事件對(duì)象為無(wú)信號(hào)狀態(tài),并調(diào)用WaitForSingleObject()函數(shù)和WaitForMultiObjects()函數(shù)檢測(cè)事件的狀態(tài)。線程啟動(dòng)流程序如圖3所示。當(dāng)啟動(dòng)程序是主線程啟動(dòng),應(yīng)用程序界面運(yùn)行,當(dāng)用戶點(diǎn)擊啟動(dòng)數(shù)據(jù)存儲(chǔ)操作時(shí),主線程創(chuàng)建并啟動(dòng)線程1、線程2、線程3,但除線程1處理喚醒狀態(tài)外,其他2個(gè)線程處于未喚醒狀態(tài)。
圖3 線程啟動(dòng)流程
圖4所示為線程1內(nèi)具體流程。其中event3_1為線程 1監(jiān)測(cè)事件,由線程 3喚醒;event1_2為線程 2監(jiān)測(cè)事件,由線程 1喚醒;event2_3為線程3監(jiān)測(cè)事件,由線程2喚醒。
圖4 線程1工作流程圖
如圖4啟動(dòng)線程1后,先判斷是否首次執(zhí)行線程函數(shù)體,若不是,則調(diào)用WaitForSingleObject()函數(shù)等待event3_1為激活態(tài),當(dāng)event3_1激活時(shí)則讀取PCI_E數(shù)據(jù),否則繼續(xù)等待;當(dāng)首次執(zhí)行線程函數(shù)體時(shí),則讀取 PCI_E數(shù)據(jù)。讀取完P(guān)CI_E數(shù)據(jù)后,設(shè)置event3_1為非激活狀態(tài),并激活event1_2,然后進(jìn)行數(shù)據(jù)處理,將數(shù)據(jù)處理后的數(shù)據(jù)由主線程以圖形形式顯示出來(lái),最后將數(shù)據(jù)保存至文件。當(dāng)函數(shù)體執(zhí)行完成后判斷線程是否結(jié)束,若結(jié)束則終止線程,反之循環(huán)執(zhí)行。線程2和線程3的執(zhí)行流程除沒(méi)有判斷是否首次執(zhí)行函數(shù)體外,基本與線程1一致。
2.3對(duì)比分析
經(jīng)過(guò)充分測(cè)試,多線程流水線處理數(shù)據(jù)的讀取、處理、存儲(chǔ)的速度有明顯提高,采用該方法能進(jìn)一步提高程序執(zhí)行效率。表1列出了單線程、原始多線程(創(chuàng)建讀數(shù)據(jù)線程、處理數(shù)據(jù)線程、存儲(chǔ)數(shù)據(jù)線程)、多線程流水線對(duì)不同數(shù)據(jù)總量所需的時(shí)間與數(shù)據(jù)總量的關(guān)系具體數(shù)據(jù)會(huì)因計(jì)算機(jī)、數(shù)據(jù)處理過(guò)程等的不同而不同。從表中可以看出,采用多線程流水線操作數(shù)據(jù)的速度最快,相對(duì)于單線程的操縱速度,該方法將操作時(shí)間縮短了30%左右,且隨著數(shù)據(jù)總量的增加,縮短時(shí)間百分比有所提高。由此可見(jiàn),多線程流水線對(duì)大容量數(shù)據(jù)操作具有重要意義。
表1 3種方法處理時(shí)間與記錄數(shù)據(jù)的關(guān)系比較
本系統(tǒng)使用Microsoft Visual Studio 2012設(shè)計(jì)了“數(shù)據(jù)存儲(chǔ)軟件”,其界面效果如圖5所示。
圖5 數(shù)據(jù)存儲(chǔ)軟件界面
圖5中最上一欄為對(duì)設(shè)備的打開(kāi)、關(guān)閉以及初始化操作、記錄觸發(fā)信息配置、啟動(dòng)停止記錄操作、選擇文件存儲(chǔ)位置等。其中選擇的文件路徑為線程1文件路徑,線程2和線程3的文件路徑根據(jù)所選路徑自動(dòng)生成。中間一欄為數(shù)據(jù)顯示欄,將數(shù)據(jù)經(jīng)過(guò)處理后以圖形的形式顯示。最底層為狀態(tài)信息顯示欄,將程序運(yùn)行中的速度信息、錯(cuò)誤信息等進(jìn)行顯示。
數(shù)據(jù)的實(shí)時(shí)采集、處理、存儲(chǔ),并實(shí)時(shí)動(dòng)態(tài)的顯示是數(shù)據(jù)存儲(chǔ)系統(tǒng)的基本環(huán)節(jié)。本文的主要工作在于:基于MFC圖像編程與VC多線程編程,利用Microsoft Visual Stdio 2012設(shè)計(jì)了一種數(shù)據(jù)存儲(chǔ)軟件,并著力提高數(shù)據(jù)操作效率,為解決此問(wèn)題,本文采用多線程流水線的處理方法,并采用人工事件對(duì)象解決各線程間的同步問(wèn)題,充分利用CPU的空閑時(shí)間,提高數(shù)據(jù)記錄速率。該方法較單線程和傳統(tǒng)多線程方法都有所提高,時(shí)間較單線程縮短30%左右,并隨著記錄數(shù)據(jù)的增加縮短時(shí)間百分比有所提高。
[1] 馬志剛,劉文儀.航天測(cè)試系統(tǒng)大容量數(shù)據(jù)曲線繪制方法的研究[J].圖學(xué)學(xué)報(bào),2014,35(4):623-629.
[2] 馬濤,汶德勝,陳學(xué)飛,等.基于USB 2.0攝像頭的目標(biāo)跟蹤平臺(tái)實(shí)現(xiàn)[J].電子器件,2008,31(3):926-930.
[3] 張瑜.數(shù)據(jù)采集系統(tǒng)的軟件設(shè)計(jì)[D].西安:西安電子科技大學(xué),2014.
[4] 王世強(qiáng),曹英,王宏.基于多線程的肌電信號(hào)實(shí)時(shí)采集與分析系統(tǒng)[J].儀器儀表學(xué)報(bào),2006,27(6):1300-1301.
[5] 郭峰,龍兵.多線程同步技術(shù)在邏輯分析儀軟件開(kāi)發(fā)中的應(yīng)用[J].電子測(cè)量技術(shù),2011,34(11):48-54.
[6] 趙曉平,張令彌,羅光坤.VC多線程編程在動(dòng)態(tài)測(cè)試系統(tǒng)中的實(shí)現(xiàn)[C]//2007年第九屆全國(guó)振動(dòng)理論及應(yīng)用學(xué)術(shù)會(huì)議論文集,杭州,2007:121-127.
[7] 孟昭榮,江立輝,胡興偉,等.基于VC多線程的實(shí)時(shí)數(shù)據(jù)采集系統(tǒng)[J].艦船防化,2008(2):44-47.
[8] 龍華.基于多線程圖像處理機(jī)測(cè)試系統(tǒng)的研究[D].華中科技大學(xué),2011.
胡曉峰(1990-),男,漢族,山西臨汾人,中北大學(xué)碩士生,研究領(lǐng)域?yàn)闇y(cè)試計(jì)量技術(shù)及儀器,huxiaofeng88@163.com;
張亮紅(1990-),女,漢族,湖南益陽(yáng)人,中北大學(xué)碩士生,研究領(lǐng)域?yàn)闇y(cè)試計(jì)量技術(shù)及儀器,1056459843@qq.com;
劉文怡(1970-),男,漢族,山西嵐縣人,中北大學(xué),教授,研究領(lǐng)域?yàn)闇y(cè)試計(jì)量技術(shù)及儀器,liuwenyi@nuc.edu.cn;
王紅亮(1978-),男,漢族,河南林州人,中北大學(xué),副教授,研究領(lǐng)域?yàn)闇y(cè)試計(jì)量技術(shù)及儀器,wanghongliang@nuc.edu.cn。
Design and Implementation of Data Storage System Based on VC Multithreading and Pipelining*
HU Xiaofeng1,2,ZHANG Lianghong1,2,LIU Wenyi1,2*,WANG Hongliang1,2
(1.Science and Technology on Electronic Test&Measurement Laboratory,Noah Uniυersity ofChina,Taiyuan 030051,China;2.Ministry of Education Key laboratory of Instrumentation Science&Dynamic Measurement,Noah Uniυersity of China,Taiyuan 030051,China)
In the field ofaerospace test,for analyzing the status and change situation of testsystem,we often need to collect,process and store data.Aiming at large data,complex analysis and processing,slow storage,based on visual c++programming,multithreading,pipelining,block access were used to design the storage system software.This system can read data circularly and quickly,can real-time processand display the data,and it can save the data to a file.Thismethod avoids losing data and blocking program successfully.After testing,the reading speed and processing,storing data of the system aremore than 400Mbyte/s.
large data;multithreading;pipelining;real-time processing
TP311.521
A
1005-9490(2016)04-0964-04
項(xiàng)目來(lái)源:國(guó)家自然科學(xué)基金重點(diǎn)項(xiàng)目(51275491)
2015-05-20修改日期:2015-06-28
EEACC:762010.3969/j.issn.1005-9490.2016.04.040