專利名稱:一種檢測多任務操作系統(tǒng)任務死循環(huán)的方法
技術領域:
本發(fā)明屬于多任務操作系統(tǒng)領域,具體涉及一種檢測多任務操作系統(tǒng)任務死循環(huán)的方法。
背景技術:
在計算機軟件系統(tǒng)中,基本上都采用了某種形式的多任務操作系統(tǒng),所有的應用和功能 都是通過任務承載,并在多任務協(xié)作下完成的。由于系統(tǒng)應用日益復雜,多任務操作系統(tǒng)的 任務數(shù)越來越多,任務的運行狀態(tài)在多任務的協(xié)作中起著越來越重要的作用,軟件在開發(fā)的 過程中,由于這樣那樣的原因,任務可能會發(fā)生死循環(huán),進而不能對其他的消息進行處理, 要是可以提供精確高效的任務監(jiān)控方法,就會大大利于研發(fā)人員的定位。
在目前的操作系統(tǒng)中,已有的死循環(huán)監(jiān)控的方法主要有兩類
一類是利用通訊調試系統(tǒng)提供的時鐘或啟動一個硬件定時器,定時器或時鐘的中斷服 務例程不斷的監(jiān)測各任務對各自消息的處理時間,判斷某任務超常時間運行或對某消息的處 理時間超過規(guī)定的閾值,就認為該任務發(fā)生了死循環(huán),然后將中斷上下文切換成任務上下文, 在系統(tǒng)的任務上下文中調讀調用棧函數(shù)并輸出。此方法的主要缺點是使用硬件定時器或時鐘, 需要額外的硬件資源,且只能針對有接受消息的任務進行檢測,具有較大局限性,代表性的
專利如CN02128400。
另一類是預先設置記錄操作基本信息的存儲單元,啟動一個檢測任務,每次檢測任務 設置的定時器超時,就會保存當前時間點之前最后執(zhí)行操作任務的標識到存儲單元里面,如 果某個任務的標識連續(xù)的出現(xiàn)在存儲單元里面,則認為該任務發(fā)生了死循環(huán),但是這是一種 采點的方法,準確性較低,且需要額外的存儲空間,代表性的專利如CN03121092。
發(fā)明內容
本發(fā)明的目的在于克服現(xiàn)有技術的不足,提供一種檢測多任務操作系統(tǒng)任務死循環(huán)的方 法。該方法在各任務入口函數(shù)循環(huán)體中嵌入插樁代碼,在高優(yōu)先級的監(jiān)測任務中通過判斷被監(jiān)測的任務的插樁值、任務運行狀態(tài)和總CPU占用率可以實時精確測量任務是否處于死循環(huán) 狀態(tài)。
為解決上述技術問題,本發(fā)明是通過以下技術方案實現(xiàn)的 一種檢測多任務操作系統(tǒng)任務死循環(huán)的方法,包括如下步驟
A. 在所有需要監(jiān)控的任務的循環(huán)體入口處嵌入插樁代碼,并預先規(guī)定需要監(jiān)控的任務 的死循環(huán)狀態(tài)的閾值和系統(tǒng)總CPU占有率的閾值;所述插樁代碼是將任務統(tǒng)計變量遞增的代 碼;
B. 設置高優(yōu)先級系統(tǒng)監(jiān)測任務,啟動并初始化;所述高優(yōu)先級系統(tǒng)監(jiān)測任務用于監(jiān)測 各需要監(jiān)控的任務的插樁值大小、插樁值是否變化、當前是否為運行狀態(tài)、系統(tǒng)總CPU占有 率是否超過預先規(guī)定的閾值;
C. 高優(yōu)先級系統(tǒng)監(jiān)測任務定時檢測各需要監(jiān)控的任務的插樁值;
D. 判斷各個需要監(jiān)控的任務是否發(fā)生了死循環(huán)在高優(yōu)先級系統(tǒng)監(jiān)測任務中,按從高 優(yōu)先級到低優(yōu)先級順序依次檢測各個需要監(jiān)控的任務,若需要監(jiān)控的任務滿足其插樁值不為 零,插樁值不變,當前為運行狀態(tài),且系統(tǒng)總CPU占有率超過預先規(guī)定的閾值四個條件,則 判定該需要監(jiān)控的任務處于第一狀態(tài)(即近似死循環(huán)狀態(tài)),若連續(xù)N次檢測都判定該需要 監(jiān)控的任務處于第一狀態(tài)且N小于等于預先規(guī)定的死循環(huán)狀態(tài)的閾值,則該需要監(jiān)控的任務 沒有發(fā)生死循環(huán),返回步驟C;若連續(xù)N次檢測都判定該需要監(jiān)控的任務處于第一狀態(tài)且N 大于預先規(guī)定的死循環(huán)狀態(tài)的閾值,則該需要監(jiān)控的任務發(fā)生了死循環(huán),進入步驟E;
E. 輸出死循環(huán)異常信息。
所述步驟D中,若需要監(jiān)控的任務不滿足所述的四個條件,則該需要監(jiān)控的任務未處于
第一狀態(tài),其處于第一狀態(tài)的次數(shù)清零,返回步驟c。
所述步驟B中,若系統(tǒng)不是通過高優(yōu)先級的監(jiān)測任務來統(tǒng)計CPU占用率,則所述設置高 優(yōu)先級系統(tǒng)監(jiān)測任務是創(chuàng)建一個高優(yōu)先級系統(tǒng)監(jiān)測任務;若系統(tǒng)是通過高優(yōu)先級的監(jiān)測任務 來統(tǒng)計CPU占用率,則所述設置高優(yōu)先級系統(tǒng)監(jiān)測任務是將判斷死循環(huán)的插樁代碼附加到 CPU占有率的統(tǒng)計方法的監(jiān)測任務中,和CPU占有率統(tǒng)計同步進行。
所述步驟A中插樁代碼對于不同的需要監(jiān)控的任務其代碼是一樣的。
進一步地,所述插樁代碼是宏。
使用本發(fā)明的檢測多任務操作系統(tǒng)任務死循環(huán)的方法具有以下有益效果本發(fā)明方法通 過在所有需要監(jiān)控的任務的循環(huán)體入口處嵌入插樁代碼,不僅準確可靠、高效,而且實現(xiàn)方
4法簡單;如果系統(tǒng)是通過高優(yōu)先級的監(jiān)測任務來統(tǒng)計CPU占用率,可以將判斷死循環(huán)的插樁 代碼附加到CPU占有率的統(tǒng)計方法的監(jiān)測任務中,和CPU占有率統(tǒng)計同步進行,這樣可以 極大的利用系統(tǒng)資源,插樁代碼可以定義成宏,只需要在任務循環(huán)體的入口處嵌入該宏就可 以了,實現(xiàn)起來較為靈活。
圖l是本發(fā)明方法的流程圖。
具體實施例方式
為了更好地理解本發(fā)明,下面結合附圖和具體實施例對本發(fā)明作進一步地描述。 在多任務操作系統(tǒng)中,考慮到每個任務都包含有一個循環(huán)體,每次由系統(tǒng)內核重新調度 該任務時,都會重新執(zhí)行循環(huán)體中的代碼,如果在循環(huán)體的入口處添加一個統(tǒng)計變量,每執(zhí) 行一次,值遞增,這樣每次重新調度執(zhí)行該任務時,統(tǒng)計變量的值就會遞增。如果該任務發(fā) 生死循環(huán)了,由于該任務一直在運行狀態(tài),那么統(tǒng)計變量的值則在開始發(fā)生死循環(huán)開始就一 直保持不變了,利用任務實體的這個特性就可以用來檢測任務是否發(fā)生了死循環(huán)。如果判斷 任務的統(tǒng)計變量值不為零且統(tǒng)計變量值不變的時間超過了預先規(guī)定的閾值,就說明了任務執(zhí) 行過,且沒有重新被調度。但是還不能斷定是不是發(fā)生死循環(huán),因為也有可能是被切換到別 的任務了,所以需要附加判斷該任務當前是否為運行狀態(tài),且系統(tǒng)總CPU占有率超過預先規(guī)
定的閾值來認定任務發(fā)生了死循環(huán),這樣可以確保任務一直在運行狀態(tài)中且沒有切換出去過, 從而準確的判斷發(fā)生了死循環(huán)。
插樁代碼其實就是將一個任務統(tǒng)計變量遞增的代碼,代碼本身非常簡單,且對不同的需 要監(jiān)控的任務也是相同的,可以定義成宏,由于代碼的位置固定在任務的循環(huán)體入口處,所 以稱之為插樁代碼。
3G系統(tǒng)由多個嵌入式系統(tǒng)組成,這里以其中一個單板嵌入式系統(tǒng)為例說明,這個系統(tǒng)使 用PPC755 CPU和VXWORKS操作系統(tǒng)。
請參閱圖1,先將插樁宏TASKDEADLOOP一CALL加入到所有需要監(jiān)測任務死循環(huán)的任 務while循環(huán)體的第一條語句之前,使用VXWORKS操作系統(tǒng)TCB的保留字段spare4來保 存插樁值,TASKDEADLOOP—CALL宏定義為 #define TASKDEADLOOP—CALL {取當前任務TCB;
將TCB中預留字段spare4數(shù)值遞增。
然后設置高優(yōu)先級系統(tǒng)監(jiān)測任務,可創(chuàng)建一個優(yōu)先級30的定時監(jiān)測任務,如果系統(tǒng)是通 過高優(yōu)先級的監(jiān)測任務來統(tǒng)計CPU占用率,則不必創(chuàng)建此任務,可以直接利用己經創(chuàng)建的任 務,和統(tǒng)計CPU占有率同步進行,在任務while循環(huán)之前初始化中將各需要監(jiān)控任務TCB的 預留字段spare4清零,將判定各任務處于第一狀態(tài)(即近似死循環(huán)狀態(tài))的次數(shù)N清零,并 將監(jiān)測任務調用taskDelay (2*8£0^0丁0丁1(:10設置兩秒定時延時;在任務中作以下處理
1) 通過系統(tǒng)調用taskldListGet獲取當前系統(tǒng)活動任務列表aiTaskldList[TaskNum], TaskNum為當前系統(tǒng)活動任務個數(shù);
2) 將aiTaskldList中任務按優(yōu)先級按高到低順序排列,設當前系統(tǒng)活動任務列表序號i=0, 開始遍歷各個任務,轉到3);
3) 同時判斷以下四個條件是否都成立,如果成立,那就表明任務處于第一狀態(tài)(即近似 死循環(huán)狀態(tài)),轉入4),否則轉入7);
任務i的插樁值不為零;
任務i的插樁值和上次檢測時候值一樣;
任務i當前為運行狀態(tài);
系統(tǒng)總CPU占用率超過預先規(guī)定的閾值;
4) N++,如果N大于規(guī)定的閾值,則判定該任務發(fā)生了死循環(huán),轉入5),否則轉入6);
5) 輸出死循環(huán)任務相關信息,調試或復位系統(tǒng);
6) i++,如果i等于TaskNum,轉入8),否則轉入3);
7) N=0,轉8);
8) 結束,等待下一次調度。
以上所述僅為本發(fā)明的較佳實施例,并不用以限制本發(fā)明,應當指出,對于本領域的普 通技術人員來說,凡是本發(fā)明的精神和原則之內所作的任何修改、等同替換或改進等,均應 包含在本發(fā)明的保護范圍之內。
權利要求
1.一種檢測多任務操作系統(tǒng)任務死循環(huán)的方法,其特征在于,包括如下步驟A.在所有需要監(jiān)控的任務的循環(huán)體入口處嵌入插樁代碼,并預先規(guī)定需要監(jiān)控的任務的死循環(huán)狀態(tài)的閾值和系統(tǒng)總CPU占有率的閾值;所述插樁代碼是將任務統(tǒng)計變量遞增的代碼;B.設置高優(yōu)先級系統(tǒng)監(jiān)測任務,啟動并初始化;所述高優(yōu)先級系統(tǒng)監(jiān)測任務用于監(jiān)測各需要監(jiān)控的任務的插樁值大小、插樁值是否變化、當前是否為運行狀態(tài)、系統(tǒng)總CPU占有率是否超過預先規(guī)定的閾值;C.高優(yōu)先級系統(tǒng)監(jiān)測任務定時檢測各需要監(jiān)控的任務的插樁值;D.判斷各個需要監(jiān)控的任務是否發(fā)生了死循環(huán)在高優(yōu)先級系統(tǒng)監(jiān)測任務中,按從高優(yōu)先級到低優(yōu)先級順序依次檢測各個需要監(jiān)控的任務,若需要監(jiān)控的任務滿足其插樁值不為零,插樁值不變,當前為運行狀態(tài),且系統(tǒng)總CPU占有率超過預先規(guī)定的閾值四個條件,則判定該需要監(jiān)控的任務處于第一狀態(tài),若連續(xù)N次檢測都判定該需要監(jiān)控的任務處于第一狀態(tài)且N小于等于預先規(guī)定的死循環(huán)狀態(tài)的閾值,則該需要監(jiān)控的任務沒有發(fā)生死循環(huán),返回步驟C;若連續(xù)N次檢測都判定該需要監(jiān)控的任務處于第一狀態(tài)且N大于預先規(guī)定的死循環(huán)狀態(tài)的閾值,則該需要監(jiān)控的任務發(fā)生了死循環(huán),進入步驟E;E.輸出死循環(huán)異常信息。
2. 根據(jù)權利要求1所述的檢測多任務操作系統(tǒng)任務死循環(huán)的方法,其特征在于,所述步 驟D中,若需要監(jiān)控的任務不滿足所述的四個條件,則該需要監(jiān)控的任務未處于第一狀態(tài), 其處于第一狀態(tài)的次數(shù)清零,返回步驟C。
3. 根據(jù)權利要求1或2所述的檢測多任務操作系統(tǒng)任務死循環(huán)的方法,其特征在于,所 述步驟B中,若系統(tǒng)不是通過高優(yōu)先級的監(jiān)測任務來統(tǒng)計CPU占用率,則所述設置高優(yōu)先級 系統(tǒng)監(jiān)測任務是創(chuàng)建一個高優(yōu)先級系統(tǒng)監(jiān)測任務;若系統(tǒng)是通過高優(yōu)先級的監(jiān)測任務來統(tǒng)計 CPU占用率,則所述設置高優(yōu)先級系統(tǒng)監(jiān)測任務是將判斷死循環(huán)的插樁代碼附加到CPU占有 率的統(tǒng)計方法的監(jiān)測任務中,和CPU占有率統(tǒng)計同步進行。
4. 根據(jù)權利要求3所述的檢測多任務操作系統(tǒng)任務死循環(huán)的方法,其特征在于,所述步 驟A中插樁代碼對于不同的需要監(jiān)控的任務其代碼是一樣的。
5. 根據(jù)權利要求4所述的檢測多任務操作系統(tǒng)任務死循環(huán)的方法,其特征在于,所述插 樁代碼是宏。
全文摘要
本發(fā)明公開了一種檢測多任務操作系統(tǒng)任務死循環(huán)的方法。該方法在各任務入口函數(shù)循環(huán)體中嵌入插樁代碼,在高優(yōu)先級的監(jiān)測任務中通過判斷被監(jiān)測的任務的插樁值、任務運行狀態(tài)和總CPU占用率,實時精確測量任務是否處于死循環(huán)狀態(tài)。本方法通過在所有需要監(jiān)控的任務的循環(huán)體入口處嵌入插樁代碼,不僅準確可靠、高效,而且實現(xiàn)方法簡單;如果系統(tǒng)是通過高優(yōu)先級的監(jiān)測任務來統(tǒng)計CPU占用率,可以將判斷死循環(huán)的插樁代碼附加到CPU占有率的統(tǒng)計方法的監(jiān)測任務中,和CPU占有率統(tǒng)計同步進行,這樣可以極大的利用系統(tǒng)資源,插樁代碼可以定義成宏,只需要在任務循環(huán)體的入口處嵌入該宏就可以了,實現(xiàn)起來較為靈活。
文檔編號G06F11/36GK101561778SQ20081006664
公開日2009年10月21日 申請日期2008年4月15日 優(yōu)先權日2008年4月15日
發(fā)明者通 廖 申請人:中興通訊股份有限公司