天天看點

Linux核心死鎖檢測機制【轉】

核心提供自旋鎖、信号量等鎖形式的工具,具體不再贅述。

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

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利.

繼續閱讀