20135320赵瀚青LINUX第四章读书笔记
概述
什么是進程調度
進程調度:在可運行態進程之間分配有限處理器時間資源的內核子系統。
一、調度策略
4.1進程類型
I/O消耗型進程:大部分時間用來提交I/O請求或是等待I/O請求,經常處于可運行狀態,但運行時間短,等待請求過程時處于阻塞狀態。如交互式程序。
處理器消耗型進程:時間大都用在執行代碼上,除非被搶占否則一直不停的運行。
綜合型:既是I/O消耗型又是處理器消耗型。
調度策略要在:進程響應迅速(響應時間短)和最大系統利用率(高吞吐量)之間尋找平衡。
4.2 調度概念
優先級:基于進程價值和對處理器時間需求進行進程分級的調度。
時間片:表明進程被搶占前所能持續運行的時間,規定一個默認的時間片。時間片過長導致系統交互性的響應不好,
程序并行性效果差;時間片太短增大進程切換帶來的處理器耗時。矛盾!
間片耗盡進程運行到期,暫時不可運行狀態。直到所有進程時間片都耗盡,重新計算進程時間片。
Linux調度程序提高交互式程序優先級,提供較長時間片;實現動態調整優先級和時間片長度機制。
進程搶占:Linux系統是搶占式,始終運行優先級高的進程。
4.3 策略
決定調度程序在何時讓進程運行。
4.3.1 I/O消耗型和處理器消耗型的進程
I/O消耗型:大多時間在提交或等待I/O請求。
處理器消耗型:大多時間在執行代碼。不屬于I/O驅動類型。
4.3.2 進程優先級
相同優先級按照輪轉方式進行調度。
調度程序總是選擇時間片未用盡且優先級高的進程運行。
4.3.3 時間片
nice值作為權重將調整進程所使用的處理器時間使用比。
I/O消耗型:不需要長的時間片。
處理器消耗型:需要越長越好的時間片。
4.3.4 調度策略的活動
文字編輯程序顯然是 1/0 消耗型的,因為它大部分時間都在等待用戶的鍵盤輸入〈無論用戶的輸入速度有多快,都不可能趕上處理的速度λ 用戶總是希望按下鍵系統就能馬上響應。視頻編碼程序是處理器消耗型的。4.4 Linux調度算法
4.4.1 調度器類
以模塊方式提供的,這樣做的目的是允許不同類型的進程可以有針對性地選
擇調度算哉。
4.4.2 Unix系統中的進程調度
4.4.3 公平調度
CFS的做怯是允許每個進程運行一段時間、循環輪轉、選擇運行最少的進程作為下一個運行進程,而不再采用分配給每個進程時間片的做法了,在所有可運行進程總數基礎上計算出一個進程應該運行多久。 - -
nice 值在 CFS 中被
作為進程獲得的處理器運行比的權重:越高的nice 值(越低的優先級)進程在得更低的處理器
使用權重。
可運行進程數量趨于無窮,每個最少也能獲得 lms 的運行時間。
任何進程所獲得的處理器時間是由它自己和其他所有可運行進程nice 值的相對差值決定的。
4.5 Linux調度的實現
4.5.1 時間記賬
所有的調度器都必須對進程運行時間做記賬。CFS 使用調度器實體結構(定義在文件<linux/sched.h>的 struct_sched _entity 中)來追蹤進程運行記賬。CFS 使用 vruntime 變量來記錄一個程序到底運行了多長時間以及它還應該再運行多久。定義在kemeVsched_fair.c 文件中的 update_curr()函數實現了該記賬功能。update_ currO 計算了當前進程的執行時間,并且將其存放在變量delta_exec 中,update_ curr()是囪系統定時器周期性調用。4.5.3 調度器入口
主要入口點是函數schedule(),它定義在文件kemel/sched.c中。
4.5.4 睡眠和喚醒
睡眠:為了等待一些事件。內核的操作都相同 2 進程把自己標記成休眠狀態,從可執行紅黑樹中移出,放入等待隊列,然后調用 schedule()選擇和執行一個其他進程。喚醒的過程剛好相反進程被設置為可執行狀態,然后再從等待隊列中移到可執行紅黑樹中。4.6.1 用戶搶占
用戶搶占在以下情況時產生:
- 從系統調返回用戶空間時;
從中斷處理程序返回用戶空間時;
4.6.2 內核搶占
內核搶占會發生在:
中斷處理程序正在執行,且返回內核空間之前 內核代碼再一次具有可搶占性 如果內核中的任務顯式地調用 schedule() 如果內核中的任務阻塞(這同樣也會導敖調用 schedule()4.7 實時調度策略
兩種策略
SCHED_FIFO和 SCHED_RR
SCHED_FIFO 實現了一種簡單的、先入先出的調度算怯
SCHED_RR 是帶有時鬧片的 SCHED_FIFO,一種實時輪流調度算掛.
4.8 與調度相關的系統調用
4.8.1 與調度策略和優先級相關的系統調用
sched_setparam()和sched__getparam()分別用于設置和獲取進程的實時優先級
nice()函數會調用內核的 set_ user_ nice()函數,這個函數會設置進程的 task_struct 的 static_prio 和prio 值。
轉載于:https://www.cnblogs.com/5320zhq/p/5384757.html
總結
以上是生活随笔為你收集整理的20135320赵瀚青LINUX第四章读书笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C# 开启摄像头 拍照
- 下一篇: linux 其他常用命令