真正的上鎖前,爲何要調用preempt_disable()來關閉搶佔的case

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()來關閉搶佔
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章