[問題] spinlock問題

看板C_and_CPP (C/C++)作者 (123)時間1年前 (2023/01/30 22:25), 編輯推噓6(6015)
留言21則, 6人參與, 1年前最新討論串1/1
板友們晚安 我想請教一個Linux Kernel的問題,但看了Linux板,感覺不是在討論code。 所以我就來這裡發文看看。若我在這邊發文不適合可以在下面回文,我會 再刪除,謝謝。 我在【知乎】這個平台看到有關於spin_lock_irq()的介紹 https://reurl.cc/eWe4lb 裡面有個圖關於spin_lock_irq(&lock1)後再一次spin_lock_irq(&lock2) 緊接著spin_unlock_irq(&lock2)後,CPU發生了interrupt,若好死不死 這ISR內要執行lock1所保護的critical section,由於前面已有task獲取 到lock1的鎖了,ISR內鐵定拿不到lock1便會deadlock. 其實我不太知道為何deadlock的原因。查了網路上的說明更加混亂了... 這有兩種deadlock的原因請問是哪一種呢? 1.ISR內因獲得不到鎖所以永久的spin,所以先前拿到鎖的task也因此無法解鎖. 2.先前拿到鎖的task在被中斷後狀態變成TASK_INTERRUPT,schedual無法再調度 task使之有機會解鎖,這意味著ISR內不會永久spin,且有一定的時間霸佔CPU? 希望能有kernel高手能解答小弟疑惑@@,謝謝。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.224.93.106 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1675088723.A.42F.html

01/30 22:36, 1年前 , 1F
ISR lock要等被interrupt的task unlock->可是cpu不會切
01/30 22:36, 1F

01/30 22:36, 1年前 , 2F
永遠等不到task unlock-> deadlock
01/30 22:36, 2F

01/30 22:52, 1年前 , 3F
有LinuxDev版。
01/30 22:52, 3F

01/30 23:27, 1年前 , 4F
原因如樓上,另外這主要是說明 spin_lock_irqsave 的需求
01/30 23:27, 4F

01/30 23:28, 1年前 , 5F
因 lock_irq 沒有處理 nested,導致 unlock_irq(&lock2)時
01/30 23:28, 5F

01/30 23:29, 1年前 , 6F
就立即 enable IRQ,因此進入 deadlock 狀態。
01/30 23:29, 6F

01/30 23:30, 1年前 , 7F
修正上述: 有機會進入 deadlock 狀態
01/30 23:30, 7F

01/30 23:31, 1年前 , 8F
改用 lock_irqsave 後才能在 unlock 時回復先前 IRQ 狀態
01/30 23:31, 8F

01/30 23:32, 1年前 , 9F
而非無腦啟用 IRQ。進而解決了誤啟用 IRQ 導致的 deadlock
01/30 23:32, 9F

01/31 21:10, 1年前 , 10F
請問原因是我列的第一種情況嗎? ^^" 再確認一下
01/31 21:10, 10F

02/02 19:50, 1年前 , 11F
你這句「schedual無法再調度
02/02 19:50, 11F

02/02 19:50, 1年前 , 12F
task使之有機會解鎖」是啥意思?沒法被排程的話,給定t
02/02 19:50, 12F

02/02 19:50, 1年前 , 13F
ask怎麼解開原先獲得的鎖?
02/02 19:50, 13F

02/02 21:37, 1年前 , 14F
我的意思是想說第2, ISR不會霸佔CPU, OS透過schedual
02/02 21:37, 14F

02/02 21:40, 1年前 , 15F
讓其他task使用CPU,只是不會給有lock的task。
02/02 21:40, 15F

02/02 21:41, 1年前 , 16F
因為也是從網路上看的,我也不知道是不是第2點而造成
02/02 21:41, 16F

02/02 21:42, 1年前 , 17F
deadlock
02/02 21:42, 17F

02/04 10:01, 1年前 , 18F
ISR 霸佔 CPU 的理由是,interrupt 會設定較高的優先權
02/04 10:01, 18F

02/04 10:02, 1年前 , 19F
優先處理,但 ISR 又卡死在搶佔 lock 的工作
02/04 10:02, 19F

02/04 10:03, 1年前 , 20F
時間到了 timer interrupt 跳起來,CPU 進到 scheduler
02/04 10:03, 20F

02/04 10:04, 1年前 , 21F
scheduler 會選定優先權高的程序,也就是 ISR 繼續執行
02/04 10:04, 21F
文章代碼(AID): #1ZrzDJGl (C_and_CPP)
文章代碼(AID): #1ZrzDJGl (C_and_CPP)