日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux进程调度策略分析

發布時間:2023/12/15 linux 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux进程调度策略分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

Linux系統是搶占式多任務操作系統,是否要將一個進程立刻投入運行(也就是搶占當前進程),完全由該進程的優先級和是否有時間片來決定。但?CFS調度器:搶占時機取決于新的可執行程序消耗了多少處理器使用比,如果消耗的使用比當前進程小:新程序立刻投入運行,搶占當前進程,否則推遲。

在Linux中,線程是由進程來實現,線程就是輕量級進程,因此線程的調度是按照進程的調度方式來進行調度的,也就是說線程是基本調度單元。

進程提供了兩種優先級,一種是普通的進程優先級,第二個是實時優先級。前者適用SCHED_NORMAL(SCHED_OTHER)調度策略,后者可選SCHED_FIFO或SCHED_RR調度策略。任何時候,實時進程的優先級都高于普通進程優先級,實時進程只會被更高級的實時進程搶占,同級實時進程之間是按照FIFO或者RR規則調度。

?

?

1. 實時優先級(靜態優先級)

實時進程,只有靜態優先級,因為內核不會根據休眠等因素對其靜態優先級做調整,其范圍在1~MAX_RT_PRIO-1間。默認MAX_RT_PRIO配置為100,即默認的實時優先級范圍是1~99,?數值越高優先級越高。而nice值(-20 — 20),影響的是普通進程優先級。

系統調度時,實時優先級高的進程總是先于優先級低的進程執行(不管他們采用的是FIFO還是RR調度策略)。如果有數個優先級相同的實時進程,那么系統就會按照SCHED_FIFO或SCHED_RR選擇進程。假設當前CPU運行的實時進程A的優先級為a,而此時有個優先級為b的實時進程B進入可運行狀態,那么只要b>a,系統將中斷A的執行,而優先執行B,直到B無法執行(無論A,B為何種實時進程)。

相同優先級的調度策略:

  • SCHED_FIFO:先入先出調度策略(First?in-first?out?scheduling)。該策略簡單的說就是一旦進程占用cpu則一直運行,一直運行直到有更高優先級任務到達或自己放棄。

  • SCHED_RR:時間片輪轉調度(Round-robin?scheduling)。給每個線程增加了一個時間片限制,當時間片用完后,系統將把該線程置于隊列末尾,然后運行其他相同優先級的進程,如果沒有其他相同優先級的進程,則該進程會繼續執行(前提是沒有其他更高優先及進程)。 高優先級運行期間,低優先級沒法搶占(即使時間片用完),只能等到高優先級主動退出。

只有在下述事件之一發生時,實時進程才會被另外一個進程取代。

? (1)進程被另外一個具有更高實時優先級的實時進程搶占。

? (2)進程執行了阻塞操作并進入睡眠

? (3)進程停止(處于TASK_STOPPED 或TASK_TRACED狀態)或被殺死。

? (4)進程通過調用系統調用sched_yield(),自愿放棄CPU 。

? (5)進程基于時間片輪轉的實時進程(SCHED_RR),而且用完了它的時間片。

實時線程優先級高于所有普通線程,如果有實時線程處于運行態,則系統調度時一定會選擇調用實時線程;正在運行的實時線程只會被擁有更高實時優先級的線程搶占。所以在應用中如果需要將某個線程設置為實時線程,則需要用戶自己確保該線程不會處于忙執行而完全占用CPU資源,導致其他普通線程沒法獲得CPU資源而一直被阻塞得不到執行,并且需要合理給予優先級的值,太高有可能會影響重要系統線程的運行。所有用戶態線程默認沒有實時優先級,都屬于普通線程。

?

?

2. 普通進程優先級(非實時、動態優先級,SCHED_OTHER(SCHED_NORMAL))

系統創建線程時,默認的線程是SCHED_OTHER。所以如果我們要改變線程的調度策略的話,可以通過下面的這個函數實現。

int?pthread_attr_setschedpolicy(pthread_attr_t?*attr,?int?policy);

普通進程的靜態優先級只能是0,但可以通過nice值來改變其優先級。

nice值的范圍是-20~19,nice數值越大就使得static_prio越大,最終進程優先級就越低。

系統調度時,還會考慮其他因素,因而會以nice為基礎計算出進程動態優先級,根據此來實施調度。因為,不僅要考慮優先級,也要考慮進程的屬性。例如如果進程屬于交互式進程,那么可以適當的調高它的優先級,使得界面反應地更加迅速,從而使用戶得到更好的體驗。

進程的時間片就是完全依賴nice值來分配,低nice值的進程擁有更長的時間片。

系統會嚴格按照動態優先級高低的順序安排進程執行。動態優先級高的進程進入非運行狀態,或者時間片消耗完畢才會輪到動態優先級較低的進程執行。動態優先級的計算主要考慮兩個因素:靜態優先級,進程的平均睡眠時間。

  • SCHED_NORMAL(SCHED_OTHER):該策略是是默認的Linux分時調度(time-sharing?scheduling)策略,它是Linux線程默認的調度策略。

其實,普通進程的調度,是CPU根據進程優先級算出時間片,這樣并不能一定保證高優先級的進程一定先運行,只不過和優先級低的進程相比,通常優先級較高的進程獲得的CPU時間片會更長而已。其實,如果要想保證一個線程運行完在運行另一個線程的話,就要使用多線程的同步技術,信號量,條件變量等方法。而不是絕對依靠優先級的高低,來保證。

?

?

3. CFS

linux在2.6.23內核中采用的是“完全公平調度算法”簡稱CFS,來取代傳統的非實時進程的SCHED_NORMAL調度算法。

傳統調度策略必須規定一個默認的時間片,但是CFS沒有直接分配時間片給進程,而是將處理器的使用比例(權重)給進程,這個比例(權重)根據所有進程的總nice和自身nice值來計算。

如有三個進程,A?nice為5,B?nice為5,則A權重為1/2,B為1/2。假設總CPU時間為10ms,則A能運行5ms,B也5ms。

另外A能運行5ms不代表A會運行5ms,A有可能執行了1ms后就完成了任務然后就放棄CPU,也有可能一直運行5ms還沒能完成任務。

另外這個應得的cpu時間不應太小(假設閾值為1ms),否則會因為切換得不償失。但是,當進程足夠多時候,肯定有很多不同權重的進程獲得相同的時間——最低閾值1ms,所以,CFS只是近似完全公平。

CFS允許每個進程運行一段時間,循環輪轉,選擇運行時間最少的那個進程作為下一個運行進程,即一段時間內運行時間最少的進程擁有高優先級。CFS不再依據nice作為優先級而進行調度,但是依然會用到nice值計算權重。

?

?

4. 系統何時會調用schedule()函數

  • 進程從中斷,異常,系統調用返回用戶態的時候,系統調用 do_fork()函數

  • 定時中斷,當前進程的時間片用完, ?do_timer()函數

  • 進程狀態切換的時候,進程終止,進程喚醒等,進程調用sleep() exit()等函數,喚醒進程 wake_up_process()函數

  • 改變進程的調度策略:setscheduler()函數

  • 系統調用禮讓:sys_sched_yield()函數

?

?

5. 優先級和時間片

  • 優先級,高優先級的進程總是會搶占低優先級的進程執行,無論該低優先級進程的時間片是否已經用完;相同優先級按輪詢調度。

  • 時間片,相同優先級的進程A和B,如果A在運行,只有當A的時間片用完或者A主動休眠放棄CPU,B才有機會被執行。

  • 只有SCHED_RR和SCHED_NORMAL調度有時間片的概念

?

?

6. 總結

  • Linux 標準內核實現兩個調度類:采用?CFS 調度算法的默認調度類和實時調度類

  • Linux的調度策略區分實時進程和普通進程,實時進程的調度策略是SCHED_FIFO和SCHED_RR,普通的非實時進程的調度策略是SCHED_NORMAL(SCHED_OTHER)。

  • CFS:取代了SCHED_NORMAL(SCHED_OTHER), CFS 不采用嚴格規則來為一個優先級分配某個長度的時間片,而是為每個進程分配一定比例的 CPU 處理時間(權重)進行調度

  • 實時調度類:SCHED_FIFO或SCHED_RR調度策略,靜態優先級。

?

?

?

總結

以上是生活随笔為你收集整理的Linux进程调度策略分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。