《Linux內核設計與實現》第四章學習筆記

《Linux內核設計與實現》第四章學習筆記linux

                ——進程調度算法

姓名:王瑋怡  學號:20135116服務器

1、多任務網絡

一、多任務操做系統的含義併發

  多任務操做系統就是能同時併發地交互執行多個進程的操做系統。ssh

  • 不管在單處理器或者多處理器機器上,多任務操做系統都能使多個進程處於堵塞或者睡眠狀態,也就是說,實際上不被投入執行,直到工做確實就緒。
  • 相反,這些進程利用內核阻塞本身,直到某一事件(鍵盤輸入、網絡數據、過一段時間等)發生。

二、多任務操做系統的分類函數

  • 非搶佔式多任務
  • 搶佔式多任務

三、Linux的搶佔式多任務模式學習

(1)搶佔:強制的掛起動做spa

(2)時間片:分配給每一個可運行進程的處理器時間段。有效管理時間片能使調度程序從系統全局的角度作出調度決定,這樣作還能夠避免個別進程獨佔系統資源。操作系統

(3)讓步:進程主動掛起本身的操做

2、Linux的進程調度

一、O(1)調度程序

  缺點:缺乏交互進程

二、反轉樓梯最後期限調度算法

  優勢:吸取了隊列理論,引入公平調度的概念,「徹底公平調度算法」

3、策略

一、I/O消耗型和處理器消耗型的進程

(1)I/O消耗型

  • 指進程的大部分時間用來提交I/O請求或是等待I/O請求。所以,這樣的進程常常處於可運行狀態,但一般都是運行短短的一下子。
  • 舉例:多數用戶圖形界面程序(GUI)、Unix系統、Linux

(2)處理器消耗型

  • 處理器耗費型進程把時間大多用在執行代碼上。除非被搶佔,不然它們一般都一直不停地運行,由於它們沒有太多的1/0 需求。
  • 舉例:無限循環執行,如sshkeygen 或者MATLAB

(3)特殊狀況

  • X Window 服務器既是I/O消耗型,也是處理器消耗型
  • 平衡點:進程響應迅速(響應時間短)和最大系統利用率(高吞吐量)。

二、進程優先級

  • 調度算法中最基本的一類就是基於優先級的調度,這是一種根據進程的價值和其對處理器時間的需求來對進程分級的想法。
  • 一般作法是是(其並未被Linux 系統徹底採用)優先級高的進程先運行,低的後運行,相同優先級的進程按輪轉方式進行調度(一個接一個,重複進行)。

(1)使用nice值的優先級

  • 範圍是從-20 到+19,默認值爲0 :越大的nice 值意味着更低的優先級
  • Linux 系統中,nice值則表明時間片的比例

(2)實時優先級

  • 其值是可配置的,默認狀況下它的變化範圍是從0到99(包括0和99)
  • 越高的實時優先級數值意味着進程優先級越高

三、時間片

(1)時間片是一個數值,它代表進程在被搶佔前所能持續運行的時間。

(2)在Linux操做系統中

  • Linux 的CFS 調度器並無直接分配時間片到進程,它是將處理器的使用比劃分給了進程。
  • 在Linux中使用新的CFS調度器,其搶佔時機取決於新的可運行程序消耗了多少處理器使用比.若是消耗的使用比比當前進程小,則新進程馬上投入運行,搶佔當前進程。不然,將推遲其運行。 

4、Linux調度算法——徹底公平調度(CFS)

一、相關概念

  • 目標延遲:每一個進程都按其權重在所有可運行進程中所佔比例的「時間片」來運行,爲了計算準確的時間片,CFS爲完美多任務中的無限小調度週期的近似值設立了一個目標。而這個目標稱做「目標延遲」,越小的調度週期將帶來越好的交互性,同時也更接近完美的多任務。
  • 最小粒度:當可運行任務數量趨於無限時,它們各自所得到的處理器使用比和時間片都將趨於0,形成了不可接受的切換消耗,CFS 爲此引人每一個進程得到的時間片底線,這個底線稱爲最小粒度。默認狀況下這個值是lms。

二、決定因素

  任何進程所得到的處理器時間是由它本身和其餘全部可運行進程nice值的相對差值決定的。任何nice值對應的絕對時間再也不是一個絕對值,而是處理器的使用比。

 

三、所屬類型

 

  針對普通進程的調度器類——容許多重不一樣的可動態添加的調度算法並存,調度屬於本身範疇的進程

四、組成部分

  • 時間記帳
  • 進程選擇
  • 調度器入口
  • 睡眠和喚醒

5、Linux調度的實現

一、時間記帳

  一個進程的時間片被減小到0時,它就會被另外一個還沒有減到0的時間片可運行進程搶佔。

  • CFS使用調度器實體結構來追蹤進程運行記帳(定義在文件<linux/sched.h>的struct_sched _entity)
  • CFS使用vruntime變量(虛擬實時)來記錄一個程序到底運行了多長時間以及它還應該再運行多久,並且能夠知道誰應該是下一個被運行的進程,以ns爲單位

二、進程選擇

  紅黑樹是一種以樹節點形式存儲的數據,這些數據都會對應一個鍵值。Linux中,紅黑樹稱爲rb位時,它是一個自平衡二叉搜索樹。

  • 挑選下一個任務:CFS調度器選取全部進程中vruntime最小的那個進程爲待運行的下一個進程(CFS調度算法的核心),對應的是樹中最左側的葉子節點,實現函數爲__pick_next_entity()
  • 向樹中加入進程,發生在進程變爲可運行狀態(被喚醒)或經過fork()調用第一次建立進程時,由函數enqueue_entity()實現
  • 從樹中刪除進程的動做發生在進程堵塞(變爲不可運行態)或者終止時(結束運行),有輔助函數__dequeue_entity()完成

三、調度器入口

  進程調度的主要入口點是函數schedule(),該函數中惟一重要的事就是調用pick_next_task()

四、睡眠和喚醒

(1)睡眠(被阻塞)——進程處於一個特殊的不可執行狀態

  • 常見緣由:文件I/O
  • 內核操做:進程把本身標記成休眠狀態,從可執行紅黑樹中移出,放入等待隊列,而後調用schedule()選擇和執行一個其餘進程。
  • 等待隊列:由等待某些事件發生的進程組成的簡單鏈表,內核用wake_queue_ head _t 來表明等待隊列。可經過DECL成立WAITQUEUE ()靜態建立,也能夠由init_waitqueue _head()動態建立

(2)喚醒——喚醒指定的等待隊列上的全部進程

  • 喚醒操做經過函數wake_up()進行,它調用函數try_to_wake_up(),該函數負責將進程設置爲TASK_RUNNING狀態,調用enqueue_task()將此進程放入紅黑樹中
  • 若是被喚醒的進程優先級比當前正在執行的進程的優先級高,還要設置need _resched 標誌
  • 注意虛假喚醒

6、搶佔和上下文切換

一、搶佔

(1)用戶搶佔

  內核即將返回用戶空間的時候,若是need_resched標誌被設置,會致使schedule()被調用,此時會發生用戶搶佔

  • 從系統調用返回用戶空間時
  • 從中斷處理程序返回用戶空間時

(2)內核搶佔

  每一個進程的thread_info引人preempt_count計數器。該計數器韌始值爲0,每當使用鎖的時候數值加1,釋放鎖的時候數值減1。當數值爲0的時候,內核就可執行搶佔,具體發生在:

  • 中斷處理程序正在執行,且返回內核空間以前
  • 內核代碼再一次具備搶佔性的時候
  • 若是內核中的任務顯式地調用schedule()
  • 若是內核中的任務阻塞

二、上下文切換

  • 一個可執行進程切換到另外一個可執行進程
  • 當一個新進程被選出來準備投入運行時,schedule()會調用context_switch()函數負責處理

7、實時調度策略

一、SCHED_FIFO

  • 簡單、先入先出
  • 不使用時間片
  • 若是SCHED_FIFO級進程處於可執行狀態,就會一直執行,直到它本身受阻塞或顯式地釋放處理器爲止

二、SCHED_RR

  • 實時輪流調度算法:帶有時間片的SCHED_FIFO
  • 當SCHED_RR任務耗盡它的時間片時,同一優先級的其餘實時進程被輪流調度

三、實時優先級範圍默認爲0-99

8、與調度有關的系統調用

 

一、與調度策略和優先級相關的系統調用

  sched_setscheduler()和sched_getscheduler()分別用於設置和獲取從此才能的調度策略和實時優先級。

二、與處理器綁定有關的系統調用

  用戶能夠經過sched_setaffinity()設置不一樣的一個或幾個位組合的位掩碼,而調用sched_getaffinity()則返回房錢的cpus_allowed掩碼。

三、放棄處理器時間

  Linux經過sched_yield()系統調用,提供了一種讓進程顯式地將處理器時間讓給其餘等待執行進程的機制。

相關文章
相關標籤/搜索