Atitit.線程 死鎖 跑飛 的檢測與自動解除 與手動解除死鎖 java c# .net php javascript. javascript
1. 現象::主程序卡住無反應,多行任務不往下執行 1php
2. 緣由::使用jv jprofile查看線程,原來倆個線程死鎖了。。 1java
4. 自動檢測與解除死鎖::使用看門狗watchdog 2數據庫
程序的跑飛,而陷入死循環,程序的正常運行被打斷, 系統沒法繼續工做,會形成整個系統的陷入停滯狀態,
不像數據庫,許多數據庫均可以自動解除死鎖,而後安排事務重作。。
Java的語言級別無此功能,只能本身在類庫級別實現次功能了。。
做者:: 老哇的爪子 Attilax 艾龍, EMAIL:1466519819@qq.com
轉載請註明來源: http://blog.csdn.net/attilax
死鎖檢測與恢復是指系統設有專門的機構,當死鎖發生時,該機構可以檢測到死鎖發生的位置和緣由,並能經過外力破壞死鎖發生的必要條件,從而使得併發進程從死鎖狀態中恢復出來。
專門用於監測程序運行狀態的芯片
Linux 自帶了一個 watchdog 的實現,用於監視系統的運行,包括一個內核 watchdog module 和一個用戶空間的 watchdog 程序。[1]
內核 watchdog 模塊經過 /dev/watchdog 這個字符設備與用戶空間通訊。用戶空間程序一旦打開 /dev/watchdog 設備,就會致使在內核中啓動一個 1分鐘的定時器,此後,用戶空間程序須要保證在 1分鐘以內向這個設備寫入數據,每次寫操做會致使從新設定定時器。若是用戶空間程序在 1分鐘以內沒有寫操做,定時器到期會致使一次系統 reboot 操做。[1]
看門狗,又叫 watchdog timer,是一個定時器電路, 通常有一個輸入,叫喂狗, 正常工做的時候,每隔一段時間輸出一個信號到喂狗端,給 WDT 清零,若是超過規定時間不喂狗(通常在程序跑飛時),WDT 定時超過,就會給出一個復位信號到 復位. 防止 死機. 看門狗的做用就是防止程序發生死循環或者說程序跑飛。
(1)最簡單,最經常使用的方法就是進行系統的從新啓動,不過這種方法代價很大,它意味着在這以前全部的進程已經完成的計算工做都將付之東流,包括參與死鎖的那些進程,以及未參與死鎖的進程。
終止參與死鎖的進程,收回它們佔有的資源,從而解除死鎖。這時又分兩種狀況:一次性撤消參與死鎖的所有進程,剝奪所有資源;或者逐步撤消參與死鎖的進程,逐步收回死鎖進程佔有的資源。通常來講,選擇逐步撤消的進程時要按照必定的原則進行,目的是撤消那些代價最小的進程,好比按進程的優先級肯定進程的代價;考慮進程運行時的代價和與此進程相關的外部做業的代價等因素。
即讓參與死鎖的進程回退到沒有發生死鎖前某一點處,並由此點處繼續執行,以求再次執行時再也不發生死鎖。雖然這是個較理想的辦法,可是操做起來系統開銷極大,要有堆棧這樣的機構記錄進程的每一步變化,以便從此的回退,有時這是沒法作到的。
進程回退策略,即讓參與死鎖的進程回退到沒有發生死鎖前某一點處,並由此點處繼續執行,以求再次執行時再也不發生死鎖。雖然這是個較理想的辦法,可是操做起來系統開銷極大,要有堆棧這樣的機構記錄進程的每一步變化,以便從此的回退,有時這是沒法作到的
包裝系統thread ,每當啓動線程的時候兒,向線程註冊表格插入線程..退出的時候兒clr...
要是死鎖蘭,馬clr,能查詢,在手動clr...
看門狗的應用,使系統能夠在無人狀態下實現連續工做,其工做原理是:看門狗芯片和系統的一個I/O引腳相連(純軟件中經過一個變量相連),該I/O引腳經過程序控制它定時地往看門狗的這個引腳上送入高電平(或低電平,軟件中是送入一個變量值),這一程序語句是分散地放在系統其餘控制語句中間的,一旦系統因爲干擾形成程序跑飛後而陷入某一程序段進入死循環狀態時,寫看門狗引腳的程序便不能被執行,這個時候,看門狗電路就會因爲得不到系統送來的信號,便在它和系統復位引腳相連的引腳上送出一個復位信號,使系統發生復位,即程序從程序存儲器的起始位置開始執行,這樣便實現了系統的自動復位.
在系統運行之後也就啓動了看門狗的計數器,看門狗就開始自動計數,若是到了必定的時間還不去清看門狗,那麼看門狗計數器就會溢出從而引發看門狗中斷,形成系統復位。因此在使用有看門狗的芯片時要注意清看門狗。
硬件看門狗是利用了一個定時器,來監控主程序的運行,也就是說在主程序的運行過程當中,咱們要在定時時間到以前對定時器進行復位若是出現死循環,或者說PC指針不能回來。那麼定時時間到後就會使系統復位
軟件看門狗技術的原理和這差很少,只不過是用軟件的方法實現,咱們仍是以51系列來說,咱們知道在51系統中有兩個定時器,咱們就能夠用這兩個定時器來對主程序的運行進行監控。咱們能夠對T0設定必定的定時時間,當產生定時中斷的時候對一個變量進行賦值,而這個變量在主程序運行的開始已經有了一個初值,在這裏咱們要設定的定時值要小於主程序的運行時間,這樣在主程序的尾部對變量的值進行判斷,若是值發生了預期的變化,就說明T0中斷正常,若是沒有發生變化則使程序復位。對於T1咱們用來監控主程序的運行,咱們給T1設定必定的定時時間,在主程序中對其進行復位,若是不能在必定的時間裏對其進行復位,T1 的定時中斷就會使系統復位。在這裏T1的定時時間要設的大於主程序的運行時間,給主程序留有必定的的裕量。而T1的中斷正常與否咱們再由T0定時中斷子程序來監視。這樣就構成了一個循環,T0監視T1,T1監視主程序,主程序又來監視T0,從而保證系統的穩定運行。
系統軟件"看門狗"的設計思路:
1.看門狗定時器T0的設置。在初始化程序塊中設置T0的工做方式,並開啓中斷(timer事件)和計數功能。
2.計算主控程序循環一次的耗時。考慮系統各功能模塊及其循環次數,本系統主控制程序的運行時間約爲30。系統設置"看門狗"定時器T0定時60s
3.主控程序的每次循環都將刷新T0的初值。如程序進入"死循環"而T0的初值在60s內未被刷新,這時"看門狗"定時器T0將溢出並申請中斷。
3.設計T0溢出所對應的中斷服務程序。此子程序只須一條指令,即在T0對應的中斷向量地址(000BH)(JAVA中是一個線程的引用),寫入復位,對任務從新進行初始化並得到正確的執行順序
參考Java出現死鎖了? - 推酷.htm
atitit 提高數據庫死鎖處理總結 - attilax的專欄 - 博客頻道 - CSDN.NET.htm
watchdog_百度百科.htm
java 死鎖產生緣由及解鎖 - hijiankang的專欄 - 博客頻道 - CSDN.NET.htm