歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Linux 進程調度

參考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、內核中大量使用此方法,效率高。

Copyright © Linux教程網 All Rights Reserved