本發(fā)明涉及計算機應用信技術,特別是涉及一種死鎖控制方法和裝置。
背景技術:
在高并發(fā)多線程的系統(tǒng)中,有很多一次只能由一個線程使用的資源。若干線程往往期望共享這些資源。但是一個線程需要的資源往往不只一個。這樣就會出現(xiàn)許多線程競爭有限資源,如果線程間推進不當,則容易造成多個線程之間彼此占有對方期待的資源從而循環(huán)等待的情況。該情況,稱之為死鎖。死鎖一旦出現(xiàn),對整個系統(tǒng)的影響是致命的。
目前,針對死鎖的解決方案通常有兩種,一種是整個系統(tǒng)重啟;另一種是選擇死鎖線程中優(yōu)先級較低的線程釋放資源,取消線程。這兩種方法,由于是直接取消線程的執(zhí)行,因此都會或多或少丟失內(nèi)存中的數(shù)據(jù),另外,當再次執(zhí)行被取消的線程時,程序的執(zhí)行環(huán)境發(fā)生了改變,因此,可能會造成程序運行時出現(xiàn)大的誤差。
由此可見,現(xiàn)有的死鎖解決方案存在丟失數(shù)據(jù)、運行誤差大等風險問題。
技術實現(xiàn)要素:
有鑒于此,本發(fā)明的主要目的在于提供一種死鎖控制方法和裝置,可以簡單快速地解決死鎖問題,且可以避免內(nèi)存數(shù)據(jù)的丟失、確保程序運行結(jié)果的準確性。
為了達到上述目的,本發(fā)明提出的技術方案為:
一種死鎖控制方法,包括:
預先將應用程序中需要請求共享資源的代碼封裝為函數(shù)模塊;
當所述應用程序的線程執(zhí)行所述函數(shù)模塊時,將當前的上下文環(huán)境信息保存在所述線程的回滾資源池中;對所述函數(shù)模塊需要請求的共享資源進行鎖定,如果鎖定成功,則觸發(fā)所述線程繼續(xù)執(zhí)行;否則,阻塞所述線程;
當所述線程需要釋放所占用的共享資源時,將相應的上下文環(huán)境信息從所述線程的回滾資源池中刪除;
當發(fā)生死鎖時,確定當前需要釋放資源的線程s1以及資源釋放時需要回滾到的目 標函數(shù)模塊;利用所述線程s1的回滾資源池中的上下文環(huán)境信息,按照先執(zhí)行后回退的原則,將所述線程s1的待執(zhí)行位置回滾到所述目標函數(shù)模塊;阻塞所述線程s1,觸發(fā)當前等待被釋放的共享資源的線程獲取所述被釋放的共享資源。
一種死鎖控制裝置,包括:
調(diào)用控制單元,用于當應用程序的線程執(zhí)行指定的函數(shù)模塊時,將當前的上下文環(huán)境信息保存在所述線程的回滾資源池中;對所述函數(shù)模塊需要請求的共享資源進行鎖定,如果鎖定成功,則觸發(fā)所述線程繼續(xù)執(zhí)行;否則,阻塞所述線程;所述函數(shù)模塊為預先采用函數(shù)形式對應用程序中需要請求共享資源的代碼進行封裝后得到的模塊;
資源釋放單元,用于當所述線程需要釋放所占用的共享資源時,將相應的上下文環(huán)境信息從所述線程的回滾資源池中刪除;
死鎖控制單元,用于當發(fā)生死鎖時,確定當前需要釋放資源的線程s1以及資源釋放時需要回滾到的目標函數(shù)模塊;利用所述線程s1的回滾資源池中的上下文環(huán)境信息,按照先執(zhí)行后回退的原則,將所述線程s1的待執(zhí)行位置回滾到所述目標函數(shù)模塊;阻塞所述線程s1,觸發(fā)當前等待被釋放的共享資源的線程獲取所述被釋放的共享資源;
資源池管理單元,用于為所述應用程序的各線程創(chuàng)建和維護所述回滾資源池。
綜上所述,本發(fā)明提出的死鎖控制方法和裝置,預先將程序中需要請求共享資源的代碼封裝成函數(shù)形式,以便對共享資源的調(diào)用位置進行準確定位,線程在執(zhí)行共享資源的調(diào)用時,對相應函數(shù)所在的上下文環(huán)境信息進行保存,這樣線程回滾,在發(fā)生死鎖時,線程可以基于所保存的上下文環(huán)境信息,采用線程回滾的方式,釋放共享資源,以解決當前的死鎖。如此,即可以簡單快速地解決死鎖問題,又可以避免直接取消線程的運行而導致的數(shù)據(jù)丟失、運行誤差大等問題,從而可以確保應用程序運行結(jié)果的準確性,有效避免了死鎖對應用程序的致命破壞。
附圖說明
圖1為本發(fā)明實施例的方法流程示意圖;
圖2為本發(fā)明實施例的裝置結(jié)構(gòu)示意圖。
具體實施方式
為使本發(fā)明的目的、技術方案和優(yōu)點更加清楚,下面將結(jié)合附圖及具體實施 例對本發(fā)明作進一步地詳細描述。
本發(fā)明的核心思想是:預先對線程的程序代碼中請求共享資源的代碼進行模塊化,在發(fā)生死鎖時,采用線程回滾的方式,選擇回滾代價小的線程進行回滾釋放資源。如此,可以簡單快速地解決死鎖,同時由于不需要取消線程的執(zhí)行,因此,可以避免運行環(huán)境的改變所致的運行誤差大的問題。
圖1為本發(fā)明實施例的方法流程示意圖,如圖1所示,該實施例實現(xiàn)的死鎖控制方法主要包括:
步驟101、預先將應用程序中需要請求共享資源的代碼封裝為函數(shù)模塊。
本步驟中,需要先將需要請求共享資源的代碼封裝為函數(shù)形式,以便對共享資源的調(diào)用位置進行準確定位,這樣,線程在執(zhí)行共享資源的調(diào)用時,可以對相應函數(shù)所在的上下文環(huán)境信息進行保存,在死鎖發(fā)生時,基于所保存的上下文環(huán)境信息,采用回滾重新執(zhí)行的方式釋放死鎖中被占用的資源,便可快速有效地解除死鎖,而不需要取消線程的執(zhí)行。
步驟102、當所述應用程序的線程執(zhí)行所述函數(shù)模塊時,將當前的上下文環(huán)境信息保存在所述線程的回滾資源池中;對所述函數(shù)模塊需要請求的共享資源進行鎖定,如果鎖定成功,則觸發(fā)所述線程繼續(xù)執(zhí)行;否則,阻塞所述線程。
本步驟中,當執(zhí)行一需要請求共享資源的函數(shù)模塊時,需要將當前的上下文環(huán)境信息保存,以便在發(fā)生死鎖時,基于所保存的上下文環(huán)境信息,進行線程回滾,以釋放被鎖定的共享資源,解除死鎖。
所述上下文環(huán)境信息用于在線程回滾時將運行環(huán)境恢復為相應的函數(shù)模塊執(zhí)行時的狀態(tài),以便重新執(zhí)行該函數(shù)模塊,確保程序的正確運行。所述上下文環(huán)境信息具體包括:當前使用的參數(shù)信息和函數(shù)模塊信息等。
這里,回滾資源池用于保存線程運行時產(chǎn)生的上述上下文環(huán)境信息,為了確保程序的按照執(zhí)行的倒序回滾,這些信息將采用先進行后出的方式進行保存,具體的可以采用棧結(jié)構(gòu)實現(xiàn)回滾資源池。
簡單起見,在實際應用中,對于上述函數(shù)模塊中對共享資源的調(diào)用,可以利用中間件的方式實現(xiàn),即線程直接調(diào)用一中間件接口,同時提供需要獲取的共享資源,以及獲取資源相關狀態(tài)的回調(diào)函數(shù)對象。回調(diào)函數(shù)對象中包括了基于獲取資源不同狀態(tài)(成功、失敗、阻塞)執(zhí)行的方法。具體調(diào)用時,由中間件基于實際的資源調(diào)用狀態(tài)來執(zhí)行對應狀態(tài)下的方法。具體地,中間件的設計方法為本領域技術人員所掌握,在此不再贅述。
本步驟中,阻塞線程的具體實現(xiàn)同現(xiàn)有系統(tǒng),在此不再贅述。
步驟103、當所述線程需要釋放所占用的共享資源時,將相應的上下文環(huán)境信息從所述線程的回滾資源池中刪除。
本步驟中,在共享資源需要釋放時,則說明不會存在由于占用該共享資源而導致的死鎖問題,相應的上下文環(huán)境信息就沒有保存的價值了,因此,此時,需要及時刪除其在線程回滾資源池中的相應上下文環(huán)境信息,以確保線程回滾資源池中的上下文環(huán)境信息僅對應于當前被占用的共享資源,有利用線程回滾的準確性。
步驟104、當發(fā)生死鎖時,確定當前需要釋放資源的線程s1以及資源釋放時需要回滾到的目標函數(shù)模塊;利用所述線程s1的回滾資源池中的上下文環(huán)境信息,按照先執(zhí)行后回退的原則,將所述線程s1的待執(zhí)行位置回滾到所述目標函數(shù)模塊;阻塞所述線程s1,觸發(fā)當前等待被釋放的共享資源的線程獲取所述被釋放的共享資源。
本步驟,用于在發(fā)生死鎖時,基于回滾資源池,采用線程回滾的方式,釋放被鎖定的共享資源,以快速有效的解決死鎖問題。
這里,在死鎖發(fā)生時,需要先確定需要首先釋放的共享資源。較佳地,可以按照釋放資源數(shù)量最少的原則,來確定當前需要釋放資源的線程s1,以及資源釋放時回滾到的目標函數(shù)模塊。這里,解決死鎖所需要釋放的資源最少即回滾的函數(shù)模塊量最少,相應地,需要重新執(zhí)行的代碼也最少,從而使得付出的代價最小,因此可以有效提高線程運行效率。具體地,可以采用下述方法實現(xiàn)上述目的:
步驟x1、對于所述死鎖涉及的每個線程,確定當前占用本線程等待的共享資源w的線程q,以及在所述共享資源w對應的上下文環(huán)境信息之后保存至所述線程q的回滾資源池的上下文環(huán)境信息數(shù)量n。
本步驟中,將計算每個處于死鎖狀態(tài)的線程所等待的共享資源被釋放時需要付出的代價,即占用該資源的進行q需要釋放的共享資源數(shù)(即n+1),以便此后選擇代價最小的共享資源進行釋放。
步驟x2、選擇最小的所述n對應的所述線程q,作為所述當前需要釋放資源的線程s1;并將相應的所述線程s1中請求所述共享資源w的函數(shù)模塊作為所述目標函數(shù)模塊。
上述步驟x1中得到的所有n中的最小值意味著其釋放相應的共享資源w付出的代價是最小的,選擇所有n中的最小值對應的線程q,作為當前需要釋放資源的線程s1,可以最大程度地減少死鎖對程序執(zhí)行效率的影響。
較佳地,可以采用下述方法將所述線程s1待執(zhí)行位置回滾到的所述目標函數(shù)模塊:
按照后入先出的順序,從所述線程s1的回滾資源池中依次取出上下文環(huán)境信息并 根據(jù)所述上下文環(huán)境信息釋放相應的共享資源,直至取出所述目標函數(shù)模塊對應的上下文環(huán)境信息并釋放對應的共享資源,將所述線程s1的待執(zhí)行位置設置為所述目標函數(shù)模塊。
較佳地,可以采用不公平鎖的方式,來觸發(fā)當前等待被釋放的共享資源的線程獲取所述被釋放的共享資源,具體地,可以通過下述方法實現(xiàn):
步驟y1、喚醒當前所有等待所述被釋放的共享資源的線程。
本步驟中,將喚醒所有等待被釋放資源的線程,以觸發(fā)它們?nèi)フ埱箧i定該資源。
步驟y2、每個被喚醒的線程請求鎖定被釋放的所述共享資源,如果鎖定成功,則觸發(fā)該鎖定成功的線程繼續(xù)執(zhí)行,如果鎖定失敗,則阻塞該鎖定失敗的線程。
本步驟中,如果被喚醒的線程鎖定資源成功,則繼續(xù)執(zhí)行,否則,再次進行阻塞狀態(tài)。
上述死鎖的判定以及喚醒線程、阻塞線程的具體方法為本領域技術人員所掌握,在此不再贅述。
從上述方法實施例可以看出,本發(fā)明通過預先將程序中需要請求共享資源的代碼封裝成函數(shù)形式,線程在執(zhí)行共享資源的調(diào)用時,對相應函數(shù)所在的上下文環(huán)境信息進行保存,在發(fā)生死鎖時,基于所保存的上下文環(huán)境信息,采用線程回滾的方式,釋放共享資源,如此,既可以簡單快速地解決死鎖問題,又可以確保應用程序運行結(jié)果的準確性,有效避免了死鎖對應用程序的致命破壞。
圖2為與上述方法相對應的一種死鎖控制裝置結(jié)構(gòu)示意圖,如圖2所示,該裝置包括:
調(diào)用控制單元,用于當應用程序的線程執(zhí)行指定的函數(shù)模塊時,將當前的上下文環(huán)境信息保存在所述線程的回滾資源池中;對所述函數(shù)模塊需要請求的共享資源進行鎖定,如果鎖定成功,則觸發(fā)所述線程繼續(xù)執(zhí)行;否則,阻塞所述線程;所述函數(shù)模塊為預先采用函數(shù)形式對應用程序中需要請求共享資源的代碼進行封裝后得到的模塊。
資源釋放單元,用于當所述線程需要釋放所占用的共享資源時,將相應的上下文環(huán)境信息從所述線程的回滾資源池中刪除。
死鎖控制單元,用于當發(fā)生死鎖時,確定當前需要釋放資源的線程s1以及資源釋放時需要回滾到的目標函數(shù)模塊;利用所述線程s1的回滾資源池中的上下文環(huán)境信息,按照先執(zhí)行后回退的原則,將所述線程s1的待執(zhí)行位置回滾到所述目標函數(shù)模塊;阻塞所述線程s1,觸發(fā)當前等待被釋放的共享資源的線程獲取所述被釋放的共享資源。
資源池管理單元,用于為所述應用程序的各線程創(chuàng)建和維護回滾資源池。
這里,該資源池管理單元將創(chuàng)建和維護當前各線程的回滾資源池,具體的維護包括對回滾資源池中上下文環(huán)境信息執(zhí)行寫入、讀取、刪除等操作。
較佳地,所述資源釋放單元,用于按照釋放資源數(shù)量最少的原則,確定當前需要釋放資源的線程s1,以及資源釋放時回滾到的目標函數(shù)模塊。
較佳地,所述死鎖控制單元,用于對于所述死鎖涉及的每個線程,確定當前占用本線程等待的共享資源w的線程q,以及在所述共享資源w對應的上下文環(huán)境信息之后保存至所述線程q的回滾資源池的上下文環(huán)境信息數(shù)量n;選擇最小的所述n對應的所述線程q,作為所述當前需要釋放資源的線程s1;并將相應的所述線程s1中請求所述共享資源w的函數(shù)模塊作為所述目標函數(shù)模塊。
較佳地,所述死鎖控制單元,用于按照后入先出的順序,從所述線程s1的回滾資源池中依次取出上下文環(huán)境信息并根據(jù)所述上下文環(huán)境信息釋放相應的共享資源,直至取出所述目標函數(shù)模塊對應的上下文環(huán)境信息并釋放對應的共享資源,將所述線程s1的待執(zhí)行位置設置為所述目標函數(shù)模塊。
較佳地,所述死鎖控制單元,用于喚醒當前所有等待所述被釋放的共享資源的線程;觸發(fā)每個被喚醒的線程請求鎖定被釋放的所述共享資源,如果鎖定成功,則觸發(fā)該鎖定成功的線程繼續(xù)執(zhí)行,如果鎖定失敗,則阻塞該鎖定失敗的線程。
綜上所述,以上僅為本發(fā)明的較佳實施例而已,并非用于限定本發(fā)明的保護范圍。凡在本發(fā)明的精神和原則之內(nèi),所作的任何修改、等同替換、改進等,均應包含在本發(fā)明的保護范圍之內(nèi)。