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