本發(fā)明涉及操作系統(tǒng)故障管理領域,特別涉及一種用戶態(tài)讀寫鎖死鎖檢測方法及系統(tǒng)。
背景技術:
死鎖就是多個進程(線程)因為等待別的進程已占有的自己所需要的資源而陷入阻塞的一種狀態(tài),死鎖狀態(tài)一旦形成,進程本身是解決不了的,需要外在的推動,才能解決,最重要的是死鎖不僅僅影響進程業(yè)務,而且還會占用系統(tǒng)資源,影響其他進程。內核死鎖是長期困擾內核開發(fā)人員的問題之一;Linux系統(tǒng)用戶態(tài)C程序同樣存在用戶態(tài)讀寫鎖死鎖問題,因此,如何準確的檢測出用戶態(tài)讀寫鎖死鎖,是本領域技術人員需要解決的技術問題。
技術實現(xiàn)要素:
本發(fā)明的目的是提供一種用戶態(tài)讀寫鎖死鎖檢測方法及系統(tǒng),對linux用戶態(tài)讀寫鎖的數(shù)據(jù)結構和讀寫鎖接口API進行封裝,通過調用內核lockdep死鎖檢測函數(shù)對用戶態(tài)讀寫鎖死鎖進行檢測。
為解決上述技術問題,本發(fā)明提供一種用戶態(tài)讀寫鎖死鎖檢測方法,包括:
S100、將用戶態(tài)讀寫鎖數(shù)據(jù)結構與lockdep_map數(shù)據(jù)結構進行封裝;
S110、對引入內核lockdep死鎖程序的用戶態(tài)讀寫鎖接口API進行封裝;
S120、將封裝后的用戶態(tài)讀寫鎖接口,編譯成用戶態(tài)讀寫鎖檢測動態(tài)靜態(tài)鏈接庫,生成讀寫鎖死鎖檢測庫文件;
S130、根據(jù)所述讀寫鎖死鎖檢測庫文件編譯讀寫鎖死鎖檢測操作;執(zhí)行所述讀寫鎖死鎖檢測操作,若存在死鎖,則打印死鎖信息。
其中,步驟S100包括:
將用戶態(tài)讀寫鎖數(shù)據(jù)結構pthread_rwlock_t添加lockdep模塊死鎖檢測需要的lockdep_map數(shù)據(jù)結構。
其中,步驟S110包括:
引入內核lockdep死鎖程序,定義用戶態(tài)文件;其中,所述用戶態(tài)文件包括lockdep.c、lockdep_states.h和lockdep_internals.h;
根據(jù)所述用戶態(tài)文件對用戶態(tài)讀寫鎖接口進行封裝;其中,所述用戶態(tài)讀寫鎖接口包括:PTHREAD_RWLOCK_INITIALIZER、pthread_rwlock_init、pthread_rwlock_rdlock、pthread_rwlock_unlock、pthread_rwlock_wrlock、pthread_rwlock_tryrdlock、pthread_rwlock_trywlock、pthread_rwlock_destroy。
其中,執(zhí)行所述讀寫鎖死鎖檢測操作,包括:
判斷編譯時是否引入所述讀寫鎖死鎖檢測庫文件;
若引入,則執(zhí)行所述讀寫鎖死鎖檢測操作。
本發(fā)明還提供一種用戶態(tài)讀寫鎖死鎖檢測系統(tǒng),包括:
數(shù)據(jù)結構封裝模塊,用于將用戶態(tài)讀寫鎖數(shù)據(jù)結構與lockdep_map數(shù)據(jù)結構進行封裝;
接口封裝模塊,用于對引入內核lockdep死鎖程序的用戶態(tài)讀寫鎖接口API進行封裝;
編譯模塊,用于將封裝后的用戶態(tài)讀寫鎖接口,編譯成用戶態(tài)讀寫鎖檢測動態(tài)靜態(tài)鏈接庫,生成讀寫鎖死鎖檢測庫文件;
用戶態(tài)程序模塊,用于根據(jù)所述讀寫鎖死鎖檢測庫文件編譯讀寫鎖死鎖檢測操作;執(zhí)行所述讀寫鎖死鎖檢測操作,若存在死鎖,則打印死鎖信息。
其中,所述數(shù)據(jù)結構封裝模塊具體為將用戶態(tài)讀寫鎖數(shù)據(jù)結構pthread_rwlock_t添加lockdep模塊死鎖檢測需要的lockdep_map數(shù)據(jù)結構的模塊。
其中,接口封裝模塊具體為引入內核lockdep死鎖程序,定義用戶態(tài)文件;根據(jù)所述用戶態(tài)文件對用戶態(tài)讀寫鎖接口進行封裝的模塊;
其中,所述用戶態(tài)讀寫鎖接口包括:PTHREAD_RWLOCK_INITIALIZER、pthread_rwlock_init、pthread_rwlock_rdlock、pthread_rwlock_unlock、pthread_rwlock_wrlock、pthread_rwlock_tryrdlock、pthread_rwlock_trywlock、pthread_rwlock_destroy;所述用戶態(tài)文件包括lockdep.c、lockdep_states.h和lockdep_internals.h。
其中,用戶態(tài)程序模塊,包括:
編譯單元,用于根據(jù)所述讀寫鎖死鎖檢測庫文件編譯讀寫鎖死鎖檢測操作;
判斷單元,用于判斷編譯時是否引入所述讀寫鎖死鎖檢測庫文件;
執(zhí)行單元,用于若存在所述讀寫鎖死鎖檢測庫文件,執(zhí)行所述讀寫鎖死鎖檢測操作;
打印單元,用于若存在死鎖,則打印死鎖信息。
本發(fā)明所提供的用戶態(tài)讀寫鎖死鎖檢測方法,包括:將用戶態(tài)讀寫鎖數(shù)據(jù)結構與lockdep_map數(shù)據(jù)結構進行封裝;對引入內核lockdep死鎖程序的用戶態(tài)讀寫鎖接口API進行封裝;將封裝后的用戶態(tài)讀寫鎖接口,編譯成用戶態(tài)讀寫鎖檢測動態(tài)靜態(tài)鏈接庫,生成讀寫鎖死鎖檢測庫文件;根據(jù)所述讀寫鎖死鎖檢測庫文件編譯讀寫鎖死鎖檢測操作;執(zhí)行所述讀寫鎖死鎖檢測操作,若存在死鎖,則打印死鎖信息;可見該方法通過封裝lockdep模塊,使內核通過調用內核lockdep死鎖檢測函數(shù)來進行用戶態(tài)讀寫鎖死鎖檢測,能夠準確的檢測出linux用戶態(tài)讀寫鎖死鎖;本發(fā)明還提供了一種用戶態(tài)讀寫鎖死鎖檢測系統(tǒng),具有上述有益效果,在此不再贅述。
附圖說明
為了更清楚地說明本發(fā)明實施例或現(xiàn)有技術中的技術方案,下面將對實施例或現(xiàn)有技術描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明的實施例,對于本領域普通技術人員來講,在不付出創(chuàng)造性勞動的前提下,還可以根據(jù)提供的附圖獲得其他的附圖。
圖1為本發(fā)明實施例所提供的用戶態(tài)讀寫鎖死鎖檢測方法的流程圖;
圖2為本發(fā)明實施例所提供的用戶態(tài)讀寫鎖死鎖檢測系統(tǒng)的結構框圖。
具體實施方式
本發(fā)明的核心是提供一種用戶態(tài)讀寫鎖死鎖檢測方法及系統(tǒng),對linux用戶態(tài)讀寫鎖的數(shù)據(jù)結構和讀寫鎖接口API進行封裝,通過調用內核lockdep死鎖檢測函數(shù)對用戶態(tài)讀寫鎖死鎖進行檢測。
為使本發(fā)明實施例的目的、技術方案和優(yōu)點更加清楚,下面將結合本發(fā)明實施例中的附圖,對本發(fā)明實施例中的技術方案進行清楚、完整地描述,顯然,所描述的實施例是本發(fā)明一部分實施例,而不是全部的實施例?;诒景l(fā)明中的實施例,本領域普通技術人員在沒有做出創(chuàng)造性勞動前提下所獲得的所有其他實施例,都屬于本發(fā)明保護的范圍。
請參考圖1,圖1為本發(fā)明實施例所提供的用戶態(tài)讀寫鎖死鎖檢測方法的流程圖;該方法可以包括:
S100、將用戶態(tài)讀寫鎖數(shù)據(jù)結構與lockdep_map數(shù)據(jù)結構進行封裝;
其中,該步驟即為用戶態(tài)讀寫鎖數(shù)據(jù)結構封裝,具體的將用戶態(tài)讀寫鎖數(shù)據(jù)結構pthread_rwlock_t添加lockdep模塊死鎖檢測需要的lockdep_map數(shù)據(jù)結構。
讀寫鎖數(shù)據(jù)結構封裝,在原有的數(shù)據(jù)結構pthread_rwlock_t基礎上添加lockdep_map數(shù)據(jù)結構,定義為lockdep_pthread_rwlock數(shù)據(jù)機構。具體過程如下:
變量定義如下:
#define NR_LOCKDEP_CACHING_CLASSES 2
#define MAX_LOCKDEP_SUBCLASSES 8UL
S110、對引入內核lockdep死鎖程序的用戶態(tài)讀寫鎖接口API進行封裝;
其中,該步驟即為用戶態(tài)讀寫鎖接口封裝,引入內核lockdep死鎖程序,定義用戶態(tài)文件;其中,所述用戶態(tài)文件包括lockdep.c、lockdep_states.h和lockdep_internals.h;
根據(jù)所述用戶態(tài)文件對用戶態(tài)讀寫鎖接口進行封裝;其中,所述用戶態(tài)讀寫鎖接口包括:PTHREAD_RWLOCK_INITIALIZER、pthread_rwlock_init、pthread_rwlock_rdlock、pthread_rwlock_unlock、pthread_rwlock_wrlock、pthread_rwlock_tryrdlock、pthread_rwlock_trywlock、pthread_rwlock_destroy。
其中,讀寫鎖調用接口封裝,是讀寫鎖提供給用戶的PTHREAD_RWLOCK_INITIALIZER,pthread_rwlock_init,pthread_rwlock_rdlock、pthread_rwlock_unlock、pthread_rwlock_wrlock、pthread_rwlock_tryrdlock、pthread_rwlock_trywlock、pthread_rwlock_destroy等接口進行封裝,引入內核lockdep代碼即內核lockdep死鎖程序,通過直接引入內核文件的方式調用內核lockdep代碼。
引入lockdep代碼,定義用戶態(tài)文件lockdep.c、lockdep_states.h和lockdep_internals.h。
接口重定義:
S120、將封裝后的用戶態(tài)讀寫鎖接口,編譯成用戶態(tài)讀寫鎖檢測動態(tài)靜態(tài)鏈接庫,生成讀寫鎖死鎖檢測庫文件;
其中,該步驟即為編譯用戶態(tài)讀寫鎖檢測動態(tài)靜態(tài)鏈接庫,即編譯重新封裝的讀寫鎖的接口。從步驟S100到S120完成了用戶態(tài)讀寫鎖死鎖檢測庫文件的生成。即首先對用戶態(tài)讀寫鎖的數(shù)據(jù)結構和API進行封裝,引入lockdep內核死鎖檢測函數(shù),編譯生成讀寫鎖死鎖檢測庫文件;用戶態(tài)程序編譯時引入讀寫鎖死鎖檢測庫文件,用戶程序讀寫鎖操作指向讀寫鎖死鎖檢測庫文件封裝的接口。
S130、根據(jù)所述讀寫鎖死鎖檢測庫文件編譯讀寫鎖死鎖檢測操作;執(zhí)行所述讀寫鎖死鎖檢測操作,若存在死鎖,則打印死鎖信息。
其中,用戶C程序重新編譯并執(zhí)行檢測過程;即步驟S130完成了用戶態(tài)程序讀寫鎖死鎖檢測流程;先判斷編譯中是否引入讀寫鎖死鎖檢測庫文件,如果沒有引入,直接運行程序本身功能結束;如果引入讀寫鎖死鎖檢測庫文件,則檢測是否存在讀寫鎖死鎖,如果存在死鎖,打印死鎖信息結束;如果不存在死鎖,程序執(zhí)行本身功能結束。
基于上述技術方案,本發(fā)明實施例提供的用戶態(tài)讀寫鎖死鎖檢測方法,對linux用戶態(tài)讀寫鎖的數(shù)據(jù)結構和讀寫鎖接口API進行封裝,通過調用內核lockdep死鎖檢測函數(shù)對用戶態(tài)讀寫鎖死鎖進行檢測;即通過封裝用戶態(tài)讀寫鎖數(shù)據(jù)結構和讀寫鎖接口實現(xiàn)對內核lockdep代碼調用;能夠有效檢測出用戶態(tài)C程序的讀寫鎖死鎖。
本發(fā)明實施例提供了用戶態(tài)讀寫鎖死鎖檢測方法,能夠通過調用lockdep模塊能夠準確的檢測出用戶態(tài)讀寫鎖死鎖。
下面對本發(fā)明實施例提供的用戶態(tài)讀寫鎖死鎖檢測系統(tǒng)進行介紹,下文描述的用戶態(tài)讀寫鎖死鎖檢測系統(tǒng)與上文描述的用戶態(tài)讀寫鎖死鎖檢測方法可相互對應參照。
請參考圖2,圖2為本發(fā)明實施例所提供的用戶態(tài)讀寫鎖死鎖檢測系統(tǒng)的結構框圖;該系統(tǒng)可以包括:
數(shù)據(jù)結構封裝模塊100,用于將用戶態(tài)讀寫鎖數(shù)據(jù)結構與lockdep_map數(shù)據(jù)結構進行封裝;
接口封裝模塊200,用于對引入內核lockdep死鎖程序的用戶態(tài)讀寫鎖接口API進行封裝;
編譯模塊300,用于將封裝后的用戶態(tài)讀寫鎖接口,編譯成用戶態(tài)讀寫鎖檢測動態(tài)靜態(tài)鏈接庫,生成讀寫鎖死鎖檢測庫文件;
用戶態(tài)程序模塊400,用于根據(jù)所述讀寫鎖死鎖檢測庫文件編譯讀寫鎖死鎖檢測操作;執(zhí)行所述讀寫鎖死鎖檢測操作,若存在死鎖,則打印死鎖信息。
可選的,所述數(shù)據(jù)結構封裝模塊100具體為將用戶態(tài)讀寫鎖數(shù)據(jù)結構pthread_rwlock_t添加lockdep模塊死鎖檢測需要的lockdep_map數(shù)據(jù)結構的模塊。
可選的,接口封裝模塊200具體為引入內核lockdep死鎖程序,定義用戶態(tài)文件;根據(jù)所述用戶態(tài)文件對用戶態(tài)讀寫鎖接口進行封裝的模塊;
其中,所述用戶態(tài)讀寫鎖接口包括:PTHREAD_RWLOCK_INITIALIZER、pthread_rwlock_init、pthread_rwlock_rdlock、pthread_rwlock_unlock、pthread_rwlock_wrlock、pthread_rwlock_tryrdlock、pthread_rwlock_trywlock、pthread_rwlock_destroy;所述用戶態(tài)文件包括lockdep.c、lockdep_states.h和lockdep_internals.h。
可選的,用戶態(tài)程序模塊400,包括:
編譯單元,用于根據(jù)所述讀寫鎖死鎖檢測庫文件編譯讀寫鎖死鎖檢測操作;
判斷單元,用于判斷編譯時是否引入所述讀寫鎖死鎖檢測庫文件;
執(zhí)行單元,用于若存在所述讀寫鎖死鎖檢測庫文件,執(zhí)行所述讀寫鎖死鎖檢測操作;
記錄單元,用于若存在死鎖,則打印死鎖信息。
說明書中各個實施例采用遞進的方式描述,每個實施例重點說明的都是與其他實施例的不同之處,各個實施例之間相同相似部分互相參見即可。對于實施例公開的裝置而言,由于其與實施例公開的方法相對應,所以描述的比較簡單,相關之處參見方法部分說明即可。
專業(yè)人員還可以進一步意識到,結合本文中所公開的實施例描述的各示例的單元及算法步驟,能夠以電子硬件、計算機軟件或者二者的結合來實現(xiàn),為了清楚地說明硬件和軟件的可互換性,在上述說明中已經(jīng)按照功能一般性地描述了各示例的組成及步驟。這些功能究竟以硬件還是軟件方式來執(zhí)行,取決于技術方案的特定應用和設計約束條件。專業(yè)技術人員可以對每個特定的應用來使用不同方法來實現(xiàn)所描述的功能,但是這種實現(xiàn)不應認為超出本發(fā)明的范圍。
結合本文中所公開的實施例描述的方法或算法的步驟可以直接用硬件、處理器執(zhí)行的軟件模塊,或者二者的結合來實施。軟件模塊可以置于隨機存儲器(RAM)、內存、只讀存儲器(ROM)、電可編程ROM、電可擦除可編程ROM、寄存器、硬盤、可移動磁盤、CD-ROM、或技術領域內所公知的任意其它形式的存儲介質中。
以上對本發(fā)明所提供的用戶態(tài)讀寫鎖死鎖檢測方法及系統(tǒng)進行了詳細介紹。本文中應用了具體個例對本發(fā)明的原理及實施方式進行了闡述,以上實施例的說明只是用于幫助理解本發(fā)明的方法及其核心思想。應當指出,對于本技術領域的普通技術人員來說,在不脫離本發(fā)明原理的前提下,還可以對本發(fā)明進行若干改進和修飾,這些改進和修飾也落入本發(fā)明權利要求的保護范圍內。