一種任務異常的處理方法及裝置制造方法
【專利摘要】本發(fā)明實施例提供一種任務異常的處理方法及裝置,涉及計算機領域,能夠?qū)θ蝿盏漠惓_M行自動排錯處理,防止系統(tǒng)出現(xiàn)混亂或者崩潰,節(jié)約人力和物力。任務異常的處理方法用于處理器,包括:若當前任務的執(zhí)行時間大于預設執(zhí)行時間時,確定任務發(fā)生死循環(huán)異?;蛩梨i異常,當確定任務發(fā)生死鎖異常時,釋放任務占用的資源,繼續(xù)執(zhí)行任務,當確定任務發(fā)生死循環(huán)異常時,修改任務的循環(huán)體的代碼或修改任務的循環(huán)體中的數(shù)據(jù)變量的值,繼續(xù)執(zhí)行任務。本發(fā)明實施例用于任務異常的處理。
【專利說明】一種任務異常的處理方法及裝置
【技術領域】
[0001] 本發(fā)明涉及計算機【技術領域】,尤其涉及一種任務異常的處理方法及裝置。
【背景技術】
[0002] 操作系統(tǒng)(Operating System,OS)是管理和控制計算機硬件與軟件資源的計算機 程序。在操作系統(tǒng)中可以同時運行多個小的程序模塊,每一個程序模塊可以稱之為一個任 務。多個任務可以按照執(zhí)行的先后順序被添加到任務鏈表中,然后處理器按照任務在任務 鏈表中的先后位置順序執(zhí)行任務,在任務的運行過程中,可能由于一些不可預知的原因,執(zhí) 行了非法指令,導致該任務無法正常進行,進而引起系統(tǒng)出現(xiàn)混亂或者崩潰。
[0003] 出現(xiàn)異常的任務一般有兩種情況:死循環(huán)和死鎖。死循環(huán)指的是無法靠自身的控 制終止的循環(huán)。當一個任務在運行過程中,由于運行了一些非法指令,而使程序中的循環(huán)判 斷條件一直無法得到滿足,循環(huán)一直進行,這時就出現(xiàn)了死循環(huán)。死鎖指的是兩個或兩個以 上的任務在執(zhí)行過程中,因爭奪資源而造成的一種互相等待的現(xiàn)象,若無外部操作,它們都 將無法繼續(xù)運行下去,而處于一直等待的狀態(tài)。一般情況下,由于任務鏈表中的任務是順序 執(zhí)行的,如果一個任務出現(xiàn)死循環(huán)或者死鎖,將會導致后面的任務無法得到執(zhí)行,嚴重時可 能導致整個系統(tǒng)故障。
[0004] 現(xiàn)有技術中,當處理器當前執(zhí)行的任務出現(xiàn)異常時,處理器無法對該異常任務進 行自動排錯處理,而是會輸出針對該異常任務的調(diào)用棧信息,然后程序員會根據(jù)該異常任 務的調(diào)用棧信息對異常任務的出錯位置進行定位,并進行排錯處理,這樣會耗費較多的人 力物力。而且,當該異常任務較嚴重時,如果程序員無法對異常任務進行及時處理,可能會 導致系統(tǒng)出現(xiàn)混亂或者崩潰,進而導致處理器對系統(tǒng)進行重啟,影響正常任務的執(zhí)行。
【發(fā)明內(nèi)容】
[0005] 本發(fā)明的實施例提供一種任務異常的處理方法及裝置,能夠?qū)θ蝿盏漠惓_M行自 動排錯處理,防止系統(tǒng)出現(xiàn)混亂或者崩潰,節(jié)約人力和物力。
[0006] 為達到上述目的,本發(fā)明的實施例采用如下技術方案:
[0007] 本發(fā)明實施例一方面提供一種任務異常的處理方法,用于處理器,包括:
[0008] 若當前任務的執(zhí)行時間大于預設執(zhí)行時間時,確定所述任務發(fā)生死循環(huán)異?;蛩?鎖異常;
[0009] 當確定所述任務發(fā)生死鎖異常時,釋放所述任務占用的資源,繼續(xù)執(zhí)行所述任 務;
[0010] 當確定所述任務發(fā)生死循環(huán)異常時,修改所述任務的循環(huán)體的代碼或修改所述任 務的循環(huán)體中的數(shù)據(jù)變量的值,繼續(xù)執(zhí)行所述任務。
[0011] 可選的,在所述若當前任務的執(zhí)行時間大于預設執(zhí)行時間時,確定所述任務發(fā)生 死循環(huán)異?;蛩梨i異常之前,所述方法還包括:
[0012] 獲取所述任務的數(shù)據(jù)狀態(tài)信息,所述數(shù)據(jù)狀態(tài)信息包括至少兩個寄存器信息,所 述至少兩個寄存器信息為所述任務發(fā)生死循環(huán)異常或死鎖異常后,所述處理器繼續(xù)執(zhí)行所 述任務時,在第一預設時長中每隔第二預設時長記錄的所述處理器的寄存器狀態(tài)信息;
[0013] 所述若當前任務的執(zhí)行時間大于預設執(zhí)行時間時,確定所述任務發(fā)生死循環(huán)異常 或死鎖異常包括:
[0014] 若當前任務的執(zhí)行時間大于預設執(zhí)行時間時,根據(jù)所述數(shù)據(jù)狀態(tài)信息,確定所述 任務發(fā)生死循環(huán)異?;蛩梨i異常。
[0015] 可選的,所述若當前任務的執(zhí)行時間大于預設執(zhí)行時間時,根據(jù)所述數(shù)據(jù)狀態(tài)信 息,確定所述任務發(fā)生死循環(huán)異?;蛩梨i異常包括:
[0016] 若所述數(shù)據(jù)狀態(tài)信息中包括的至少兩個寄存器信息完全相同時,確定所述任務發(fā) 生死鎖異常;
[0017] 若所述數(shù)據(jù)狀態(tài)信息中包括的至少兩個寄存器信息不完全相同時,確定所述任務 發(fā)生死循環(huán)異常。
[0018] 可選的,在所述獲取所述任務的數(shù)據(jù)狀態(tài)信息之前,所述方法還包括:
[0019] 若當前任務的執(zhí)行時間大于預設執(zhí)行時間時,將所述任務從任務鏈表中刪除,并 添加到恢復鏈表中,所述恢復鏈表是用于存儲出現(xiàn)異常的任務的鏈表。
[0020] 可選的,所述當確定所述任務發(fā)生死鎖異常時,釋放所述任務占用的資源,繼續(xù)執(zhí) 行所述任務包括:
[0021] 當確定所述任務發(fā)生死鎖異常時,釋放所述任務占用的資源;
[0022] 第三預設時長后,在所述恢復鏈表中執(zhí)行所述任務;
[0023] 當所述任務沒有再次發(fā)生死鎖異常時,將所述任務從恢復鏈表中刪除,并重新添 加到任務鏈表中,繼續(xù)執(zhí)行所述任務;
[0024] 當所述任務再次發(fā)生死鎖異常時,再次釋放所述任務占用的資源,并且在所述第 三預設時長后,再次在所述恢復鏈表中執(zhí)行所述任務。
[0025] 可選的,所述當確定所述任務發(fā)生死循環(huán)異常時,修改所述任務的循環(huán)體的代碼 或修改所述任務的循環(huán)體中的數(shù)據(jù)變量的值,繼續(xù)執(zhí)行所述任務包括:
[0026] 當確定所述任務發(fā)生死循環(huán)異常時,根據(jù)所述任務的特征信息和監(jiān)控信息,判斷 所述任務的循環(huán)體的代碼是否出現(xiàn)錯誤;所述特征信息記錄了所述循環(huán)體的基準值和修正 值;所述基準值為所述循環(huán)體中數(shù)據(jù)變量的初始值;所述修正值為所述循環(huán)體滿足終止條 件時,所述循環(huán)體中數(shù)據(jù)變量的值;所述監(jiān)控信息記錄了所述任務的執(zhí)行過程中所述循環(huán) 體中的數(shù)據(jù)變量的值的變化信息;
[0027] 若所述任務的循環(huán)體的代碼出現(xiàn)錯誤,根據(jù)所述特征信息、所述監(jiān)控信息和所述 數(shù)據(jù)狀態(tài)信息,修改所述任務的循環(huán)體的代碼,得到修改后的任務;
[0028] 將所述修改后的任務從恢復鏈表中刪除,并添加到任務鏈表中,繼續(xù)執(zhí)行所述任 務;
[0029] 若所述任務的循環(huán)體的代碼未出現(xiàn)錯誤,根據(jù)所述數(shù)據(jù)狀態(tài)信息和所述特征信 息,修改所述任務的循環(huán)體中的數(shù)據(jù)變量的值,使得所述數(shù)據(jù)變量的值滿足所述循環(huán)體的 終止條件,得到修改后的任務;
[0030] 將所述修改后的任務從恢復鏈表中刪除,并添加到任務鏈表中,繼續(xù)執(zhí)行所述任 務。
[0031] 可選的,在所述將所述任務從任務鏈表中刪除,并添加到恢復鏈表中之前,所述方 法還包括:
[0032] 將所述任務添加到任務鏈表中;
[0033] 掃描所述任務的代碼,獲取所述任務的所述特征信息,所述特征信息還包括預設 執(zhí)行時間,所述預設執(zhí)行時間為所述任務的正常執(zhí)行時間;
[0034] 執(zhí)行所述任務;
[0035] 獲取所述任務的所述監(jiān)控信息和所述任務的執(zhí)行時間。
[0036] 本發(fā)明的實施例另一方面提供一種任務異常的處理裝置,包括:
[0037] 確定單元,用于若當前任務的執(zhí)行時間大于預設執(zhí)行時間時,確定所述任務發(fā)生 死循環(huán)異?;蛩梨i異常;
[0038] 第一處理單元,用于當所述確定單元確定所述任務發(fā)生死鎖異常時,釋放所述任 務占用的資源,繼續(xù)執(zhí)行所述任務;
[0039] 第二處理單元,用于當所述確定單元確定所述任務發(fā)生死循環(huán)異常時,修改所述 任務的循環(huán)體的代碼或修改所述任務的循環(huán)體中的數(shù)據(jù)變量的值,繼續(xù)執(zhí)行所述任務。
[0040] 可選的,所述任務異常的處理裝置還包括:
[0041] 獲取單元,用于獲取所述任務的數(shù)據(jù)狀態(tài)信息,所述數(shù)據(jù)狀態(tài)信息包括至少兩個 寄存器信息,所述至少兩個寄存器信息為所述任務發(fā)生死循環(huán)異?;蛩梨i異常后,所述處 理器繼續(xù)執(zhí)行所述任務時,在第一預設時長中每隔第二預設時長記錄的所述處理器的寄存 器狀態(tài)信息;
[0042] 所述確定單元具體用于:
[0043] 若當前任務的執(zhí)行時間大于預設執(zhí)行時間時,根據(jù)所述數(shù)據(jù)狀態(tài)信息,確定所述 任務發(fā)生死循環(huán)異常或死鎖異常。
[0044] 可選的,所述確定單元具體用于:
[0045] 若所述數(shù)據(jù)狀態(tài)信息中包括的至少兩個寄存器信息完全相同時,確定所述任務發(fā) 生死鎖異常;
[0046] 若所述數(shù)據(jù)狀態(tài)信息中包括的至少兩個寄存器信息不完全相同時,確定所述任務 發(fā)生死循環(huán)異常。
[0047] 可選的,所述任務異常的處理裝置還包括:
[0048] 添加單元,用于若當前任務的執(zhí)行時間大于預設執(zhí)行時間時,將所述任務從任務 鏈表中刪除,并添加到恢復鏈表中,所述恢復鏈表是用于存儲出現(xiàn)異常的任務的鏈表;
[0049] 可選的,所述第一處理單元具體用于:
[0050] 當確定所述任務發(fā)生死鎖異常時,釋放所述任務占用的資源;
[0051] 第三預設時長后,在所述恢復鏈表中執(zhí)行所述任務;
[0052] 當所述任務沒有再次發(fā)生死鎖異常時,將所述任務從恢復鏈表中刪除,并重新添 加到任務鏈表中,繼續(xù)執(zhí)行所述任務;
[0053] 當所述任務再次發(fā)生死鎖異常時,再次釋放所述任務占用的資源,并且在所述第 三預設時長后,再次在所述恢復鏈表中執(zhí)行所述任務。
[0054] 可選的,所述第二處理單元具體用于:
[0055] 當確定所述任務發(fā)生死循環(huán)異常時,根據(jù)所述任務的特征信息和監(jiān)控信息,判斷 所述任務的循環(huán)體的代碼是否出現(xiàn)錯誤;所述特征信息記錄了所述循環(huán)體的基準值和修正 值;所述基準值為所述循環(huán)體中數(shù)據(jù)變量的初始值;所述修正值為所述循環(huán)體滿足終止條 件時,所述循環(huán)體中數(shù)據(jù)變量的值;所述監(jiān)控信息記錄了所述任務的執(zhí)行過程中所述循環(huán) 體中的數(shù)據(jù)變量的值的變化信息;
[0056] 若所述任務的循環(huán)體的代碼出現(xiàn)錯誤,根據(jù)所述特征信息、所述監(jiān)控信息和所述 數(shù)據(jù)狀態(tài)信息,修改所述任務的循環(huán)體的代碼,得到修改后的任務;
[0057] 將所述修改后的任務從恢復鏈表中刪除,并添加到任務鏈表中,繼續(xù)執(zhí)行所述任 務;
[0058] 若所述任務的循環(huán)體的代碼未出現(xiàn)錯誤,根據(jù)所述數(shù)據(jù)狀態(tài)信息和所述特征信 息,修改所述任務的循環(huán)體中的數(shù)據(jù)變量的值,使得所述數(shù)據(jù)變量的值滿足所述循環(huán)體的 終止條件,得到修改后的任務;
[0059] 將所述修改后的任務從恢復鏈表中刪除,并添加到任務鏈表中,繼續(xù)執(zhí)行所述任 務。
[0060] 本發(fā)明實施例提供的任務異常的處理方法及裝置,用于處理器,包括:若當前任 務的執(zhí)行時間大于預設執(zhí)行時間時,確定任務發(fā)生死循環(huán)異?;蛩梨i異常,當確定任務發(fā) 生死鎖異常時,釋放任務占用的資源,繼續(xù)執(zhí)行任務,當確定任務發(fā)生死循環(huán)異常時,修改 任務的循環(huán)體的代碼或修改任務的循環(huán)體中的數(shù)據(jù)變量的值,繼續(xù)執(zhí)行任務。相較于現(xiàn)有 技術中需要程序員對出現(xiàn)異常的任務進行排錯處理,然后指示處理器繼續(xù)執(zhí)行處理后的任 務,本發(fā)明實施例提供的方案在確定任務發(fā)生死循環(huán)異?;蛩梨i異常后,處理器可以自動 的并且有針對性的對死循環(huán)異?;蛩梨i異常進行排錯處理,然后繼續(xù)執(zhí)行處理后的任務。 這樣不需要程序員的參與,就可以對發(fā)生死循環(huán)異常和死鎖異常的任務進行自動排錯處 理,從而防止了系統(tǒng)出現(xiàn)混亂或者崩潰,節(jié)約了人力和物力。
【專利附圖】
【附圖說明】
[0061] 為了更清楚地說明本發(fā)明實施例或現(xiàn)有技術中的技術方案,下面將對實施例或現(xiàn) 有技術描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本 發(fā)明的一些實施例,對于本領域普通技術人員來講,在不付出創(chuàng)造性勞動的前提下,還可以 根據(jù)這些附圖獲得其他的附圖。
[0062] 圖1為本發(fā)明實施例提供的一種任務異常的處理方法流程圖;
[0063] 圖2為本發(fā)明實施例提供的一種確定任務異常情況流程圖;
[0064] 圖3為本發(fā)明另一實施例提供的一種任務異常的處理方法流程圖;
[0065] 圖4為本發(fā)明實施例提供的一種任務異常的處理裝置框圖;
[0066] 圖5為本發(fā)明另一實施例提供的一種任務異常的處理裝置框圖;
[0067] 圖6為本發(fā)明又一實施例提供的一種任務異常的處理裝置框圖。
【具體實施方式】
[0068] 下面將結合本發(fā)明實施例中的附圖,對本發(fā)明實施例中的技術方案進行清楚、完 整地描述,顯然,所描述的實施例僅僅是本發(fā)明一部分實施例,而不是全部的實施例?;?本發(fā)明中的實施例,本領域普通技術人員在沒有做出創(chuàng)造性勞動前提下所獲得的所有其他 實施例,都屬于本發(fā)明保護的范圍。
[0069] 本發(fā)明實施例提供一種任務異常的處理方法,用于處理器,如圖1所示,所述方法 包括:
[0070] 步驟101、若當前任務的執(zhí)行時間大于預設執(zhí)行時間時,確定所述任務發(fā)生死循環(huán) 異?;蛩梨i異常。
[0071] 實際應用中,所述預設執(zhí)行時間可以根據(jù)具體情況進行設定,示例的,所述預設執(zhí) 行時間可以為任務正常執(zhí)行的時間,即正常情況下執(zhí)行完整個任務所需的時間。具體的,處 理器在執(zhí)行任務時,首先會將任務添加到任務鏈表中,然后掃描任務的整個代碼,并根據(jù)掃 描結果獲得正常情況下執(zhí)行完整個任務所需的時間,該時間即為預設執(zhí)行時間。
[0072] 在確認任務的執(zhí)行時間是否大于預設執(zhí)行時間時,若一個任務的預設執(zhí)行時間為 T1,當該任務在運行過程中的累計的執(zhí)行時間到達Tl時,該任務還沒有運行結束,則可知 該任務實際的執(zhí)行時間大于預設執(zhí)行時間,此時可以認為該任務出現(xiàn)異常,一般情況下,任 務發(fā)生異常有兩種情況:死循環(huán)異常和死鎖異常。死循環(huán)異常指的是任務中的循環(huán)體無法 靠自身的控制終止循環(huán)的現(xiàn)象。這種情況的出現(xiàn)一般是由于任務在執(zhí)行的過程中執(zhí)行了一 些非法指令,而導致程序中的循環(huán)判斷條件一直無法得到滿足。死鎖異常指的是兩個或兩 個以上的任務在執(zhí)行過程中,因爭奪資源而造成的一種互相等待的現(xiàn)象。示例的,當前有A 任務和B任務同時執(zhí)行,并且A任務和B任務都需要獲得資源C和資源D,此時A任務已經(jīng) 獲取了資源C,等待資源D,B任務已經(jīng)獲取了資源D,等待資源C,由于資源占用是互斥的,A 任務無法獲取資源D會一直等待,B任務無法獲取資源C也會一直等待,導致A任務和B任 務都無法繼續(xù)執(zhí)行下去,這時A任務和B任務陷入死鎖狀態(tài)。
[0073] 由于任務陷入死循環(huán)和陷入死鎖時的異常原理不同,所以與之對應的處理方法也 不同。在確認任務發(fā)生死鎖異常和死循環(huán)異常后,可以根據(jù)不同的情況對任務進行處理。
[0074] 步驟102、當確定任務發(fā)生死鎖異常時,釋放任務占用的資源,繼續(xù)執(zhí)行任務。
[0075] 當確定任務發(fā)生死鎖異常時,表示該任務執(zhí)行過程中所需資源被別的任務部分占 用或全部占用,并且該任務也可能占用了別的任務在執(zhí)行過程中所需的部分資源或全部資 源。由于一個任務在執(zhí)行完畢后會釋放掉之前獲取的全部資源,所以在相關任務都無法執(zhí) 行下去的情況下,該任務可以先釋放掉占用的資源,等待別的任務執(zhí)行完畢后,重新獲取該 任務在執(zhí)行過程中所需的全部資源,繼續(xù)執(zhí)行該任務。
[0076] 步驟103、當確定任務發(fā)生死循環(huán)異常時,修改任務的循環(huán)體的代碼或修改任務的 循環(huán)體中的數(shù)據(jù)變量的值,繼續(xù)執(zhí)行任務。
[0077] 當確定任務發(fā)生死循環(huán)異常時,可以根據(jù)在向任務鏈表添加任務的過程中記錄的 循環(huán)體的基準值和修正值,以及在任務鏈表中執(zhí)行任務的過程中記錄的數(shù)據(jù)變量的值的變 化信息,來綜合判斷任務的循環(huán)體的代碼是否出現(xiàn)錯誤,若發(fā)現(xiàn)代碼出錯,對出錯的代碼進 行修改;若未發(fā)現(xiàn)代碼出錯,利用數(shù)據(jù)變量的返回值和修正值對任務的循環(huán)體中的數(shù)據(jù)變 量的值進行修改,以滿足循環(huán)體的終止條件,跳出該循環(huán)體。
[0078] 這樣一來,相較于現(xiàn)有技術中需要程序員對出現(xiàn)異常的任務進行排錯處理,然后 指示處理器繼續(xù)執(zhí)行處理后的任務,本發(fā)明實施例提供的方案在確定任務發(fā)生死循環(huán)異 ?;蛩梨i異常后,處理器可以自動的并且有針對性的對死循環(huán)異?;蛩梨i異常進行排錯處 理,然后繼續(xù)執(zhí)行處理后的任務。這樣不需要程序員的參與,就可以對發(fā)生死循環(huán)異常和死 鎖異常的任務進行自動排錯處理,從而防止了系統(tǒng)出現(xiàn)混亂或者崩潰,節(jié)約了人力和物力。
[0079] 進一步的,在若當前任務的執(zhí)行時間大于預設執(zhí)行時間時,確定所述任務發(fā)生死 循環(huán)異?;蛩梨i異常之前,所述方法還包括:獲取任務的數(shù)據(jù)狀態(tài)信息,數(shù)據(jù)狀態(tài)信息包括 至少兩個寄存器信息,至少兩個寄存器信息為任務發(fā)生死循環(huán)異?;蛩梨i異常后,處理器 繼續(xù)執(zhí)行任務時,在第一預設時長中每隔第二預設時長記錄的處理器的寄存器狀態(tài)信息。
[0080] 若當前任務的執(zhí)行時間大于預設執(zhí)行時間時,確定任務發(fā)生死循環(huán)異?;蛩梨i異 常包括:若當前任務的執(zhí)行時間大于預設執(zhí)行時間時,根據(jù)數(shù)據(jù)狀態(tài)信息,確定任務發(fā)生死 循環(huán)異?;蛩梨i異常。
[0081] 需要說明的是,所述第一預設時長和所述第二預設時長都為預先設定的值。優(yōu)選 的,所述第一預設時長可以設置為所述任務中循環(huán)體的預設執(zhí)行時間的2或3倍,一般認為 這個時間段里所獲得的寄存器信息已經(jīng)記錄了任務中出錯處代碼的信息,即根據(jù)這個時間 段里所獲得的寄存器信息已經(jīng)能夠判斷出任務發(fā)生死循環(huán)異常還是死鎖異常。當然也可以 將第一預設時長設置為其它數(shù)值,本發(fā)明實施例對此不做限定,只要在第一預設時長里所 獲得的寄存器信息能夠確定任務發(fā)生死循環(huán)異常還是死鎖異常即可。優(yōu)選的,所述第二預 設時長可以設定為處理器的調(diào)度周期,一般處理器的調(diào)度周期為l〇ms。
[0082] 所述寄存器狀態(tài)信息一般包括PC (Program Counter,程序計數(shù)器)指針信息、數(shù) 據(jù)變量的返回值、數(shù)據(jù)變量的地址信息、上一行代碼的相關信息等。
[0083] 進一步的,若當前任務的執(zhí)行時間大于預設執(zhí)行時間時,根據(jù)數(shù)據(jù)狀態(tài)信息,確定 任務發(fā)生死循環(huán)異?;蛩梨i異常包括:若數(shù)據(jù)狀態(tài)信息中包括的至少兩個寄存器信息完全 相同時,確定任務發(fā)生死鎖異常;若數(shù)據(jù)狀態(tài)信息中包括的至少兩個寄存器信息不完全相 同時,確定任務發(fā)生死循環(huán)異常。
[0084] 由于一個程序發(fā)生死鎖異常時,表現(xiàn)為程序執(zhí)行到死鎖處時,代碼的運行停滯不 前,所以在第一預設時長中每隔第二預設時長記錄的多個處理器的寄存器狀態(tài)信息應該是 完全相同的。然而當一個程序發(fā)生死循環(huán)異常時,表現(xiàn)為程序一直在循環(huán)執(zhí)行,這時在第一 預設時長中每隔第二預設時長記錄的多個處理器的寄存器狀態(tài)信息不會完全相同,可能會 是PC指針信息、數(shù)據(jù)變量的返回值、數(shù)據(jù)變量的地址信息、上一行代碼的相關信息等中的 一個或者多個信息不相同,這樣根據(jù)所獲得的寄存器信息是否完全相同就可以確定任務發(fā) 生死循環(huán)異常還是死鎖異常。
[0085] 進一步的,在獲取所述任務的數(shù)據(jù)狀態(tài)信息之前,方法還包括:若當前任務的執(zhí)行 時間大于預設執(zhí)行時間時,將任務從任務鏈表中刪除,并添加到恢復鏈表中,恢復鏈表是用 于存儲出現(xiàn)異常的任務的鏈表。
[0086] 所述恢復鏈表為新創(chuàng)建的一個任務鏈表,用于存放出現(xiàn)異常的任務。當確定任務 發(fā)生死循環(huán)異?;蛩梨i異常后,有兩種處理方式,其一是在當前的任務鏈表中對出現(xiàn)異常 的任務進行排錯處理,其二是將任務從任務鏈表中刪除,并添加到恢復鏈表中,在恢復鏈表 對出現(xiàn)異常的任務進行排錯處理。雖然這兩種方式都是可行的,但是優(yōu)選的是后一種方式。 因為采用前一種方式,即在當前的任務鏈表中對出現(xiàn)異常的任務進行排錯處理,就必須等 到當前任務排錯處理成功且被正常執(zhí)行完畢后,任務鏈表中的后續(xù)任務才可以執(zhí)行,這樣 需要較長的等待時間,會影響處理器處理任務的效率。若采用后一種方式,創(chuàng)建一個恢復鏈 表,將出現(xiàn)異常的任務從當前的任務鏈表中刪除后,當前的任務鏈表中的后續(xù)任務就可以 正常執(zhí)行了,無需花費等待時間,這樣可以提高處理器處理任務的效率。
[0087] 進一步的,當確定任務發(fā)生死鎖異常時,釋放任務占用的資源,繼續(xù)執(zhí)行任務包 括:當確定任務發(fā)生死鎖異常時,釋放任務占用的資源;第三預設時長后,在恢復鏈表中執(zhí) 行任務;當任務沒有再次發(fā)生死鎖異常時,將任務從恢復鏈表中刪除,并重新添加到任務鏈 表中,繼續(xù)執(zhí)行任務;當任務再次發(fā)生死鎖異常時,再次釋放任務占用的資源,并且在第三 預設時長后,再次在恢復鏈表中執(zhí)行任務。
[0088] 進一步的,當確定任務發(fā)生死循環(huán)異常時,修改任務的循環(huán)體的代碼或修改任務 的循環(huán)體中的數(shù)據(jù)變量的值,繼續(xù)執(zhí)行任務包括:當確定任務發(fā)生死循環(huán)異常時,根據(jù)任務 的特征信息和監(jiān)控信息,判斷任務的循環(huán)體的代碼是否出現(xiàn)錯誤;特征信息記錄了循環(huán)體 的基準值和修正值;基準值為循環(huán)體中數(shù)據(jù)變量的初始值;修正值為循環(huán)體滿足終止條件 時,循環(huán)體中數(shù)據(jù)變量的值;監(jiān)控信息記錄了任務的執(zhí)行過程中循環(huán)體中的數(shù)據(jù)變量的值 的變化信息。
[0089] 若任務的循環(huán)體的代碼出現(xiàn)錯誤,根據(jù)特征信息、監(jiān)控信息和數(shù)據(jù)狀態(tài)信息,修改 任務的循環(huán)體的代碼,得到修改后的任務;將修改后的任務從恢復鏈表中刪除,并添加到任 務鏈表中,繼續(xù)執(zhí)行任務。
[0090] 若任務的循環(huán)體的代碼未出現(xiàn)錯誤,根據(jù)數(shù)據(jù)狀態(tài)信息和特征信息,修改任務的 循環(huán)體中的數(shù)據(jù)變量的值,使得數(shù)據(jù)變量的值滿足循環(huán)體的終止條件,得到修改后的任務。
[0091] 將修改后的任務從恢復鏈表中刪除,并添加到任務鏈表中,繼續(xù)執(zhí)行任務。
[0092] 當確定任務發(fā)生死循環(huán)異常時,可以根據(jù)特征信息中記錄的循環(huán)體的基準值和修 正值,以及監(jiān)控信息中記錄的數(shù)據(jù)變量的值的變化信息,來綜合判斷任務的循環(huán)體的代碼 是否出現(xiàn)錯誤,若發(fā)現(xiàn)代碼出錯,對出錯的代碼進行修改;若未發(fā)現(xiàn)代碼出錯,利用數(shù)據(jù)狀 態(tài)信息中的數(shù)據(jù)變量的返回值和特征信息中的修正值對任務的循環(huán)體中的數(shù)據(jù)變量的值 進行修改,以滿足循環(huán)體的終止條件,跳出該循環(huán)體。
[0093] 在實際應用中,還有可能存在既不屬于死鎖異常也不屬于死循環(huán)異常的情況,即 數(shù)據(jù)狀態(tài)信息不完全相同時,可能是死循環(huán)異常,也有可能是一些未知錯誤類型,在這種情 況下,我們還可以判斷當獲得的任務數(shù)據(jù)狀態(tài)信息不完全相同時,該任務是否發(fā)生死循環(huán) 異常。此時可以通過PC指針的地址信息進行判斷。具體方法為:首先獲取所有數(shù)據(jù)狀態(tài)信 息中的PC指針的地址,然后比較相鄰兩次PC指針的地址值的大小,若后一個PC指針的地 址值小于或者等于前一個PC指針的地址值,則可判斷出該任務發(fā)生死循環(huán)異常。原理為: 首先PC指針指向的是當前程序的運行點,它里面的值是當前程序的運行點的地址,一個程 序模塊中,從上往下代碼的PC指針的地址是遞增的,S卩如果程序一直往下運行,則PC指針 的地址應該是一直增大的,如果當后一個PC指針的地址值小于或者等于前一個PC指針的 地址值時,說明程序又回到了之前的代碼行進行了執(zhí)行,即程序進行了循環(huán)。進而可以確定 任務發(fā)生死循環(huán)異常。示例的,假設當前有5組數(shù)據(jù)狀態(tài)信息,首先獲取到這5組數(shù)據(jù)狀態(tài) 信息中的PC指針的地址,假設分別為{0002,0005,0009,0003,0007},然后分別比較獲取的 相鄰兩個PC指針的地址值的大小,由于PC指針的地址值0003小于PC指針的地址值0009, 所以可以判斷在代碼運行到PC指針的地址值為0003和PC指針的地址值為0009之間時,代 碼進行了一次循環(huán),進而說明該段代碼進行了循環(huán)執(zhí)行,此時可確定任務發(fā)生死循環(huán)異常。 [0094] 進一步的,在將任務從任務鏈表中刪除,并添加到恢復鏈表中之前,該方法還包 括:將任務添加到任務鏈表中;掃描任務的代碼,獲取任務的特征信息,所述特征信息還包 括預設執(zhí)行時間,所述預設執(zhí)行時間為任務的正常執(zhí)行時間;執(zhí)行任務;獲取任務的監(jiān)控 信息和任務的執(zhí)行時間。
[0095] 在實際應用中,由于操作系統(tǒng)中有很多任務,每個任務的優(yōu)先級不同,所以一般將 任務按照優(yōu)先級從高到低的順序添加到任務鏈表中,即優(yōu)先級高的任務添加到任務鏈表的 靠前部分,優(yōu)先級低的任務添加到任務鏈表的靠后部分,然后處理器順序執(zhí)行任務鏈表中 的任務即可。在將任務添加到任務鏈表的過程中,掃描任務的代碼,獲取任務的特征信息, 即記錄任務中每一個循環(huán)體的基準值和修正值,以及循環(huán)體中包含函數(shù)的權限信息等,所 述特征信息還包括預設執(zhí)行時間,所述預設執(zhí)行時間為任務的正常執(zhí)行時間。然后執(zhí)行所 述任務,獲取任務的監(jiān)控信息和任務的執(zhí)行時間,所述監(jiān)控信息為在執(zhí)行任務的過程中,記 錄的任務的數(shù)據(jù)變量的值的變化信息,以便之后利用特征信息和監(jiān)控信息找出程序中出錯 的代碼。所述任務的執(zhí)行時間為任務當前實際執(zhí)行時間。當任務當前的執(zhí)行時間大于預設 執(zhí)行時間時,說明該任務在預設執(zhí)行時間時沒有執(zhí)行完畢,此時可以確定該任務發(fā)生死鎖 異常或者死循環(huán)異常。
[0096] 在實際應用中,處理器還包括定時器,任務還設置有累計變量,任務未執(zhí)行時,累 計變量為〇,在任務的執(zhí)行過程中,定時器每發(fā)生一次中斷,累計變量加1,定時器的中斷時 間為處理器的調(diào)度周期。首先獲取任務的累計變量的值;然后判斷任務的累計變量的值是 否大于預設數(shù)值,所述預設數(shù)值為任務的預設執(zhí)行時間與中斷時間的比值;當任務的累計 變量大于預設數(shù)值時,確定任務發(fā)生死循環(huán)異?;蛩梨i異常。
[0097] 需要說明的是,所述定時器可以為硬件定時器,也可以為軟件定時器。由于硬件定 時器的可靠性更高,所以優(yōu)選的是硬件定時器,例如可以是看門狗定時器。定時器都設有中 斷模式,即每隔一個固定時間段發(fā)出一個信號,此信號稱為中斷信號,本發(fā)明實施例中采用 處理器的調(diào)度時間作為定時器的中斷時間。一般情況下,處理器的調(diào)度周期為l〇ms。
[0098] 累計變量可理解為一個計數(shù)變量,示例的,當定時器發(fā)生一次中斷,累計變量加1, 此時累計變量為1,說明此時任務已經(jīng)被執(zhí)行了 l〇ms,當定時器再發(fā)生一次中斷,累計變量 再次加1,此時累計變量為2,說明此時任務已經(jīng)被執(zhí)行了 20ms,由此可知,任務當前的執(zhí)行 時間為當前的累計變量值與定時器的中斷時間的乘積,而預設執(zhí)行時間為預設數(shù)值與定時 器的中斷時間的乘積。進而可知,當任務的累計變量大于預設數(shù)值時,確定任務發(fā)生死循環(huán) 異常或死鎖異常,也就是當任務當前的執(zhí)行時間大于預設執(zhí)行時間時,確定任務發(fā)生死循 環(huán)異?;蛩梨i異常。
[0099] 本發(fā)明實施例提供的任務異常的處理方法,用于處理器,包括:若當前任務的執(zhí)行 時間大于預設執(zhí)行時間時,確定任務發(fā)生死循環(huán)異?;蛩梨i異常,當確定任務發(fā)生死鎖異 常時,釋放任務占用的資源,繼續(xù)執(zhí)行任務,當確定任務發(fā)生死循環(huán)異常時,修改任務的循 環(huán)體的代碼或修改任務的循環(huán)體中的數(shù)據(jù)變量的值,繼續(xù)執(zhí)行任務。相較于現(xiàn)有技術中需 要程序員對出現(xiàn)異常的任務進行排錯處理,然后指示處理器繼續(xù)執(zhí)行處理后的任務,本發(fā) 明實施例提供的方案在確定任務發(fā)生死循環(huán)異?;蛩梨i異常后,處理器可以自動的并且有 針對性的對死循環(huán)異常或死鎖異常進行排錯處理,然后繼續(xù)執(zhí)行處理后的任務。這樣不需 要程序員的參與,就可以對發(fā)生死循環(huán)異常和死鎖異常的任務進行自動排錯處理,從而防 止了系統(tǒng)出現(xiàn)混亂或者崩潰,節(jié)約了人力和物力。
[0100] 本發(fā)明另一實施例提供一種任務異常的處理方法,如圖2所示,該方法步驟包括:
[0101] 步驟201、初始化定時器。執(zhí)行步驟202。
[0102] 在本步驟中,初始化定時器包括兩個部分,第一部分是獲取處理器的調(diào)度周期,將 處理器的調(diào)度周期作為定時器的中斷時間。示例的,處理器的調(diào)度周期可以為l〇ms。第二 部分是將定時器的工作模式設置為中斷模式。
[0103] 步驟202、創(chuàng)建恢復鏈表。執(zhí)行步驟203。
[0104] 恢復鏈表用于存放出現(xiàn)異常的任務。
[0105] 步驟203、將任務添加到任務鏈表中。執(zhí)行步驟204。
[0106] 步驟204、掃描任務的代碼,獲取任務的特征信息。執(zhí)行步驟205。
[0107] 所述特征信息可以包括任務中每一個循環(huán)體的基準值和修正值,以及循環(huán)體中包 含函數(shù)的權限信息等。其中基準值為循環(huán)體中數(shù)據(jù)變量的初始值;修正值為循環(huán)體滿足終 止條件時,循環(huán)體中數(shù)據(jù)變量的值。以下面的程序模塊1為例進行說明。
[0108] for(int X = 0,y = I ;(x ! = 3| |y ! = 7) ;)//數(shù)據(jù)變量 X 的初始值為 0,數(shù)據(jù) 變量y的初始值為1,當數(shù)據(jù)變量X的值不等于3,或者數(shù)據(jù)變量y的值不等于7時,循環(huán)一 直進行
[0109]
【權利要求】
1. 一種任務異常的處理方法,用于處理器,其特征在于,包括: 若當前任務的執(zhí)行時間大于預設執(zhí)行時間時,確定所述任務發(fā)生死循環(huán)異常或死鎖異 常; 當確定所述任務發(fā)生死鎖異常時,釋放所述任務占用的資源,繼續(xù)執(zhí)行所述任務; 當確定所述任務發(fā)生死循環(huán)異常時,修改所述任務的循環(huán)體的代碼或修改所述任務的 循環(huán)體中的數(shù)據(jù)變量的值,繼續(xù)執(zhí)行所述任務。
2. 根據(jù)權利要求1所述的方法,其特征在于,在所述若當前任務的執(zhí)行時間大于預設 執(zhí)行時間時,確定所述任務發(fā)生死循環(huán)異?;蛩梨i異常之前,所述方法還包括: 獲取所述任務的數(shù)據(jù)狀態(tài)信息,所述數(shù)據(jù)狀態(tài)信息包括至少兩個寄存器信息,所述至 少兩個寄存器信息為所述任務發(fā)生死循環(huán)異?;蛩梨i異常后,所述處理器繼續(xù)執(zhí)行所述任 務時,在第一預設時長中每隔第二預設時長記錄的所述處理器的寄存器狀態(tài)信息; 所述若當前任務的執(zhí)行時間大于預設執(zhí)行時間時,確定所述任務發(fā)生死循環(huán)異?;蛩?鎖異常包括: 若當前任務的執(zhí)行時間大于預設執(zhí)行時間時,根據(jù)所述數(shù)據(jù)狀態(tài)信息,確定所述任務 發(fā)生死循環(huán)異常或死鎖異常。
3. 根據(jù)權利要求2所述的方法,其特征在于, 所述若當前任務的執(zhí)行時間大于預設執(zhí)行時間時,根據(jù)所述數(shù)據(jù)狀態(tài)信息,確定所述 任務發(fā)生死循環(huán)異常或死鎖異常包括: 若所述數(shù)據(jù)狀態(tài)信息中包括的至少兩個寄存器信息完全相同時,確定所述任務發(fā)生死 鎖異常; 若所述數(shù)據(jù)狀態(tài)信息中包括的至少兩個寄存器信息不完全相同時,確定所述任務發(fā)生 死循環(huán)異常。
4. 根據(jù)權利要求2或3所述的方法,其特征在于,在所述獲取所述任務的數(shù)據(jù)狀態(tài)信息 之前,所述方法還包括: 若當前任務的執(zhí)行時間大于預設執(zhí)行時間時,將所述任務從任務鏈表中刪除,并添加 到恢復鏈表中,所述恢復鏈表是用于存儲出現(xiàn)異常的任務的鏈表。
5. 根據(jù)權利要求4所述的方法,其特征在于, 所述當確定所述任務發(fā)生死鎖異常時,釋放所述任務占用的資源,繼續(xù)執(zhí)行所述任務 包括: 當確定所述任務發(fā)生死鎖異常時,釋放所述任務占用的資源; 第三預設時長后,在所述恢復鏈表中執(zhí)行所述任務; 當所述任務沒有再次發(fā)生死鎖異常時,將所述任務從恢復鏈表中刪除,并重新添加到 任務鏈表中,繼續(xù)執(zhí)行所述任務; 當所述任務再次發(fā)生死鎖異常時,再次釋放所述任務占用的資源,并且在所述第三預 設時長后,再次在所述恢復鏈表中執(zhí)行所述任務。
6. 根據(jù)權利要求4所述的方法,其特征在于, 所述當確定所述任務發(fā)生死循環(huán)異常時,修改所述任務的循環(huán)體的代碼或修改所述任 務的循環(huán)體中的數(shù)據(jù)變量的值,繼續(xù)執(zhí)行所述任務包括: 當確定所述任務發(fā)生死循環(huán)異常時,根據(jù)所述任務的特征信息和監(jiān)控信息,判斷所述 任務的循環(huán)體的代碼是否出現(xiàn)錯誤;所述特征信息記錄了所述循環(huán)體的基準值和修正值; 所述基準值為所述循環(huán)體中數(shù)據(jù)變量的初始值;所述修正值為所述循環(huán)體滿足終止條件 時,所述循環(huán)體中數(shù)據(jù)變量的值;所述監(jiān)控信息記錄了所述任務的執(zhí)行過程中所述循環(huán)體 中的數(shù)據(jù)變量的值的變化信息; 若所述任務的循環(huán)體的代碼出現(xiàn)錯誤,根據(jù)所述特征信息、所述監(jiān)控信息和所述數(shù)據(jù) 狀態(tài)信息,修改所述任務的循環(huán)體的代碼,得到修改后的任務; 將所述修改后的任務從恢復鏈表中刪除,并添加到任務鏈表中,繼續(xù)執(zhí)行所述任務; 若所述任務的循環(huán)體的代碼未出現(xiàn)錯誤,根據(jù)所述數(shù)據(jù)狀態(tài)信息和所述特征信息,修 改所述任務的循環(huán)體中的數(shù)據(jù)變量的值,使得所述數(shù)據(jù)變量的值滿足所述循環(huán)體的終止條 件,得到修改后的任務; 將所述修改后的任務從恢復鏈表中刪除,并添加到任務鏈表中,繼續(xù)執(zhí)行所述任務。
7. 根據(jù)權利要求6所述的方法,其特征在于,在所述將所述任務從任務鏈表中刪除,并 添加到恢復鏈表中之前,所述方法還包括: 將所述任務添加到任務鏈表中; 掃描所述任務的代碼,獲取所述任務的所述特征信息,所述特征信息還包括預設執(zhí)行 時間,所述預設執(zhí)行時間為所述任務的正常執(zhí)行時間; 執(zhí)行所述任務; 獲取所述任務的所述監(jiān)控信息和所述任務的執(zhí)行時間。
8. -種任務異常的處理裝置,其特征在于,包括: 確定單元,用于若當前任務的執(zhí)行時間大于預設執(zhí)行時間時,確定所述任務發(fā)生死循 環(huán)異?;蛩梨i異常; 第一處理單元,用于當所述確定單元確定所述任務發(fā)生死鎖異常時,釋放所述任務占 用的資源,繼續(xù)執(zhí)行所述任務; 第二處理單元,用于當所述確定單元確定所述任務發(fā)生死循環(huán)異常時,修改所述任務 的循環(huán)體的代碼或修改所述任務的循環(huán)體中的數(shù)據(jù)變量的值,繼續(xù)執(zhí)行所述任務。
9. 根據(jù)權利要求8所述的裝置,其特征在于,所述任務異常的處理裝置還包括: 獲取單元,用于獲取所述任務的數(shù)據(jù)狀態(tài)信息,所述數(shù)據(jù)狀態(tài)信息包括至少兩個寄存 器信息,所述至少兩個寄存器信息為所述任務發(fā)生死循環(huán)異?;蛩梨i異常后,所述處理器 繼續(xù)執(zhí)行所述任務時,在第一預設時長中每隔第二預設時長記錄的所述處理器的寄存器狀 態(tài)息; 所述確定單元具體用于: 若當前任務的執(zhí)行時間大于預設執(zhí)行時間時,根據(jù)所述數(shù)據(jù)狀態(tài)信息,確定所述任務 發(fā)生死循環(huán)異?;蛩梨i異常。
10. 根據(jù)權利要求9所述的裝置,其特征在于, 所述確定單元具體用于: 若所述數(shù)據(jù)狀態(tài)信息中包括的至少兩個寄存器信息完全相同時,確定所述任務發(fā)生死 鎖異常; 若所述數(shù)據(jù)狀態(tài)信息中包括的至少兩個寄存器信息不完全相同時,確定所述任務發(fā)生 死循環(huán)異常。
11. 根據(jù)權利要求9或10所述的裝置,其特征在于,所述任務異常的處理裝置還包括: 添加單元,用于若當前任務的執(zhí)行時間大于預設執(zhí)行時間時,將所述任務從任務鏈表 中刪除,并添加到恢復鏈表中,所述恢復鏈表是用于存儲出現(xiàn)異常的任務的鏈表。
12. 根據(jù)權利要求11所述的裝置,其特征在于, 所述第一處理單元具體用于: 當確定所述任務發(fā)生死鎖異常時,釋放所述任務占用的資源; 第三預設時長后,在所述恢復鏈表中執(zhí)行所述任務; 當所述任務沒有再次發(fā)生死鎖異常時,將所述任務從恢復鏈表中刪除,并重新添加到 任務鏈表中,繼續(xù)執(zhí)行所述任務; 當所述任務再次發(fā)生死鎖異常時,再次釋放所述任務占用的資源,并且在所述第三預 設時長后,再次在所述恢復鏈表中執(zhí)行所述任務。
13. 根據(jù)權利要求11所述的裝置,其特征在于, 所述第二處理單元具體用于: 當確定所述任務發(fā)生死循環(huán)異常時,根據(jù)所述任務的特征信息和監(jiān)控信息,判斷所述 任務的循環(huán)體的代碼是否出現(xiàn)錯誤;所述特征信息記錄了所述循環(huán)體的基準值和修正值; 所述基準值為所述循環(huán)體中數(shù)據(jù)變量的初始值;所述修正值為所述循環(huán)體滿足終止條件 時,所述循環(huán)體中數(shù)據(jù)變量的值;所述監(jiān)控信息記錄了所述任務的執(zhí)行過程中所述循環(huán)體 中的數(shù)據(jù)變量的值的變化信息; 若所述任務的循環(huán)體的代碼出現(xiàn)錯誤,根據(jù)所述特征信息、所述監(jiān)控信息和所述數(shù)據(jù) 狀態(tài)信息,修改所述任務的循環(huán)體的代碼,得到修改后的任務; 將所述修改后的任務從恢復鏈表中刪除,并添加到任務鏈表中,繼續(xù)執(zhí)行所述任務; 若所述任務的循環(huán)體的代碼未出現(xiàn)錯誤,根據(jù)所述數(shù)據(jù)狀態(tài)信息和所述特征信息,修 改所述任務的循環(huán)體中的數(shù)據(jù)變量的值,使得所述數(shù)據(jù)變量的值滿足所述循環(huán)體的終止條 件,得到修改后的任務; 將所述修改后的任務從恢復鏈表中刪除,并添加到任務鏈表中,繼續(xù)執(zhí)行所述任務。
【文檔編號】G06F11/07GK104391754SQ201410540133
【公開日】2015年3月4日 申請日期:2014年10月13日 優(yōu)先權日:2014年10月13日
【發(fā)明者】梁恩波 申請人:北京星網(wǎng)銳捷網(wǎng)絡技術有限公司