中國船舶重工集團(tuán)公司第七一六研究所 崔 娟
一種VxWorks系統(tǒng)CPU利用率圖形化顯示方法的設(shè)計與實現(xiàn)
中國船舶重工集團(tuán)公司第七一六研究所 崔 娟
本文介紹了嵌入式VxWorks操作系統(tǒng)下一種CPU利用率圖形化的顯示方法。它利用系統(tǒng)輔助時鐘硬件提供的周期性中斷服務(wù),對系統(tǒng)中當(dāng)前現(xiàn)有任務(wù)的執(zhí)行時間進(jìn)行周期性抽樣,并基于WindML多媒體庫窗口系統(tǒng)的重繪機(jī)制,在預(yù)定義的網(wǎng)格化畫布中,將當(dāng)前時刻及其之前的所有采樣點用直線相連接,實時描繪出相應(yīng)曲線,為用戶在目標(biāo)機(jī)下提供CPU利用率的圖形化觀察手段,從而輔助系統(tǒng)運維人員方便地去診斷和解決VxWorks系統(tǒng)中存在的任務(wù)調(diào)度、性能瓶頸等問題。
VxWorks;輔助時鐘;CPU利用率;WindML窗口系統(tǒng)
VxWorks是美國風(fēng)河公司推出的在國防、工業(yè)、通信、醫(yī)療、航空、航天、物聯(lián)網(wǎng)等領(lǐng)域廣泛應(yīng)用的操作系統(tǒng),以高性能、高可靠、強實時等為其顯著特點[1]。
在嵌入式系統(tǒng)中,通常采用交叉方式進(jìn)行開發(fā)與調(diào)試,由主機(jī)端開發(fā)工具實現(xiàn)對目標(biāo)機(jī)的性能監(jiān)控[2]。在目標(biāo)機(jī)沒有特別方便的圖形化系統(tǒng)監(jiān)察手段,尤其運行態(tài)過程沒有開發(fā)機(jī)的情況下,很難通過圖形化手段觀察系統(tǒng)運行情況,因此本文針對此需求研究一種在WindML窗口系統(tǒng)下實時觀察VxWorks系統(tǒng)下CPU利用率的手段,為軟件開發(fā)人員診斷VxWorks系統(tǒng)中存在的任務(wù)調(diào)度問題,性能問題提供技術(shù)參考。
在VxWorks系統(tǒng)下,一個任務(wù)可以理解為一段程序的執(zhí)行,系統(tǒng)內(nèi)核通過TCB(Task Control Block)任務(wù)控制[3]塊來對每個任務(wù)當(dāng)前用到的CPU各相關(guān)寄存器的值、對應(yīng)的任務(wù)??臻g、任務(wù)優(yōu)先級等各類任務(wù)運維所需的信息進(jìn)行管理與控制。每個任務(wù)具有睡眠、就緒、運行、掛起、阻塞等狀態(tài)。
任務(wù)調(diào)度就是要由系統(tǒng)核心服務(wù)決定CPU當(dāng)前需要執(zhí)行哪個任務(wù)的代碼,而調(diào)度的核心就是需要設(shè)計一種調(diào)度算法來為就緒等待運行的任務(wù)分配CPU資源。VxWorks操作系統(tǒng)通常采用基于優(yōu)先級搶占式調(diào)度算法和Round-Robin輪轉(zhuǎn)調(diào)度算法[4]這兩類算法相結(jié)合的方式進(jìn)行多任務(wù)調(diào)度。
在一個多任務(wù)運行的生產(chǎn)環(huán)境下,應(yīng)用程序可以創(chuàng)建并生成多個獨立任務(wù)完成相關(guān)業(yè)務(wù),這可以使CPU利用率得到最優(yōu)發(fā)揮。VxWorks多任務(wù)Wind內(nèi)核[5]采用中斷機(jī)制來驅(qū)使調(diào)度器正常運轉(zhuǎn),實現(xiàn)較快的上下文切換和較低的中斷延遲。
WindML(Wind Media Library)風(fēng)河媒體庫是VxWorks系統(tǒng)下為用戶提供的一個用于開發(fā)GUI圖形用戶界面程序的框架系統(tǒng)。
WindML主要由驅(qū)動開發(fā)包和軟件開發(fā)包組成: DDK提供硬件驅(qū)動的開發(fā)標(biāo)準(zhǔn)接口庫,用戶可以開發(fā)顯卡、聲卡、操控等設(shè)備驅(qū)動程序,它是SDK 和硬件的中間層[6],SDK 用來開發(fā)應(yīng)用程序,在圖元、操控、音頻、字體、窗口管理及可視化控件等方面提供API。
CPU利用率其實就是運行的程序占用CPU資源的時間比例,表示機(jī)器在某個時間點的運行程序的情況。使用率越高,表明機(jī)器在這個時間上運行了很多程序,或者說程序比較耗CPU資源,反之較少。
目前有多種在嵌入式計算機(jī)操作系統(tǒng)中檢測CPU利用率的方法,嵌入式操作系統(tǒng)VxWorks中主要有兩種CPU占用率檢測的方法:
第一種:通過創(chuàng)建兩個特殊的任務(wù),一個優(yōu)先級最高和一個優(yōu)先級最低的任務(wù),在高優(yōu)先級任務(wù)中運行一個循環(huán)次數(shù)很大的循環(huán)代碼,用于占用所有的CPU時間,并記錄一段時間內(nèi)計數(shù)值;然后再設(shè)置一個優(yōu)先級別最低的任務(wù),當(dāng)所有任務(wù)都停止時CPU才會調(diào)度此任務(wù),此任務(wù)記下在無其他任務(wù)占用CPU的情況下的計數(shù)值,則CPU占用率=(total-idle)% total。
第二種:通過操作系統(tǒng)附帶的spy--Task activity monito[7],其利用輔助定時器產(chǎn)生中斷,并且內(nèi)核的任務(wù)控制塊TCB會為每個被調(diào)度的任務(wù)維護(hù)一個計數(shù)器。通過記下被中斷的任務(wù),并且將該任務(wù)的計數(shù)器不斷累加。經(jīng)過一段時間后,每個任務(wù)的計數(shù)器就真實反映該任務(wù)占用CPU的情況。spy利用抽樣技術(shù),得到的CPU利用率的準(zhǔn)確程度取決于任務(wù)的持續(xù)性和周期性。
以VxWorks6.9系統(tǒng)對應(yīng)的集成開發(fā)環(huán)境Workbench 3.3為例,說明spy工具的配置及使用方法。選擇鏡像工程的Kernel Conf i guration,進(jìn)入內(nèi)核組件編輯配置界面。按如下路徑依次點擊:
Hardware(default)àperipheralsàclocksàAux clock,右鍵包含該組件,如圖1所示為輔助時鐘組件已經(jīng)配置進(jìn)系統(tǒng)。
圖1 輔助時鐘組件配置
圖2 spy監(jiān)測工具配置
圖3 spy啟動后的周期性CPU利用率報告
按如下路徑依次點擊:
development tool componentsàspy,右鍵包含該組件,如圖2所示為spy監(jiān)聽工具組件已經(jīng)配置進(jìn)系統(tǒng),并且可支持最多200個任務(wù)對CPU占用的情況監(jiān)控。
配置并重新編譯VxWorks鏡像,便可以使用spy工具。在shell下輸入spy命令即可啟動實時監(jiān)控,圖3所示為某次監(jiān)控報告的摘要信息。
輸出的報告有兩列關(guān)鍵信息,分別描述如下:
total列信息反映了從啟動輔助時鐘和監(jiān)測任務(wù)開始后,每個任務(wù)的CPU活躍度
delta列信息反映了從上一次CPU利用率報告以來的CPU活躍度
spyLib庫提供spyCommon函數(shù),帶一函數(shù)指針參數(shù)。函數(shù)指針類型為(int)(*p)(char * fmtStr,…)??梢酝ㄟ^編寫自定義函數(shù)來間接獲取spy需要打印的數(shù)據(jù),spy調(diào)用該函數(shù)按行打印結(jié)果,可以不斷分析每一行字符串來得到需要的結(jié)果。
嵌入式VxWorks系統(tǒng)運行時CPU利用率圖形化顯示方法主要由三部分組成:(1)輔助時鐘中斷服務(wù);(2)周期采樣任務(wù),(3)圖形化顯示任務(wù)。
如圖4所示為它的總體結(jié)構(gòu)圖。
圖4 總體結(jié)構(gòu)圖
本工具提供了實時監(jiān)測任務(wù)占用CPU時間的控件類實現(xiàn)類的主接口spyCpuStatus會發(fā)起一個任務(wù)周期調(diào)用spyCpuReport來顯示每個任務(wù)、中斷、內(nèi)核、空閑分別消耗的CPU時間同時會顯示自輔助時鐘啟動開始以來的CPU時間總使用情況和兩次spyCpuReport之間相關(guān)使用情況的變化相關(guān)CPU占用時間數(shù)據(jù)由連接到輔助時鐘中斷的中斷級程序來收集。當(dāng)前該類控件還不能用在無輔助時鐘的CPU上。那些在輔助時鐘中斷級之上的中斷不能被監(jiān)測到
嵌入式VxWorks系統(tǒng)運行時CPU利用率圖形化顯示方法的設(shè)計主要包括以下幾個方面的關(guān)鍵技術(shù):
(1)初始化各類時間變量
在任務(wù)運行上下文、中斷程序運行上下文、空閑idle任務(wù)運行上下文、內(nèi)核態(tài)運行上下文,都需要獲取CPU資源來執(zhí)行,因此需要分別為這些情況定義相關(guān)的時間變量來統(tǒng)計各類情況下對CPU的時間占有計數(shù)。且需要分別為它們定義兩種類型的變量:統(tǒng)計自開始監(jiān)控以來的總時間;每兩次抽樣之間的時間累積變化。
同時需要獲取系統(tǒng)當(dāng)前所有的任務(wù)列表,并根據(jù)每個任務(wù)的TCB任務(wù)控制塊,將每個任務(wù)的運行時間統(tǒng)計變量tick值歸零。
(2)初始化輔助時鐘
掛接輔助時鐘中斷程序ISR該函數(shù)在輔助時鐘每產(chǎn)生一個滴答tick數(shù)的時候被調(diào)用,調(diào)用頻率為設(shè)置的輔助時鐘中斷頻率。ISR中斷服務(wù)程序主要用于統(tǒng)計中斷、內(nèi)核空閑、內(nèi)核時間、運行任務(wù)的tick計數(shù)的累加,亦即按如下情況進(jìn)行處理:
如果打斷一個中斷,則中斷tick數(shù)增加
如果打斷內(nèi)核運行,則內(nèi)核tick數(shù)增加
如果打斷空閑任務(wù),則空閑tick數(shù)增加
如果打斷就緒任務(wù),則任務(wù)tick數(shù)增加
以上各個tick都是輔助時鐘的tick,當(dāng)設(shè)置輔助時鐘頻率200時,則1個tick為1/200秒。
(3)周期性更新CPU利用率數(shù)據(jù)
一個優(yōu)先級為5的抽樣任務(wù),該任務(wù)調(diào)用頻率設(shè)置為每秒調(diào)用一次。該任務(wù)負(fù)責(zé)累加在兩次抽樣之間整個系統(tǒng)中“輔助時鐘中斷”+“所有的任務(wù)”+“內(nèi)核”+“中斷”+“空閑任務(wù)”占用CPU的總時間,每類時間的更新方法相同,描述如下:
首先將兩次抽樣之間某類型的時間增量spyCpu_XXX_Inc_Ticks臨時保存在臨時變量tmp_XXX_Inc_Ticks中;
隨后將spyCpu_XXX_Inc_Ticks清零,供輔助時鐘中斷繼續(xù)從頭累加;
然后將臨時保存的增量tmp_XXX_Inc_Ticks累加至總時間量spyCpu_XXX_Total_Ticks
亦即可以得出每次采樣點下的各類信息占用CPU的百分比之和,便可以給圖形化程序提供數(shù)據(jù)支撐。
(4)圖形控件的結(jié)構(gòu)定義
圖形化的關(guān)鍵,是利用WindML圖形系統(tǒng)下的窗口重繪函數(shù)進(jìn)行CPU利用率的實時繪制,需要在窗口內(nèi)部區(qū)域定義柵格,整個控件所需的數(shù)據(jù)結(jié)構(gòu)定義如下:
// 動態(tài)曲線框12條垂直線x坐標(biāo)值數(shù)組
// 動態(tài)曲線框每條垂直線左移的步進(jìn)索引
// 采樣值步進(jìn)的像素值
// 動態(tài)曲線框底框所同時容納的采樣點個數(shù)
// 已采樣的次數(shù)
// 所有采樣點的(x,y)坐標(biāo)
// 采樣CPU的周期(單位:秒)
(5)CPU利用率的實時繪制
每一個WindML圖形窗口,均有與其對應(yīng)的消息回調(diào)函數(shù)機(jī)制[8],通過調(diào)用winCreate標(biāo)準(zhǔn)API創(chuàng)建窗口時,注冊MGS_DRAW窗口重繪消息對應(yīng)的處理回調(diào)函數(shù),來實現(xiàn)對CPU利用率的繪制。以下為所需注冊的窗口回調(diào)函數(shù)表,其中cbWinDraw為窗口刷新重繪函數(shù)。
在窗口重繪函數(shù)中,根據(jù)采樣點的刷新頻率、每次刷新的步進(jìn)像素值等配置信息,利用WindML提供的以下uglXXX繪圖函數(shù):
通過圖形編程實時將采集到的數(shù)據(jù)繪制為曲線圖,窗口每次重繪的可視化邏輯流程圖見圖5。
圖5 CPU利用率曲線每次重繪的流程圖
圖6 WindML窗口下的CPU利用率繪制
通過定制修改spyLib庫,并集合WindML窗口系統(tǒng)重繪機(jī)制以及ugl繪圖函數(shù),最終實現(xiàn)了在VxWorks平臺下圖形化實時顯示CPU利用率的功能,效果如圖 6所示。
本文介紹了嵌入式VxWorks操作系統(tǒng)下的一種CPU利用率圖形化顯示方法。它采用系統(tǒng)輔助時鐘硬件提供的周期性中斷服務(wù),對系統(tǒng)中當(dāng)前所有運行的任務(wù)執(zhí)行時間進(jìn)行周期性抽樣,基于VxWorks系統(tǒng)的WindML多媒體圖形庫提供的窗口系統(tǒng),在從右往左移動的網(wǎng)格化畫布中,實時將當(dāng)前以及先前所有采樣點對應(yīng)的CPU利用率通過直連連接描繪,為用戶在目標(biāo)機(jī)下提供CPU利用率的圖形化觀察手段。該方法幫助嵌入式VxWorks系統(tǒng)開發(fā)人員更直觀、形象的了解目標(biāo)VxWorks的實時性能,以方便開發(fā)者監(jiān)測和分析診斷目標(biāo)操作系統(tǒng)運行以及執(zhí)行的應(yīng)用程序可能出現(xiàn)的各種問題。
本文給出了該方法的設(shè)計模型和一些核心技術(shù)的實現(xiàn)原理,完成了一個嵌入式VxWorks操作系統(tǒng)的CPU利用率分析工具的框架。但與Windows相比,無論從數(shù)據(jù)采集的靈活性和可配置性方面,還是對于可視化部分的自定義查看等靈活操作等方面都存在著一些差距,同時對于多核系統(tǒng)下的CPU利用率監(jiān)控,還需要進(jìn)一步的研究充實和完善。
[1]陳智育,溫彥軍,陳琪.VxWorks程序開發(fā)實踐[M].北京:人民郵電出版社,2004.
[2]孔祥營,張保山,俞烈彬.VxWorks驅(qū)動及分布式編程[M].北京:中國電力出版社,2007.
[3]王金剛,宮霄霖,楊錫勱.基于VxWorks的嵌入式實時系統(tǒng)設(shè)計[M].北京:清華大學(xué)出版社,2004.
[4]周啟平,張楊,吳瓊.VxWorks開發(fā)指南與Tornado實用手冊[M].北京:中國電力出版社,2004.
[5]曹桂平,張勇,王麗娜.VxWorks設(shè)備驅(qū)動開發(fā)詳解[M].北京:電子工業(yè)出版社,2011.
[6]練學(xué)輝,朱佳麗,喬大雷.基于WindML的圖形開發(fā)與應(yīng)用[J].雷達(dá)與對抗,2015,35(1):65-68.
[7]VxWorks Kernel Programmers Guide 6.9.USA: WindRiver Corporation,2015
[8]趙剛,張翀,江勇.計算機(jī)圖形顯示、加速及實現(xiàn)技術(shù)——基于VxWorks的嵌入式圖形系統(tǒng)開發(fā)實例[M].北京:電子工業(yè)出版社,2009.
Design and implementation of a graphical display method for CPU utilization of VxWorks system
Cui Juan
(Jiangsu Automation Research Institute,Lianyungang 222061,China)
This paper introduces a graphical display method of CPU utilization in embedded VxWorks operating system.Using periodic interrupt service which provided by system auxiliary clock hardware,periodic sampling of execution time in all running tasks.Based on the window system of WindML multimedia library,on the grid in the canvas,portrayed all the sampling points corresponding to CPU utilization value by directly connecting every point.The paper provides users with a graphical means of observation of CPU utilization in the target machine,easily helping operations engineer diagnose and solve the existing VxWorks system task scheduling problems,performance bottleneck issues etc..
VxWorks;Auxiliary Clock;CPU Utilization;WindML Windows System
崔娟(1982—),女,陜西延安人,碩士,高級工程師,主要研究方向為嵌入式操作系統(tǒng)、平臺軟件。