死鎖:一種情形,此時執行程式中兩個或多個執行緒發生永久堵塞(等待),每個執行緒都在等待被
其他執行緒占用並堵塞了的資源。例如,如果執行緒a鎖住了記錄1並等待記錄2,而執行緒b鎖住了記錄2並等待記錄1,這樣兩個執行緒就發生了死鎖現象。
gdb除錯死鎖的方法:
gdb
attach pid
找到_lll_lock_wait 鎖等待的地方。
然後查詢該鎖被哪個執行緒鎖住了。
例如:檢視哪個執行緒擁有互斥體
(gdb) print accounta_mutex
$1 = }
(gdb) print 0x2527
$2 = 9511
(gdb) print accountb_mutex
$3 = }
(gdb) print 0x2529
$4 = 9513
(gdb)
從上面的命令中,我們可以看出acconta_mutex是被執行緒 5(lwp 9511)加鎖(擁有)的,而accontb_mutex是被執行緒 3(lwp 9513)加鎖(擁有)的。
找出死鎖的地方,對應檢查**就可以了。死鎖大多是對鎖的使用發生交叉所致的,解決死鎖的方法常有:
是作業系統中預防死鎖的一種演算法,這種演算法資源按某種規則系統中的所有資源統一編號(例如印表機為1、磁帶機為2、磁碟為3、等等),申請時必須以上公升的次序。系統要求申請程序:
1、對它所必須使用的而且屬於同一類的所有資源,必須一次申請完;
2、在申請不同類資源時,必須按各類裝置的編號依次申請。
例如:程序pa,使用資源的順序是r1,r2;
程序pb,使用資源的順序是r2,r1;
若採用動態分配有可能形成環路條件,造成死鎖。
採用有序資源分配法:r1的編號為1,r2的編號為2;
pa:申請次序應是:r1,r2
pb:申請次序應是:r1,r2
這樣就破壞了環路條件,避免了死鎖的發生。
另外,還有死鎖避免,死鎖檢測與恢復等。
我們可以把
作業系統看作是銀行家,作業系統管理的資源相當於銀行家管理的資金,程序向作業系統請求分配資源相當於使用者向銀行家貸款。
為保證資金的安全,銀行家規定:
(1) 當乙個顧客對資金的最大需求量不超過銀行家現有的資金時就可接納該顧客;
(2) 顧客可以分期貸款,但貸款的總數不能超過最大需求量;
(3) 當銀行家現有的資金不能滿足顧客尚需的貸款數額時,對顧客的貸款可推遲支付,但總能使顧客在有限的時間裡得到貸款;
(4) 當顧客得到所需的全部資金後,一定能在有限的時間裡歸還所有的資金.
作業系統按照銀行家制定的規則為程序分配資源,當程序首次申請資源時,要測試該程序對資源的最大需求量,如果系統現存的資源可以滿足它的最大需求量則按當前的申請量分配資源,否則就推遲分配。當程序在執行中繼續申請資源時,先測試該程序本次申請的資源數是否超過了該資源所剩餘的總量。若超過則拒絕分配資源,若能滿足則按當前的申請量分配資源,否則也要推遲分配。
嵌入式 GDB除錯死鎖示例
死鎖 一種情形,此時執行程式中兩個或多個執行緒發生永久堵塞 等待 每個執行緒都在等待被 其他執行緒占用並堵塞了的資源。例如,如果執行緒a鎖住了記錄1並等待記錄2,而執行緒b鎖住了記錄2並等待記錄1,這樣兩個執行緒就發生了死鎖現象。gdb除錯死鎖的方法 gdb attach pid 找到 lll lo...
嵌入式的gdb除錯
在開發過程中有很多問題如果用gdb進行除錯跟蹤會大大提高效率,但是我發現不少同事對於gdb除錯概念比較模糊,特別是跨平台的除錯,以至於放棄用gdb除錯而影響排除bug的效率。因此我這裡主要對跨平台除錯做乙個簡要的說明。我們對機頂盒上的軟體進行除錯主要有兩種方式,本地除錯和遠端除錯。遠端除錯還有乙個問...
嵌入式系統 GDB除錯
心得體會 gdb gdb全稱 gnu debugger,是gnu工程為gnu作業系統開發的偵錯程式。它可以用於除錯c c objective c pascal ada等語言編寫的程式。被除錯的程式可以跟gdb執行於同一臺電腦,也可執行於不同電腦。file 裝入想要除錯的可執行檔案 kill 終止正在...