static inline void raw_spin_lock(raw_spinlock_t *lock)
{
preempt_disable();
do_raw_spin_lock(lock);
}
在真正的上鎖前,為何要調用preempt_disable()來關閉搶占?
==》
1.如果核心可搶占, 單CPU
process1通過系統調用進入核心态,如果其需要通路臨界區,則在進入臨界區前獲得鎖,上鎖,V=1,然後進入臨界區
如果process1在核心态執行臨界區代碼的過程中發生了一個外部中斷,當中斷處理函數傳回時,因為核心的可搶占性,此時将會出現一個排程點,如果CPU的運作隊列中出現了一個比目前被中斷程序process1優先級更高的程序process2,那麼被中斷的程序将會被換出處理器,即便此時它正運作于核心态。
如果process2也通過系統調用進入核心态,且要通路相同的臨界區,則會形成死鎖(因為擁有鎖的Process1永沒有機會再運作進而釋放鎖)
2.如果核心可搶占,多CPU
CPU1上的process1通過系統調用進入核心态,如果其需要通路臨界區,則在進入臨界區前獲得鎖,上鎖,V=1,然後進入臨界區
如果process1在核心态執行臨界區代碼的過程中發生了一個外部中斷,當中斷處理函數傳回時,因為核心的可搶占性,此時将會出現一個排程點,如果CPU1的運作隊列中出現了一個比目前被中斷程序process1優先級更高的程序process2,那麼被中斷的程序process1将會被換出處理器,即便此時它正運作于核心态。
如果CPU2上的process3也通過系統調用進入核心态,且要通路相同的臨界區,也一樣形成死鎖
為了防止系統進入死鎖狀态,需要在真正上鎖前,調用preempt_disable()來關閉搶占
【新浪微網誌】 張昺華--sky
【twitter】 @sky2030_
【facebook】 張昺華 zhangbinghua
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利.