這篇文章主要講解了“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)死鎖。
進(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)喂狗,而被狗咬死。
進(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ò)誤:
假設(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ī):
X 軸表示進(jìn)程 P 執(zhí)行的時(shí)間軸,Y 軸表示進(jìn)程 Q 執(zhí)行的時(shí)間軸。
這幅圖依據(jù)兩個(gè)進(jìn)程并發(fā)時(shí)間點(diǎn)不同而給出了 6 種執(zhí)行線路:
感謝各位的閱讀,以上就是“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)注!