真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

linux死鎖是什么

這篇文章主要講解了“l(fā)inux死鎖是什么”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“l(fā)inux死鎖是什么”吧!

創(chuàng)新互聯(lián)是一家專業(yè)提供湖南企業(yè)網(wǎng)站建設(shè),專注與成都做網(wǎng)站、網(wǎng)站制作、成都外貿(mào)網(wǎng)站建設(shè)、H5開發(fā)、小程序制作等業(yè)務(wù)。10年已為湖南眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)的建站公司優(yōu)惠進(jìn)行中。

死鎖概念

死鎖是指多個(gè)進(jìn)程(線程)因?yàn)殚L(zhǎng)久等待已被其他進(jìn)程占有的的資源而陷入阻塞的一種狀態(tài)。當(dāng)?shù)却馁Y源一直得不到釋放,死鎖會(huì)一直持續(xù)下去。死鎖一旦發(fā)生,程序本身是解決不了的,只能依靠外部力量使得程序恢復(fù)運(yùn)行,例如重啟,開門狗復(fù)位等。

Linux 提供了檢測(cè)死鎖的機(jī)制,主要分為 D 狀態(tài)死鎖和 R 狀態(tài)死鎖。

  • D 狀態(tài)死鎖

進(jìn)程等待 I/O 資源無(wú)法得到滿足,長(zhǎng)時(shí)間(系統(tǒng)默認(rèn)配置 120 秒)處于 TASK_UNINTERRUPTIBLE 睡眠狀態(tài),這種狀態(tài)下進(jìn)程不響應(yīng)異步信號(hào)(包括 kill -9)。如:進(jìn)程與外設(shè)硬件的交互(如 read),通常使用這種狀態(tài)來(lái)保證進(jìn)程與設(shè)備的交互過(guò)程不被打斷,否則設(shè)備可能處于不可控的狀態(tài)。對(duì)于這種死鎖的檢測(cè) Linux 提供的是 hung task 機(jī)制。觸發(fā)該問(wèn)題成因比較復(fù)雜多樣,可能因?yàn)?synchronized_irq、mutex lock、內(nèi)存不足等。D 狀態(tài)死鎖只是局部多進(jìn)程間互鎖,一般來(lái)說(shuō)只是 hang 機(jī)、凍屏,機(jī)器某些功能沒(méi)法使用,但不會(huì)導(dǎo)致沒(méi)喂狗,而被狗咬死。

  • R 狀態(tài)死鎖

進(jìn)程長(zhǎng)時(shí)間(系統(tǒng)默認(rèn)配置 60 秒)處于 TASK_RUNNING 狀態(tài)壟斷 CPU 而不發(fā)生切換,一般情況下是進(jìn)程關(guān)搶占或關(guān)中斷后長(zhǎng)時(shí)候執(zhí)行任務(wù)、死循環(huán),此時(shí)往往會(huì)導(dǎo)致多 CPU 間互鎖,整個(gè)系統(tǒng)無(wú)法正常調(diào)度,導(dǎo)致喂狗線程無(wú)法執(zhí)行,無(wú)法喂狗而最終看門狗復(fù)位的重啟。該問(wèn)題多為原子操作,spinlock 等 CPU 間并發(fā)操作處理不當(dāng)造成。本文所介紹的 Lockdep 死鎖檢測(cè)工具檢測(cè)的死鎖類型就是 R 狀態(tài)死鎖。

常見錯(cuò)誤:

  1. AA: 重復(fù)上鎖
  2. ABBA: 曾經(jīng)使用 AB 順序上鎖,又使用 BA 上鎖
  3. ABBCCA: 這種類型是 ABBA 的擴(kuò)展。AB 順序 , AB 順序,CA 順序。這種鎖人工很難發(fā)現(xiàn)。
  4. 多次 unlock
 

AB-BA 死鎖的形成

假設(shè)有兩處代碼(比如不同線程的兩個(gè)函數(shù) thread_P 和 thread_Q)都要獲取兩個(gè)鎖(分別為 lockA 和 lockB),如果 thread_P 持有 lockA 后再去獲取 lockB,而此時(shí)恰好由 thread_Q 持有 lockB 且它也正在嘗試獲取 lockA,那么此時(shí)就是處于死鎖的狀態(tài),這是一個(gè)最簡(jiǎn)單的死鎖例子,也即所謂的 AB-BA 死鎖。

thread_P()
{
    ......
    spin_lock(&lockA);
    spin_lock(&lockB);

    spin_unlock(&lockA);
    spin_unlock(&lockB);
    ......
}
thread_Q()
{
    ......
    spin_lock(&lockB);
    spin_lock(&lockA);

    spin_unlock(&lockB);
    spin_unlock(&lockA);
    ......
}
 

下面接合時(shí)間軸來(lái)觀察死鎖發(fā)生的時(shí)機(jī):

linux死鎖是什么

X 軸表示進(jìn)程 P 執(zhí)行的時(shí)間軸,Y 軸表示進(jìn)程 Q 執(zhí)行的時(shí)間軸。

這幅圖依據(jù)兩個(gè)進(jìn)程并發(fā)時(shí)間點(diǎn)不同而給出了 6 種執(zhí)行線路:

  1. Q 獲得 B,然后獲得 A;然后釋放 B,然后釋放 A;此時(shí) P 執(zhí)行時(shí),它可以獲得全部資源
  2. Q 獲得 B,然后獲得 A;此時(shí) P 執(zhí)行并阻塞在對(duì) A 的請(qǐng)求上;Q 釋放 B 和 A,當(dāng) P 恢復(fù)執(zhí)行時(shí),它可以獲得全部資源
  3. Q 獲得 B,然后 P 執(zhí)行獲得 A;此時(shí) Q 阻塞在對(duì) A 的請(qǐng)求上;P 阻塞在對(duì) B 的請(qǐng)求上,大家都在互相等待各自的資源而死鎖
  4. P 獲得 A,然后 Q 執(zhí)行獲得 B;此時(shí) P 阻塞在對(duì) B 的請(qǐng)求上;Q 阻塞在對(duì) A 的請(qǐng)求上,大家都在互相等待各自的資源而死鎖
  5. P 獲得 A,然后獲得 B;此時(shí) Q 執(zhí)行并阻塞在對(duì) B 的請(qǐng)求上;P 釋放 A 和 B,當(dāng) Q 恢復(fù)執(zhí)行時(shí),它可以獲得全部資源
  6. P 獲得 A,然后獲得 B;然后釋放 A,然后釋放 B;此時(shí) Q 執(zhí)行時(shí),它可以獲得全部資源

感謝各位的閱讀,以上就是“l(fā)inux死鎖是什么”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)linux死鎖是什么這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!


網(wǎng)頁(yè)標(biāo)題:linux死鎖是什么
文章網(wǎng)址:http://weahome.cn/article/jjgdoc.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部