加入星計(jì)劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專(zhuān)業(yè)用戶(hù)
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長(zhǎng)期合作伙伴
立即加入
  • 正文
  • 推薦器件
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

Linux記一次spin_lock死鎖優(yōu)化經(jīng)驗(yàn)

05/28 16:16
2035
閱讀需 5 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

哈嘍,大家好,我是程序員秘書(shū)LittleG。

上篇:虹膜識(shí)別技術(shù)原理以及現(xiàn)狀和未來(lái)

前言

死鎖是很常見(jiàn)的一種內(nèi)核故障。最常見(jiàn)的,就是如果一個(gè)task在已經(jīng)持有某個(gè)鎖的情況下,再次嘗試獲取同一個(gè)鎖,就會(huì)形成死鎖局面。發(fā)生死鎖的場(chǎng)景有很多,常見(jiàn)的情況可能有,可能是在同一個(gè)task中鎖使用不當(dāng);也可能是兩個(gè)task有資源競(jìng)爭(zhēng)和依賴(lài),形成互鎖互等;也可能是某個(gè)task拿了鎖后又被某個(gè)中斷搶占,之后又在等拿相同的鎖。

最近剛分析和處理了一個(gè)死鎖問(wèn)題,就是一個(gè)task和一個(gè)中斷拿相同鎖出現(xiàn)的死鎖問(wèn)題,最后是通過(guò)替換拿鎖接口函數(shù)解決的。主要是涉及到spin_trylock_irq()?和?spin_trylock()?這兩個(gè)函數(shù)的使用場(chǎng)景和差別,記錄學(xué)習(xí)之。

正文

spin_trylock_irq()?和?spin_trylock()?都是Linux內(nèi)核中用于嘗試獲取自旋鎖的函數(shù),但它們?cè)谑褂脠?chǎng)景和行為上有所區(qū)別,主要體現(xiàn)在對(duì)中斷的處理上。

spin_trylock()

功能說(shuō)明:

spin_trylock()?是一個(gè)非阻塞的自旋鎖獲取函數(shù),會(huì)嘗試立即獲取自旋鎖。如果鎖已被其他CPU持有,該函數(shù)會(huì)立即返回失?。ㄍǔ7祷?),而不會(huì)讓調(diào)用者進(jìn)入等待狀態(tài)。主要用于那些無(wú)法承受阻塞開(kāi)銷(xiāo)或不適合睡眠的上下文。

中斷處理:

調(diào)用?spin_trylock()?時(shí),當(dāng)前CPU的中斷狀態(tài)不變。也就是說(shuō),如果在中斷上下文中調(diào)用此函數(shù),中斷仍然保持禁止?fàn)顟B(tài);而在進(jìn)程上下文中調(diào)用,則中斷是啟用的。

spin_trylock_irq()

功能說(shuō)明:

spin_trylock_irq()?與?spin_trylock()?類(lèi)似,也是嘗試立即獲取自旋鎖,如果不能立即獲取則返回失敗。但是,它還額外包含了一層對(duì)中斷的管理。

中斷處理:

在嘗試獲取鎖之前,spin_trylock_irq()?會(huì)臨時(shí)禁用本地中斷(如果之前是啟用狀態(tài)),并在操作完成后恢復(fù)中斷的原始狀態(tài)。這意味著,無(wú)論是在中斷上下文還是進(jìn)程上下文中調(diào)用,它都會(huì)確保在嘗試獲取鎖期間中斷是被禁止的,從而避免了在獲取鎖的過(guò)程中被中斷打斷的復(fù)雜性。這樣設(shè)計(jì)實(shí)現(xiàn)顯而易見(jiàn)提高了鎖操作的原子性和安全性,但需要注意的是,可能會(huì)在某些對(duì)中斷響應(yīng)時(shí)間敏感的場(chǎng)景中引入延遲。

總結(jié)

spin_trylock_irq()?與?spin_trylock()?兩個(gè)函數(shù)都是非阻塞式的自旋鎖獲取操作,不成功即返回,都不會(huì)引起調(diào)用者睡眠。

主要區(qū)別在于對(duì)中斷的處理上。spin_trylock()?不改變當(dāng)前中斷狀態(tài),而?spin_trylock_irq()?則會(huì)在操作前臨時(shí)禁用中斷,操作后恢復(fù)中斷狀態(tài),確保了操作的原子性。

至于選擇使用哪個(gè)函數(shù)取決于具體的上下文需求。

如果明確不希望在鎖獲取過(guò)程中被中斷打斷的情況下,或者處于一個(gè)可能需要明確控制中斷狀態(tài)的上下文中,則需要使用spin_trylock_irq()?。而在不需要特別處理中斷,或者明確知道當(dāng)前中斷狀態(tài)已滿(mǎn)足要求的情況下,以及追求性能的情況下,可以考慮使用?spin_trylock()。

推薦器件

更多器件
器件型號(hào) 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊(cè) ECAD模型 風(fēng)險(xiǎn)等級(jí) 參考價(jià)格 更多信息
KSZ8463RLI 1 Microchip Technology Inc DATACOM, MANCHESTER ENCODER

ECAD模型

下載ECAD模型
$8.15 查看
SMD2440-011 1 Honeywell Microelectronics & Precision Sensors Photo Transistor Detector, Surface Mount, 3.81 X 2.54 X 2.10 MM, CERAMIC PACKAGE-SME2440
$8.61 查看
SDINBDG4-8G-XI1 1 Western Digital Corp Flash,
$56.03 查看

相關(guān)推薦

電子產(chǎn)業(yè)圖譜

記錄和分享C/C++、Linux、ARM、Android、IoT相關(guān)知識(shí)。技術(shù)相伴于生活和成長(zhǎng),愿你我永為少年,心中有火,眼中有光,始保熱情。