專利名稱:嵌入式linux系統(tǒng)用戶態(tài)任務獨占的監(jiān)測定位方法
技術領域:
本發(fā)明涉及嵌入式系統(tǒng),具體涉及嵌入式Iinux系統(tǒng)用戶態(tài)任務獨占的監(jiān)測定位方法。
背景技術:
嵌入式Iinux系統(tǒng)是將日益流行的Linux操作系統(tǒng)進行裁剪修改,使之能在嵌入式計算機系統(tǒng)上運行的一種操作系統(tǒng)。它繼承了 Linux的開放源代碼資源的優(yōu)點,又具有嵌入式操作系統(tǒng)的特性,因此,性能優(yōu)異、軟件移植容易、實時性能和穩(wěn)定性、安全性好,使用嵌入式Iinux系統(tǒng)開發(fā)新產品周期短,如今已被廣泛的應用于工業(yè)制造、過程控制、通訊、儀器、儀表、汽車、船舶、航空、航天、軍事裝備、消費類產品等眾多領域。Linux支持多任務(進程),通過進程調度進行調度管理。但是,如果某一個任務在 執(zhí)行過程中進入死循環(huán)或者始終等待其他資源,則會長時間獨占CPU,從而導致整個系統(tǒng)死鎖,任何進程都無法運行。為此,嵌入式Iinux系統(tǒng)必須對用戶態(tài)任務獨占進行監(jiān)測,以確保系統(tǒng)正常運行。目前,嵌入式系統(tǒng)針對任務獨占監(jiān)測定位主要有以下兩種方法
第一種方法通過硬時鐘中斷實現(xiàn)。即在嵌入式軟件中啟動硬時鐘定時器,并在定時器的中斷服務例程中循環(huán)監(jiān)控系統(tǒng)中各任務的消息處理時間是否超過預定閥值,從而判斷是否有任務發(fā)生獨占,之后直接打印信息通知開發(fā)人員任務獨占或者向調試任務發(fā)送填充有獨占的任務標識的消息,在調試任務中獲取函數(shù)調用棧信息并輸出。第二種方法通過插樁代碼實現(xiàn)。即在系統(tǒng)中各任務循環(huán)體的入口處增加統(tǒng)計變量,每次系統(tǒng)調度時,該變量的值遞增;然后創(chuàng)建一個高優(yōu)先級的任務,循環(huán)遍歷被監(jiān)控的任務,當任務連續(xù)N次出現(xiàn)統(tǒng)計變量值不為零、統(tǒng)計變量值不變的時間超過規(guī)定的閥值、CPU占用率超過閥值且任務處于運行狀態(tài),則判定任務發(fā)生獨占,之后輸出獨占的異常信肩、O第一種方法有如下主要弊端首先,要求嵌入式系統(tǒng)必須具有硬時鐘中斷功能,而嵌入式LINUX系統(tǒng)在用戶態(tài)下不存在硬時鐘中斷功能;其次,對監(jiān)測的任務具有局限性,只能監(jiān)測到具有處理消息功能的任務。第二種方法有如下主要弊端首先,任務統(tǒng)計變量如果需要在每次調度的時候遞增,則需要在系統(tǒng)調度時設置,而不是在任務循環(huán)體入口處設置,這就需要修改內核調度代碼;其次,任務規(guī)格受限,需要循環(huán)遍歷系統(tǒng)中所有任務,對這些任務排序并監(jiān)測,當系統(tǒng)中任務較多時,該方法會占用較多資源,效率較低。由此可見,現(xiàn)有嵌入式系統(tǒng)針對任務獨占監(jiān)測定位的方法應用到嵌入式LINUX系統(tǒng)上時,存在較大的缺陷。
發(fā)明內容
為了解決上述技術問題,本發(fā)明所采用的技術方案是提供一種嵌入式Iinux系統(tǒng)用戶態(tài)任務獨占的監(jiān)測定位方法,包括以下步驟
在任務切換時,記錄正在運行的任務的ID和任務開始運行時的系統(tǒng)TICK ;
啟動高優(yōu)先級監(jiān)測任務循環(huán)監(jiān)測系統(tǒng)中正在運行的任務,計算任務運行時長,并根據任務的運行時長是否大于預先設定的閥值獲得該任務是否為獨占任務,如該任務為獨占任務,則向該任務發(fā)送控制信號,啟動獨占任務定位處理函數(shù),所述運行時長為任務當前時刻的系統(tǒng)TICK與任務開始運行時的系統(tǒng)TICK之間的差值;
根據所述控制信號啟動獨占任務定位處理函數(shù)獲取所述獨占任務的ID,并實時打印和保存所述獨占任務的任務名、上下文以及函數(shù)調用關系。在上述方法中,根據正在運行任務的任務屬性和連續(xù)兩次高優(yōu)先級監(jiān)測的任務是否發(fā)生任務切換,判斷該任務是搶占式任務還是非搶占式任務;如果該任務是搶占式任務,則執(zhí)行搶占式任務的獨占監(jiān)測;否則進行當前連續(xù)運行任務的獨占監(jiān)測。
在上述方法中,獨占任務定位處理函數(shù)和處理流程如下
根據所述獨占任務的ID,讀取/proc/目錄下與所述獨占任務對應的maps文件,獲取所述獨占任務對應的所有虛擬內存起始地址和終止地址;
根據Iinux內核封裝的上下文信息,獲取所述獨占任務的當前指令地址和函數(shù)調用?;担鶕斍爸噶畹刂泛蛢却嬗成湫畔?,獲得當前指令所在靜態(tài)或動態(tài)庫的文件名和當前指令相對庫文件的偏移地址;
根據函數(shù)調用時的入棧和出棧規(guī)律以及獲取到的函數(shù)調用?;?,逐級獲取每一層函數(shù)調用棧信息,并實時打印和保存當前任務的任務名、上下文以及函數(shù)調用關系。本發(fā)明,克服了需要操作系統(tǒng)提供硬時鐘中斷功能的限制,且不需要修改操作系統(tǒng)內核代碼,完全在用戶態(tài)下實現(xiàn)了任務獨占監(jiān)測,并通過提供多級函數(shù)調用棧信息,為精確定位任務獨占發(fā)生的位置提供多級調用函數(shù)名、源文件、行號等重要信息。
圖I為本發(fā)明提供的嵌入式Iinux系統(tǒng)用戶態(tài)任務獨占的監(jiān)測定位方法流程圖; 圖2為本發(fā)明中高優(yōu)先級監(jiān)測任務的一次處理流程。
具體實施例方式下面結合附圖對本發(fā)明作出詳細的說明。本發(fā)明提出的嵌入式Iinux系統(tǒng)用戶態(tài)任務獨占的監(jiān)測定位方法,首先設定如下多個參數(shù)變量
(1)定義并初始化用于記錄任務獨占環(huán)境的數(shù)組變量,數(shù)組中每一個元素用于記錄一次任務獨占時的環(huán)境信息,包括獨占任務的ID、任務名、任務開始TICK、任務總運行時長、堆棧中函數(shù)調用關系等;
(2)定義并初始化描述當前任務狀態(tài)的結構變量,包括任務ID,任務開始TICK,任務運行時長;
(3)定義并初始化描述待監(jiān)測的搶占式任務的結構變量,包括任務ID,任務開始TICK,任務運行時長,是否進行任務獨占監(jiān)測標識;
(4)定義任務獨占的閥值,包括搶占式任務閥值Al和非搶占式任務閥值A2。
(5)定義可靠信號SIG_M0N0P0LY,用于啟動獨占任務的定位處理函數(shù)。請參見圖1,本發(fā)明提供的嵌入式Iinux系統(tǒng)用戶態(tài)任務獨占的監(jiān)測定位方法包括以下步驟
步驟I :在任務切換時,根據新切換任務的屬性以及連續(xù)兩次監(jiān)測是否發(fā)生任務切換,判斷該任務是搶占式任務還是非搶占式任務;當任務為非搶占式任務時,設置描述當前任務狀態(tài)的結構變量的任務ID為該任務,并設置該任務的開始運行的TICK為當前系統(tǒng)TICK ;否則設置描述待監(jiān)測的搶占式任務的結構變量的任務ID為該任務ID,任務開始運行TICK為當前系統(tǒng)TICK,并設置是否進行任務獨占監(jiān)測的標識為TRUE。步驟2 :創(chuàng)建并啟動高優(yōu)先級監(jiān)測任務,循環(huán)監(jiān)測系統(tǒng)中正在運行的任務,根據被監(jiān)測任務當前時刻的系統(tǒng)TICK與任務開始運行時的系統(tǒng)TICK之間的差值,計算當前被監(jiān)測的任務運行時長,并根據任務的運行時長是否大于預先設定的閥值獲得該任務是否為獨占任務,如該任務為獨占任務,則調用pthread_kill接口向該任務發(fā)送控制信號SIG_MONOPOLY,啟動獨占任務定位處理函數(shù)。 步驟3 :通過獨占任務定位處理函數(shù),即信號SIG_M0N0P0LY的信號處理函數(shù),在該函數(shù)內獲取當前獨占任務ID,并實時打印和保存所述獨占任務的任務名、上下文以及函數(shù)調用關系,重置描述當前任務狀態(tài)的結構變量中任務的開始運行TICK為當前TICK。在系統(tǒng)退出時,保存記錄的系統(tǒng)任務獨占環(huán)境信息到存儲介質,可以方便離線查詢和定位。本發(fā)明在步驟I中,首先根據任務的屬性判斷該任務是搶占式任務還是非搶占式任務,其目的在于(1)為搶占式任務和非搶占式任務分別設置不同的任務運行時長閥值;
(2)如果已經檢測到有搶占式任務獨占,則高優(yōu)先級監(jiān)測任務不會再循環(huán)監(jiān)測系統(tǒng)中所有任務是否發(fā)生搶占式獨占,提高系統(tǒng)監(jiān)測效率。在步驟2中,高優(yōu)先級監(jiān)測任務的一次處理流程如圖2所示,根據搶占式任務和非搶占式任務分為兩部分當前連續(xù)運行的任務獨占監(jiān)測和搶占式任務獨占監(jiān)測。連續(xù)運行的任務獨占監(jiān)測的具體實現(xiàn)步驟如下
步驟S201 :根據當前任務在監(jiān)測發(fā)生時的系統(tǒng)TICK與任務開始運行的系統(tǒng)TICK之間的差值,獲得當前任務連續(xù)運行的運行時長。步驟S202 :判斷運行時長是否大于預先設定的閥值A2。若大于預先設定的閥值A2,則表示發(fā)生了獨占;否則,跳轉至搶占式任務的獨占監(jiān)測。步驟S203 :從描述系統(tǒng)任務獨占環(huán)境的數(shù)組變量中獲取用于記錄本次獨占信息的數(shù)組索引,保存當前任務ID、任務名、任務開始運行TICK和任務總運行TICK。步驟S204 :向當前任務發(fā)送控制信號SIG_M0N0P0LY,啟動獨占任務定位處理函數(shù)。搶占式任務的獨占監(jiān)測的具體實現(xiàn)步驟如下
步驟S301 :根據待監(jiān)測的搶占式任務的結構變量中是否進行任務獨占監(jiān)測標識,判斷待監(jiān)測的搶占式任務是否需要進行獨占式監(jiān)測,若需要,則執(zhí)行步驟S302,否則,跳至步驟S304。步驟S302 :判斷搶占式任務運行時長是否大于預先設定的閥值Al,若大于預先設定的閥值Al,則表示發(fā)生獨占,執(zhí)行步驟S303 ;否則,跳至步驟S305 ;步驟S303 :從描述系統(tǒng)任務獨占環(huán)境的數(shù)組變量中獲取用于記錄本次獨占任務的數(shù)組索引,保存當前任務ID、任務名、任務開始運行TICK和運行時長。步驟S304 :向當前任務發(fā)送控制信號SIG_M0N0P0LY,啟動獨占任務定位處理函數(shù),并退出監(jiān)測任務。步驟S305 :設置下一輪待監(jiān)測的搶占式任務,重置待監(jiān)測的搶占式任務的結構變量為下一次系統(tǒng)監(jiān)測的任務。在步驟3中,獨占任務定位處理函數(shù)和處理流程如下
根據獨占任務的ID讀取/proc/目錄下與所述獨占任務對應的maps文件,獲取所述獨占任務對應的所有虛擬內存起始地址和終止地址;
根據Iinux內核封裝的上下文信息,獲取所述獨占任務的當前指令地址和函數(shù)調用棧 基值,根據當前指令地址和內存映射信息,獲得當前指令所在靜態(tài)或動態(tài)庫的文件名和當前指令相對庫文件的偏移地址;
根據函數(shù)調用時的入棧和出棧規(guī)律以及獲取到的函數(shù)調用?;?,逐級獲取每一層函數(shù)調用棧信息,并實時打印和保存當前任務的任務名、上下文以及函數(shù)調用關系。本發(fā)明不局限于上述最佳實施方式,任何人應該得知在本發(fā)明的啟示下作出的結構變化,凡是與本發(fā)明具有相同或相近的技術方案,均落入本發(fā)明的保護范圍之內。
權利要求
1.嵌入式Iinux系統(tǒng)用戶態(tài)任務獨占的監(jiān)測定位方法,其特征在于,包括以下步驟 在任務切換時,記錄正在運行的任務的ID和任務開始運行時系統(tǒng)TICK ;啟動高優(yōu)先級監(jiān)測任務循環(huán)監(jiān)測當前系統(tǒng)中正在運行的任務,計算任務運行時長,并根據任務的運行時長是否大于預先設定的閥值判斷該任務是否為獨占任務,如該任務為獨占任務,則向該獨占任務發(fā)送控制信號,所述運行時長為任務當前時刻的系統(tǒng)TICK與任務開始運行時的系統(tǒng)TICK之間的差值;根據所述控制信號啟動獨占任務定位處理函數(shù),獲取所述獨占任務的ID,并實時打印和保存所述獨占任務的任務名、上下文以及函數(shù)調用關系。
2.如權利要求I所述的嵌入式Iinux系統(tǒng)用戶態(tài)任務獨占的監(jiān)測定位方法,其特征在于,根據正在運行任務的任務屬性和連續(xù)兩次監(jiān)測是否發(fā)生任務切換,判斷該任務是搶占式任務還是非搶占式任務;如果該任務是搶占式任務,則執(zhí)行搶占式任務的獨占監(jiān)測;否則進行當前連續(xù)運行任務的獨占監(jiān)測。
3.如權利要求I所述的嵌入式Iinux系統(tǒng)用戶態(tài)任務獨占的監(jiān)測定位方法,其特征在于,獨占任務定位處理函數(shù)和處理流程如下根據所述獨占任務的ID讀取/proc/目錄下與所述獨占任務對應的maps文件,獲取所述獨占任務對應的所有虛擬內存起始地址和終止地址;根據信號處理函數(shù)輸入的上下文信息,獲取所述獨占任務的當前指令地址和函數(shù)調用?;?,根據當前指令地址和內存映射信息,獲得當前指令所在靜態(tài)或動態(tài)庫的文件名和當前指令相對庫文件的偏移地址;根據函數(shù)調用時的入棧和出棧規(guī)律以及獲取到的函數(shù)調用?;?,逐級獲取每一層函數(shù)調用棧信息,并實時打印和保存當前任務的任務名、上下文以及函數(shù)調用關系。
全文摘要
本發(fā)明公開了一種嵌入式linux系統(tǒng)用戶態(tài)任務獨占的監(jiān)測定位方法,包括以下步驟在任務切換時,記錄正在運行的任務的ID和任務開始運行時TICK;啟動高優(yōu)先級監(jiān)測任務循環(huán)監(jiān)測系統(tǒng)中正在運行的任務,并根據任務的運行時長是否大于預先設定的閥值獲得該任務是否為獨占任務,如該任務為獨占任務,則向該任務發(fā)送控制信號,啟動獨占任務定位處理函數(shù),獲取所述獨占任務的ID,并實時打印和保存所述獨占任務的任務名、上下文以及函數(shù)調用關系。本發(fā)明,克服了需要操作系統(tǒng)提供硬時鐘中斷功能的限制,且不需要修改操作系統(tǒng)內核代碼,完全在用戶態(tài)下實現(xiàn)了任務獨占監(jiān)測和定位。
文檔編號G06F11/34GK102929770SQ201210362848
公開日2013年2月13日 申請日期2012年9月25日 優(yōu)先權日2012年9月25日
發(fā)明者徐鑫, 劉應江, 劉昊, 簡楹, 楊紅霞 申請人:烽火通信科技股份有限公司