上下文切換,也就是從乙個可執行程序切換到還有乙個可執行程序。程序切換schedule函式呼叫context_switch()函式完畢下面工作:
1.呼叫定義在中的switch_mm(),該函式負責把虛擬記憶體從上乙個程序對映切換到新程序中。
2.呼叫定義在中的switch_to(),該函式負責從上乙個程序的處理器狀態切換到新程序的處理器狀態。這包含儲存、恢復棧資訊和暫存器資訊。
前面看到schedule函式呼叫有非常多種情況,全然依靠使用者來呼叫不能達到非常好的效果。核心須要推斷什麼時候呼叫schedule,核心提供了乙個need_resched標誌來表明是否須要又一次執行一次排程:
1當某個程序耗盡它的時間片時,scheduler_tick()就會設定這個標誌;
2當乙個優先順序高的程序進入可執行狀態的時候,try_to_wake_up()也會設定這個標誌。
每乙個程序都包括乙個need_resched標誌,這是由於訪問程序描寫敘述符內的數值要比訪問乙個全域性變數快
使用者搶占
核心即將返回使用者空間時候,假設need_resched標誌被設定,會導致schedule函式被呼叫,此時發生使用者搶占。
使用者搶占在下面情況時產生:
1.從系統調返回使用者空間。
2.從中斷處理程式返回使用者空間。
核心搶占
僅僅要又一次排程是安全的,那麼核心就能夠在不論什麼時間搶占正在執行的任務。
什麼時候又一次排程才是安全的呢?僅僅要沒有持有鎖,核心就能夠進行搶占。
鎖是非搶占區域的標誌。因為核心是支援smp的,所以,假設沒有持有鎖,那麼正在執行的**就是可又一次匯入的,也就是能夠搶占的。
核心搶占會發生在:
1.當從中斷處理程式正在執行,且返回核心空間之前。
2.當核心**再一次具有可搶占性的時候。
3.假設核心中的任務顯式的呼叫schedule()。
4.假設核心中的任務堵塞(這相同也會導致呼叫schedule())。
4 3 程序排程 搶占和上下文切換
上下文切換,也就是從乙個可執行程序切換到另乙個可執行程序。核心提供了乙個need resched標誌來表明是否需要重新執行一次排程。再返回使用者空間以及從中斷返回的時候,核心也會檢查need resched標誌。每個程序都包含乙個need resched標誌,這是因為訪問程序描述符內的數值要比訪問乙...
4 3 程序排程 搶占和上下文切換
上下文切換,也就是從乙個可執行程序切換到另乙個可執行程序。核心提供了乙個need resched標誌來表明是否需要重新執行一次排程。再返回使用者空間以及從中斷返回的時候,核心也會檢查need resched標誌。每個程序都包含乙個need resched標誌,這是因為訪問程序描述符內的數值要比訪問乙...
Linux2 6 程序搶占和上下文切換
上下文切換,也就是從乙個可執行程序切換到另乙個可執行程序,由定義在kernel sched.c中的context switch 函式負責處理。每當乙個新的程序被選出來準備投入執行的時候,schedule 就會呼叫該函式。它完成了兩相基本工作 1.呼叫宣告在中的switch mm 該函式負責把虛擬記憶...