參考Robert love的著作:
2.6內核版本以後的linux實現了搶占式內核,實現了內核搶占。
進程調度順序:
1. 實時進程 > 非實時進程
2. 實時進程之間,比較實時優先級,0到99,越大越高。
3. 實時優先級相同的實時進程之間,根據調度策略來執行。分FIFO和RR兩種。
1)其中RR方式,是輪詢的,在3.5.3內核版本中,rt_sched_class中task_tick的RR_TIMESLICE為100ms。當RR時間片超時後,進程被放到“實時優先級”相同的實時進程隊列的隊尾。
2)FIFO方式,則不輪詢。
3)新加入的實時進程,放在同優先級隊列的頭部?尾部?3.5.3版本中不一定?
4. 非實時進程之間,采用完全公平調度策略CFS進行調度,與nice值有很大關系。nice值越小,“處理器使用比”越小,如果“使用比”比當前進程小,則新進程投入運行。
5. 內核線程的執行有自己的時機,不在此范圍內,不用考慮。
進程調度的時機:
一、用戶搶占:當有TIF_NEED_RESCHED標記
1.系統調用返回用戶空間時;
2. 中斷處理程序返回用戶空間時;
二、內核搶占:
1、中斷處理程序返回內核空間時;
2、內核再一次具有可搶占性的時候;如執行spin_unlock等。具體參見preempt_check_resched函數,要求當前進程有TIF_NEED_RESCHED標記,並且thread_info的preempt_count為0,則表示可以搶占了。
3、顯示調用schedule();
4、進程被阻塞;阻塞為調用prepare_to_wait,修改了當前進程的狀態,並且釋放鎖的時候進行了類似於情況2的檢查。
進程的阻塞和喚醒很好!(prepare_to_wait,wake_up)
1、案例:當年vxworks時?????????
select也可以換成epoll,效率更好!
2、內核中大量使用此方法,效率高。