核心提供自旋鎖、信号量等鎖形式的工具,具體不再贅述。
Linux核心死鎖主要分為分為兩種:D狀态死鎖和R狀态死鎖。
一、D狀态死鎖檢測
D狀态死鎖:程序長時間處于TASK_UNINTERRUPTIBLE而不恢複的狀态。程序處于TASK_UNINTERRUPTIBLE狀态,不響應其他信号(kill -9),保證一些核心原子操作不被意外中斷。但這種狀态時間長就表示程序異常了,需要處理。
核心D狀态死鎖檢測就是hung_task機制,主要代碼就在kernel/hung_task.c檔案。
具體實作原理:
2.調用do_each_thread,while_each_thread宏周遊所有的程序資訊,如果有D狀态程序,則檢查最近切換次數和task計算是否一緻,即最近是否有排程切換,如果一緻,則沒有切換,列印相關資訊,并根據sysctl_hung_task_panic開關決定是否重新開機。
對應使用者态控制的proc接口有:
/proc/sys/kernel/hung_task_timeout_secs,hung_task_panic等。
二、R狀态死鎖檢測
補充:lockdep不是所謂的死鎖。
核心R狀态死鎖檢測機制就是lockdep機制,入口即是lockup_detector_init函數。
2.hrtimer定時器調用watchdog_timer_fn進行清狗的時間檢查,而線程則每次重置清狗時間,如果watchdog_timer_fn發現狗的重置時間已經和目前時間差出危險值,則根據開關進行panic處理。
/proc/sys/kernel/watchdog_thresh,softlockup_panic等。
整個死鎖檢測機制比較簡單,但cpu_callback函數結構性設計巧妙,可以在很多地方參考使用。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
static int __cpuinit
cpu_callback(struct notifier_block *nfb, unsigned long action, void *hcpu)
{
int hotcpu = (unsigned long)hcpu;
switch (action) {
case CPU_UP_PREPARE:
case CPU_UP_PREPARE_FROZEN:
watchdog_prepare_cpu(hotcpu);
break;
case CPU_ONLINE:
case CPU_ONLINE_FROZEN:
if (watchdog_enabled)
watchdog_enable(hotcpu);
#ifdef CONFIG_HOTPLUG_CPU
case CPU_UP_CANCELED:
case CPU_UP_CANCELED_FROZEN:
watchdog_disable(hotcpu);
case CPU_DEAD:
case CPU_DEAD_FROZEN:
#endif /* CONFIG_HOTPLUG_CPU */
}
/*
* hardlockup and softlockup are not important enough
* to block cpu bring up. Just always succeed and
* rely on printk output to flag problems.
*/
return NOTIFY_OK;
}
—結束—
<a href="http://www.oenhan.com/kernel-deadlock-check">http://www.oenhan.com/kernel-deadlock-check</a>
【新浪微網誌】 張昺華--sky
【twitter】 @sky2030_
【facebook】 張昺華 zhangbinghua
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利.