Red Hat Enterprise Linux 8使用是Linux內核版本是Kernel 4.18,其系統進程的實時調度策略有9種。在RHEL 8中,查看ps的幫助手冊便可查到:html
# man ps |grep -A 10 policy - not reported TS SCHED_OTHER FF SCHED_FIFO RR SCHED_RR B SCHED_BATCH ISO SCHED_ISO IDL SCHED_IDLE DLN SCHED_DEADLINE ? unknown value
實際上只有7種,not reported、unknown value可能只是開放的策略,容許用戶自定義。查看進程時,可能專門指定查看進程的調度策略,以下:linux
# ps axo pid,comm,nice,cls --sort=-nice
Linux的進程調度意味着,它是CPU的重要助手,老是要爲CPU挑選出下一個要執行的進程。在Linux中,進程(process)、線程(thread)和任務(task)都差很少。根據POSIX的定義,進程至關於執行一個程序,特指執行程序時須要的名字空間、內存等資源;而線程則是指執行一行代碼時須要的系統資源。即它們關注的對象不一樣。你們都應該知道,一個程序有不少行代碼,幾千行,幾萬行也不稀奇。bash
RHEL 8挑選進程的標準有兩個(注2):spa
1、調度策略(scheduling policy).net
2、靜態調度優先度(static scheduling priority)線程
既然有靜態調度優先度,就有動態調度優先度,也就是NICE值,其取值 範圍爲-20~19,共40個檔次。數值越大,越日後排。看來,調度政策挺重要。那麼,各類調度策略是什麼意思呢?code
優先度爲0的進程中,按照NICE值排隊,等候被CPU執行。應用SCHED_OTHER或TS策略的進程在執行過一次以後,其NICE值就會增長一次。在這種策略下,進程們拼的不是靜態優先度,拼的是動態優先度,即NICE值。這是Linux的缺省調度策略。視頻
正如其名所示,FIFO,First In, First Out,先進先出。它比較霸道,執行完才肯走。在這種策略的指導下,靜態優先度爲1-99之間的進程會插隊到執行SCHED_OTHER、SCHED_IDEL、SCHED_BATCH策略的進程前面,直到它執行完畢或者被更高優先組的進程插隊。這種策略沒有時間片的限制。執行這種策略的進程是進程中的土匪。htm
輪巡,在分配到的、可使用CPU的時間片裏,相同優先度(1-99)的進程們,你一筷子,我一筷子,輪流吃肉。SCHED_RR,是SCHED_FIFO的改進形式。這種機制,能夠視爲進程土匪中的輪巡。畢竟,在這種策略下,你們還講點規矩,機會均等。你一筷子沒夾着肉,那就等下一輪吧。對象
跟SCHED_OTHER同樣,不使用靜態優先度,使用動態優先度。不一樣的是,它要批量執行進程。因此,只適合非交互式的進程。
這種策略是想向進程提供相似於SCHED_OTHER的運行時間片分配機制。與後者不一樣的是,SCHED_ISO在最大限度地保證不會致使其它進程「餓死」的狀況下,儘量地延長進程的執行時間。適用於遊戲、視頻和視頻捕獲場景下,最大限度地利用硬件資源。這個策略仍不完善(注8)。
跟SCHED_OTHER同樣,不使用靜態優先度,並且也不大使用動態優先度。進程的優先度爲19或20。執行這種策略的進程,是進程中的謙謙君子。它們老是先人後己,與世無爭。
這是Linux Kernel 3.14以後新增長的調度機制。同時也被認爲是最好的調度方案(注3)。誰的死期先到,誰就先上。這是一種急他人之所急的好做風。不過,這個「死期」是Deadline,是執行任務的「最後期限」。因此,這是進程中的現實主義者的約定。
RHEL 8的產品文檔中,找不到關於SCHED_ISO的介紹,大概也是由於這種調度技術還沒有成熟有關吧。
參考資料:
一、https://access.redhat.com/articles/3078
二、http://man7.org/linux/man-pages/man7/sched.7.html
三、https://stackoverflow.com/questions/9392415/linux-sched-other-sched-fifo-and-sched-rr-differences
四、https://lwn.net/Articles/723248/
五、https://www.kernel.org/doc/html/v5.4/scheduler/sched-rt-group.html
六、https://www.cs.montana.edu/~chandrima.sarkar/AdvancedOS/CSCI560_Proj_main/
七、https://linux.die.net/man/2/sched_getscheduler
八、https://www.mankier.com/8/schedtool