第四章讀書筆記——進程調度

第四章 進程調度

多任務

多任務操做系統就是能同時併發的交互執行多個進程的操做系統
多任務操做系統分爲:linux

  • 非搶佔式多任務(強制的掛起動做就叫作搶佔)
  • 搶佔式多任務(進程主動掛起本身的操做稱爲讓步)

策略

進程能夠被分爲:算法

  • I/O消耗性(大部分時間用來提交I/O請求或等待I/O請求)
  • 處理機消耗型(把大多數時間用在代碼上,沒有太多的I/O請求)
    進程能夠同時展現這兩種行爲,而調度策略一般要在進程相應迅速和最大系統利用率中尋找平衡

Linux採用了兩種不一樣的優先級範圍:併發

  • nice值(默認爲0,nice值越大優先級越低)
  • 實時優先級(可配置,默認狀況下0到99,實時優先級值越高進程優先級越高)

時間片:被搶佔以前持續運行的時間函數

Linux調度算法

Linux調度器是以模塊方式提供的,其目的是爲了容許不一樣類型的進程能夠有針對性的選擇算法
現代進程調度器有兩個通用的概念:進程優先級和時間片
徹底公平調度(CFS)的出發點基於一個簡單的理論:進程調度的效果應如同系統擁有一個完美的多任務處理器,即在系統中,每一個進程將得到1/n的處理器時間---有n個可運行進程
徹底公平調度(CFS)的作法是容許每一個進程運行一段時間,循環輪轉,選擇運行最少的進程做爲下個運行進程,而不是採用分配給每一個進程時間片了操作系統

Linux調度的實現

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

調度器實體結構:CFS使用調度器實體結構來追蹤進程運行記帳
虛擬實時:vruntime變量存放進程虛擬運行時間,CFS使用vruntime變量來記錄程序到底運行了多長時間以及還用運行多長時間進程

進程選擇:CFS調度算法的核心----選擇具備最小vruntime的任務內存

進程調度的主要入口點是schedule(),他正是內核其餘部分用於調用進程調度器的入口:選擇那個進程能夠運行,什麼時候將其投入運行get

搶佔和上下文切換

上下文切換:從一個可執行進程切換到另外一個可執行進程,由context_switch()函數負責處理
該函數完成兩項基本工做:it

  • 把虛擬內存從上一個進程映射切換到新進程中
  • 從上一個進程的處理機狀態切換到新進程的處理機狀態

用戶搶佔發生的狀況:變量

  • 從系統返回用戶空間時
  • 從中斷處理程序返回用戶空間時
    內核搶佔發生的狀況:
  • 中斷處理程序鄭正在執行,且返回內核空間以前
  • 內核代碼再一次具備可搶佔性
  • 內核中的任務顯式的調用schedule()
  • 內核中任務堵塞

實時調度策略

Linux提供了兩種調度策略:

  • SCHED_FIFO
  • SCHED_RR

與調度相關的系統調用

系統調用能夠用來操做和處理進程優先級,調度策略及處理器綁定,同時還提供了顯式的將處理器交給其餘進程的機制

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

  • sched_setscheduler()和sched_getscheduler()分別用於設置和獲取進程的調度策略和實時優先級
  • sched_setparam()和sched_getparam()分別用於設置和獲取進程的實時優先級

與處理器綁定相關的系統調用:
Linux調度程序提供強制的處理器綁定(processor affinity)機制

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

相關文章
相關標籤/搜索