Linux2.6以後支持內核搶佔,在開發過程中內核搶佔經常會造成一些競態問題,分析起來比較麻煩,所以有必要總結一下觸發搶佔的因素和時機。
一、觸發搶佔的因素
1、進程調用sleep或exit等函數進行狀態切換,這些函數通過系統調用進入內核會主動調用schedule。
2、在時鐘中斷處理程序檢查到進程時間片用完,置位need_resched。
3、在中斷處理程序或者系統調用中主動調用schedule。
4、在中斷處理程序或者系統調用中由於喚醒等動作導致更高優先級的進程進入就緒狀態,設置need_resched標誌。
5、在中斷處理程序或者系統調用中主動置位need_resched。
二、搶佔發生的時機
1、在中斷處理或系統調用完成後,返回用戶態或內核態時檢查到need_resched被置位,發生搶佔。
2、在相關操作的調用點觸發schedule直接被調用,從而發生搶佔。
(完)