所謂死鎖
:是指兩個或兩個以上的程序在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去。
那麼為什麼會產生死鎖呢?1.
因為系統資源不足。 2.
程序執行推進的順序不合適。
3.資源分配不當。
而產生死鎖的條件有四個:1.
互斥條件:所謂互斥就是程序在某一時間內獨佔資源。 2.
請求與保持條件:乙個程序因請求資源而阻塞時,對已獲得的資源保持不放。 3.
不剝奪條件
:程序已獲得資源,在末使用完之前,不能強行剝奪。 4.
迴圈等待條件
:若干程序之間形成一種頭尾相接的迴圈等待資源關係。
!locks 可以檢視所有執行緒占用的鎖資訊,包含擁有鎖的執行緒,以及有多少個執行緒在等待這把鎖!
ntdll!rtlentercriticalsection的第乙個引數就代表的互斥量或鎖,可以通過!cs ******x 可以看到對應的互斥量資訊(包含擁有這個鎖的執行緒id以及對應的訊號量)
底層的臨界區資料結構為_rtl_critical_section,所以
也可以通過dt命令去檢視dt ntdll!_rtl_critical_section 004030f4,獲取到的資訊和!cs 004030f4基本是一致的!
0:006> dt ntdll!_rtl_critical_section
+0x000 debuginfo : ptr64 _rtl_critical_section_debug
+0x008 lockcount : int4b
+0x00c recursioncount : int4b
+0x010 owningthread : ptr64 void
+0x018 locksemaphore : ptr64 void
+0x020 spincount : uint8b
lockcount預設為-1,如果》=0,則表示有執行緒進入到臨界區,要找出有多少執行緒正在等待進入臨界區,可以:
正在等待的執行緒數量=lockcount - recursioncount + 1。
recursioncount:表示同乙個執行緒進入到臨界區多少次,預設為0。
owningthread:如果有執行緒進入到臨界區,這是進入臨界區的執行緒id。
locksemaphore:這是乙個自動重置事件,當執行緒試圖進入乙個其他執行緒占用的臨界區時,將會建立這個事件。
spincount:自旋鎖的次數。
進一步看debuginfo結構:
0:001> dt _rtl_critical_section_debug
02.ntdll!_rtl_critical_section_debug
03. +0x000 type : uint2b
04. +0x002 creatorbacktraceindex : uint2b
05. +0x004 criticalsection : ptr32 _rtl_critical_section
06. +0x008 processlockslist : _list_entry
07. +0x010 entrycount : uint4b
08. +0x014 contentioncount : uint4b
09. +0x018 flags : uint4b
10. +0x01c creatorbacktraceindexhigh : uint2b
11. +0x01e spareushort : uint2b
processlockslist:任何程序在作業系統中都將維護一張鍊錶,其中包含了在這個程序中所有處於活躍狀態的臨界區,你可以通過這個節點中flink和blink來遍歷程序中的臨界區鍊錶。
entrycount:每當執行緒嘗試進入乙個已經被其他執行緒擁有的臨界區並由此進入到等待狀態,這個域的值都會被加1。
ntdll!ntwaitforsingleobject
ntstatus winapi ntwaitforsingleobject( _in_ handle handle, _in_ boolean alertable, _in_ plarge_integer timeout );
第乙個引數控制代碼 可以通過!handle *** f去檢視詳細的資訊
?ntdll!__rtluserthreadstart+0x20 可以檢視對應的記憶體位址
檢視資料庫鎖表以及解鎖
今天啟動專案時發現專案啟動報錯could not open jdbc connection for transaction,weblogic控制台上伺服器也有警告。網上提示是根據實際操做確認連線池不足,程式在獲取連線完成資料庫操作後,沒有及時關閉連線。但是按照網上提供的方法改了之後仍然報錯,後發現是...
表鎖和行鎖互相之間的關係以及互斥規則是什麼呢?
mysql的表鎖,其實是極為雞肋的乙個東西,幾乎一般很少會用到,表鎖分為兩種,一種就是表鎖,一種是表級的意向鎖。首先說表鎖,這個表鎖,可以用如下語法來加 lock tables read 這是加表級共享鎖 lock tables write 這是加表級獨佔鎖 一般來講,幾乎沒人會用這兩個語法去加表鎖...
mysql常用儲存引擎以及悲觀鎖與樂觀鎖
一.mysql常用儲存引擎 1 myisam儲存引擎 不支援事務,也不支援外來鍵,優勢是訪問速度快,對事務完整性沒有要求或者以選擇,插入的為主應用基本上可以用這個引擎來建立 表可以配合鎖,實現作業系統下的複製備份,遷移。使用表級鎖,併發性差。支援全文檢索 mysql inonodb在5.6以後也支援...