申嵌視頻-實(shí)戰(zhàn)項(xiàng)目篇實(shí)驗(yàn)嵌入式收費(fèi)版編程入門初級(jí)基礎(chǔ)提高自學(xué)學(xué)習(xí)視頻教程進(jìn)程調(diào)度_第1頁
申嵌視頻-實(shí)戰(zhàn)項(xiàng)目篇實(shí)驗(yàn)嵌入式收費(fèi)版編程入門初級(jí)基礎(chǔ)提高自學(xué)學(xué)習(xí)視頻教程進(jìn)程調(diào)度_第2頁
申嵌視頻-實(shí)戰(zhàn)項(xiàng)目篇實(shí)驗(yàn)嵌入式收費(fèi)版編程入門初級(jí)基礎(chǔ)提高自學(xué)學(xué)習(xí)視頻教程進(jìn)程調(diào)度_第3頁
申嵌視頻-實(shí)戰(zhàn)項(xiàng)目篇實(shí)驗(yàn)嵌入式收費(fèi)版編程入門初級(jí)基礎(chǔ)提高自學(xué)學(xué)習(xí)視頻教程進(jìn)程調(diào)度_第4頁
申嵌視頻-實(shí)戰(zhàn)項(xiàng)目篇實(shí)驗(yàn)嵌入式收費(fèi)版編程入門初級(jí)基礎(chǔ)提高自學(xué)學(xué)習(xí)視頻教程進(jìn)程調(diào)度_第5頁
免費(fèi)預(yù)覽已結(jié)束,剩余20頁可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、2.6.23 內(nèi)核中包含了一個(gè)重要的 CFS2.6.23 內(nèi)核中包含了一個(gè)重要的 CFS 替代了以前的調(diào)度器CFS 被合并到 mainline 之前,關(guān)于內(nèi)核調(diào)度器還有一個(gè)重patch:RSDL。最終 2.6.23 決定將 CFS mainline 而放了 RSDL。為什么要引入新的調(diào)度器,CFS 和 和區(qū)別聯(lián)引進(jìn)程調(diào)度是操作系統(tǒng)功能。調(diào)度器只是是調(diào)度過程中的一分,進(jìn)程調(diào)度是非常復(fù)雜的過程,需要多個(gè)系統(tǒng)協(xié)同工作完所關(guān)注的僅為調(diào)度器,它的主要工作是在所有 RUNNING 進(jìn)程 交互式此類進(jìn)程有大量的人機(jī)交互,因此進(jìn)程不斷地處于睡眠狀態(tài),等待戶輸入。典型的應(yīng)用比如編輯器 vi。此類進(jìn)程對(duì)系統(tǒng)響應(yīng)時(shí)

2、間要比較高,否則用戶會(huì)感覺系統(tǒng)反應(yīng)遲緩批處理此類進(jìn)程不需要人機(jī)交互,運(yùn)行,需要占用大量的系但是能此類進(jìn)程不需要人機(jī)交互,運(yùn)行,需要占用大量的系但是能夠忍受響應(yīng)延遲。比如編譯實(shí)時(shí)進(jìn)實(shí)時(shí)對(duì)調(diào)度延遲的要求最高,這些進(jìn)程往往執(zhí)行非常重要的求立即響應(yīng)并或飛機(jī)飛行控制系統(tǒng),很明這類程機(jī)毀人長時(shí)間的調(diào)度延遲,輕則放映效果,重根據(jù)進(jìn)程的不同分Linux 采用不同的調(diào)度策略。對(duì)于實(shí)時(shí)進(jìn)程采用 FIFO 或者 RoundRobin 的調(diào)度策略普通區(qū)分交互式和批處理式的不同。傳統(tǒng) Linux 調(diào)度器提高交互式應(yīng)用的優(yōu)先級(jí),使得它們能更快地被調(diào)度。而 CFS 和 RSDL 等新的調(diào)度器是“完全公平”。這個(gè)設(shè)計(jì)理念不僅

3、大大簡化了調(diào)度的代碼復(fù)雜度,還對(duì)各種調(diào)度需求的提供了更完美的支持在探討CFS 和RSDL 之中所使用的調(diào)度器首先回顧一下Linux2.4 和內(nèi)核調(diào)度器的簡單歷2.1Linux2.4 的調(diào)度Linux2.4.18 中使用的調(diào)度器Linux2.4.18 中使用的調(diào)度器采用基于優(yōu)先級(jí)的設(shè)計(jì),這個(gè)調(diào)度器Linus 在 1992 年發(fā)布的調(diào)度器沒有大的區(qū)別。該調(diào)度器的 pick next 算法非常簡單:對(duì) runqueue 中所有進(jìn)程的優(yōu)先級(jí)進(jìn)行依次進(jìn)(Runqueue 是 Linux 內(nèi)核中保存所有就緒進(jìn)程的隊(duì)列) 術(shù)語 picknext 用來指從所有候選進(jìn)程中挑選下一個(gè)要被調(diào)度的進(jìn)程的過程每個(gè)進(jìn)程被

4、創(chuàng)建時(shí)都被賦予一個(gè)時(shí)間片中斷遞減當(dāng)前運(yùn)行能有機(jī)會(huì)運(yùn)行。nx2.4調(diào)度器保證只有當(dāng)所有UNIG進(jìn)程稱為一個(gè) epoch。這種設(shè)計(jì)保證了每個(gè)進(jìn)程都有機(jī)會(huì)得到執(zhí)各種進(jìn)程對(duì)調(diào)度的需求并不相同,Linux2.4 調(diào)度器主要依靠改變器都主要依賴修改進(jìn)程優(yōu)先級(jí)來滿足不同的調(diào)度需求。實(shí)時(shí)進(jìn)實(shí)時(shí)進(jìn)程的優(yōu)先級(jí)是靜態(tài)設(shè)定的,而且始終大于普通進(jìn)程的因此只有當(dāng) runqueue 中沒有實(shí)時(shí)進(jìn)程的情況下,普通進(jìn)程才能獲得調(diào) 和 采用先進(jìn)先出的策略,對(duì)于所有相同優(yōu)先級(jí)的進(jìn)程,最先進(jìn) R Round 輪轉(zhuǎn)策略,使得相同優(yōu)先級(jí)的實(shí)時(shí)進(jìn)程能夠輪流獲得調(diào)度普通進(jìn)對(duì)于普通進(jìn)程,調(diào)度器傾向于提高交互式進(jìn)程的優(yōu)先級(jí),因?yàn)樗鼈僀ounte

5、r 字段決定 (還要加上 nice 設(shè)定的靜態(tài)優(yōu)先級(jí)) 。進(jìn)程被創(chuàng)建時(shí)子進(jìn)程的 counter 值為父進(jìn)程 counter 值的一半,這樣保任何進(jìn)程不能依靠不斷地 fork() 而獲的執(zhí)行機(jī)會(huì)Linux2.4 調(diào)度器是如何提高交互式進(jìn)程的優(yōu)先級(jí)的呢?如前所述當(dāng)所有UNG進(jìn)程的時(shí)間片被用完之后,調(diào)度器將重新計(jì)算所有進(jìn)程的cutrUNINGcuter本來就沒有用完,在重新計(jì)算時(shí),他們的cuter值會(huì)加上這些原來未用完的uqee時(shí),就會(huì)優(yōu)先于其它進(jìn)程而獲得PU。從用戶角度來看,交互式進(jìn)程的響應(yīng)速度就提高該調(diào)度器的主要缺點(diǎn)可擴(kuò)展性不好:調(diào)度器選擇進(jìn)程時(shí)需要遍歷整個(gè) runqueue 從中出最佳人選,因

6、此該算法的執(zhí)行時(shí)間與進(jìn)程數(shù)成正比。另外每次重計(jì)算 counter 所花費(fèi)的時(shí)間計(jì)算 counter 所花費(fèi)的時(shí)間也會(huì)隨著系統(tǒng)中進(jìn)程數(shù)的增加而線性長,當(dāng)進(jìn)程數(shù)很大時(shí),更新 counter 操作的代價(jià)會(huì)非常高,導(dǎo)致統(tǒng)整體的性能下降高負(fù)載系統(tǒng)上的調(diào)度性能比較低:2.4 的調(diào)度器預(yù)分配給每個(gè)進(jìn)程因?yàn)槠骄總€(gè)進(jìn)程的等待時(shí)間于該時(shí)間片的大小成正比。交互式進(jìn)程的優(yōu)化并不完善:Linux2.4 識(shí)別交互式進(jìn)程的原理基以下假設(shè),即交互式進(jìn)程比批處理進(jìn)程更頻繁地處于SSPEDED互,但是也會(huì)頻繁地進(jìn)行O操作,比如一個(gè)數(shù)據(jù)庫引擎在處理查詢時(shí)會(huì)經(jīng)常地進(jìn)行磁盤,雖然它們并不需要快速地用戶響應(yīng),還是互式進(jìn)程的響應(yīng)時(shí)間對(duì)實(shí)

7、時(shí)進(jìn)程的支持不夠:Linux2.4 內(nèi)核是非搶占的,當(dāng)進(jìn)程處于態(tài)時(shí)不會(huì)發(fā)生搶占,這對(duì)于真正的實(shí)時(shí)應(yīng)用是不能接受的為了解決這些問題,Ingo Molnar 開發(fā)了新的 O(1)調(diào)度器,在 和 RSDL 之前,這個(gè)調(diào)度器不僅被 Linux2.6 采用,還被 backport Linux2.4 中,很多商業(yè)版本都采用了這個(gè)調(diào)度2.2Linux2.6O(1)調(diào)度從名字就可以看出O(1)調(diào)度器主要解決了以前從名字就可以看出O(1)調(diào)度器主要解決了以前版本中的擴(kuò)展性問題O(1)調(diào)度算法所花費(fèi)的時(shí)間為常數(shù),與當(dāng)前系統(tǒng)中的進(jìn)程個(gè)此外 Linux2.6 內(nèi)核支持內(nèi)核態(tài)搶占,因此更好地支持了實(shí)時(shí)進(jìn)程相對(duì)于前任,O

8、 (1) 調(diào)度器還更好地區(qū)分了交互式程批處理式Linux2.6 內(nèi)核也支持三種調(diào)度策略。其中 SCHED_FIFO SCHED_RR 用于實(shí)時(shí)進(jìn)程,而 SCHED_NORMAL 用于普通進(jìn)O(1)調(diào)度器在兩個(gè)方面修改了 Linux2.4 調(diào)度器,一是進(jìn)程優(yōu)先級(jí)的計(jì)算方法;二是 pick next 算法。2.2.1 進(jìn)程的優(yōu)先級(jí)計(jì)普通進(jìn)程的優(yōu)先級(jí)計(jì)普通進(jìn)程優(yōu)先級(jí)是動(dòng)態(tài)計(jì)算的,計(jì)算公式中包含了靜態(tài)優(yōu)先級(jí)。一過e系統(tǒng)調(diào)用修改進(jìn)程的靜態(tài)優(yōu)先級(jí)。動(dòng)態(tài)優(yōu)先級(jí)由 公式一 計(jì)算得出公式dynamicpriority=max(100,min(icpriority bonus其中bonus 取決于進(jìn)程的平均其中b

9、onus 取決于進(jìn)程的平均睡眠時(shí)可以看越長,其bns越大,從而得到更高的優(yōu)先級(jí)。平均睡眠時(shí)間也被用來判斷進(jìn)程是否是一個(gè)交互式進(jìn)果滿面的公式,進(jìn)程就被認(rèn)為是一個(gè)交互式進(jìn)程公式Dynamicpriority3xicpriority/4+ 平均睡眠時(shí)間是進(jìn)程處于等待睡眠狀態(tài)下的時(shí)值在進(jìn)程進(jìn)眠狀態(tài)時(shí)增加,而進(jìn)入 RUNNING 狀態(tài)后則減少。該值的更新時(shí)機(jī)分布在很多內(nèi)核函數(shù)內(nèi):時(shí)鐘中斷 scheduler_tick ();進(jìn)程創(chuàng)建;進(jìn)ERRUPTIBLE 狀態(tài)喚醒;負(fù)載平衡實(shí)時(shí)進(jìn)程的優(yōu)先級(jí)計(jì)實(shí)時(shí)進(jìn)程的優(yōu)先級(jí)由 sys_sched_setschedule()設(shè)置。該值不會(huì)動(dòng)修改且總是比普通進(jìn)程的優(yōu)先在進(jìn)

10、程描述符中用 域表示2.2.2picknext算普通進(jìn)程的調(diào)度選擇算法基于進(jìn)程的2.2.2picknext算普通進(jìn)程的調(diào)度選擇算法基于進(jìn)程的優(yōu)先級(jí)擁有最高優(yōu)先級(jí)的被調(diào)度器選中。2.4中,時(shí)間片counter同時(shí)也表示了一個(gè)進(jìn)程的優(yōu)先級(jí)。2.6 中時(shí)間片用任務(wù)描述符中的 time_slice 域表示,而優(yōu)先用 prio(普通進(jìn)程)或者 rt_priority(實(shí)時(shí)進(jìn)程)表示調(diào)度器為每一個(gè)了兩個(gè)進(jìn)程隊(duì)列數(shù)組active 數(shù)組和數(shù)組。數(shù)組中的元素著保存某一優(yōu)先級(jí)的進(jìn)程隊(duì)列指140 個(gè)不同的優(yōu)先級(jí),因此這兩個(gè)數(shù)組大小都是 140共當(dāng)需要選擇當(dāng)前最高優(yōu)先級(jí)的進(jìn)程時(shí),2.6 調(diào)度器不用遍歷runqueue

11、,而是直接從 active 數(shù)組中選擇當(dāng)前最高優(yōu)先級(jí)隊(duì)列中的第一個(gè)進(jìn)程。假設(shè)當(dāng)前所有進(jìn)程中最高優(yōu)先級(jí)為 50(換句話中沒有任何進(jìn)程的優(yōu)先級(jí)小于 50)。則調(diào)度器得到優(yōu)先級(jí)為 50 的進(jìn)程隊(duì)列指針。該隊(duì)列頭上的第一個(gè)進(jìn)程就是為了實(shí)現(xiàn)上述算法 active 了一個(gè) bitmap,當(dāng)某個(gè)優(yōu)先上有進(jìn)入列表時(shí),相應(yīng)的比特位就被置_bit()函數(shù)查詢?cè)?bitmap,返回當(dāng)前被置位的最高先級(jí)的數(shù)組下標(biāo)。在上例中 sched_find_IA 處理器上可以通過 bsfl 等指令實(shí)現(xiàn)。為了提高交互式進(jìn)程的響應(yīng)時(shí)間,O(1)調(diào)為了提高交互式進(jìn)程的響應(yīng)時(shí)間,O(1)調(diào)度器不僅動(dòng)態(tài)地提高該類程的優(yōu)先級(jí),還采用以下方每

12、次時(shí)鐘tick 中斷進(jìn)程的時(shí)間片(time_slice)被減一 為 0 調(diào)度器判斷當(dāng)前進(jìn)程的類型,如果是交互式進(jìn)程或者實(shí)時(shí)置其時(shí)間片并重active 數(shù)組果不是交互式進(jìn)程從 active 數(shù)組中移到 expired 樣實(shí)時(shí)交互式進(jìn)程就能優(yōu)先獲得 CPU。然而這些進(jìn)程不能始終留在 active 數(shù)組中,否expire 數(shù)組中。當(dāng) active 數(shù)組中的所有進(jìn)程都被移到 expire 數(shù)組中后,調(diào)度器交active數(shù)組和expire數(shù)組。當(dāng)進(jìn)程被移expire數(shù)組時(shí),調(diào)度器會(huì)重置其時(shí)間片,因此新的active數(shù)組又恢復(fù)了初始情況,而expire數(shù)組為空,從而開始新的一輪調(diào)度2.2.3 O(1)調(diào)度

13、器小Linux2.6 調(diào)度器改進(jìn)了前任調(diào)度器的可擴(kuò)展性問題,schedule()函的時(shí)間復(fù)雜度為 O(1)。這取決于兩個(gè)改進(jìn)一Picknext算法借助于active數(shù)組,無需遍歷二取消了定期更新所有進(jìn)程 counter 的操作,動(dòng)態(tài)優(yōu)先級(jí)的修改布二取消了定期更新所有進(jìn)程 counter 的操作,動(dòng)態(tài)優(yōu)先級(jí)的修改布在進(jìn)程切換,時(shí)鐘 tick 中斷以及其它一些內(nèi)核函數(shù)中進(jìn)行O(1)調(diào)度器區(qū)分交互批處理進(jìn)程的算法與以前雖大但仍然在很多情況下名的程序總能讓該調(diào)度器性下降,導(dǎo)致交互式進(jìn)程反應(yīng)緩慢fiftyp.c,thud.c,chew.c,ring-test.c,這催生了 Con Kolivas 的樓梯

14、調(diào)度算法 SD,以及后來的改版本 RSDLIngo Molnar 在 RSDL 之后開發(fā)了 CFS并最終被 內(nèi)核采用。接開始介紹這些新一代調(diào)度器3 新一代調(diào)Linux2.6.0 發(fā)布人都擔(dān)心調(diào)度器存將阻礙新版,對(duì)NUMA和閱讀的復(fù)雜代碼加入 Linux2.6.0 的調(diào)度器模塊,雖然很多性能問題因此得到了解決雜度問題。Con Kolivas,在 2004 年提出了第一個(gè)改進(jìn)調(diào)度器設(shè)計(jì)的 staircase scheduler。為調(diào)度器設(shè)計(jì)提供了一個(gè)新的思路。之后RSDLCFS都基于SD的許多基討這三個(gè)主要的調(diào)度器算法RSDLCFS都基于SD的許多基討這三個(gè)主要的調(diào)度器算法。本章中簡要3.1 樓梯

15、調(diào)度算法 staircase樓梯算法(SD)和 O(1)算法有很大不同,它拋棄了動(dòng)態(tài)優(yōu)級(jí)的概念。而采用了一種完全公平的思路。前任算法的主要復(fù)雜性讀。樓梯算法思路但是實(shí)驗(yàn)證明它對(duì)應(yīng)交互式進(jìn)程的響應(yīng)比其前更好,而且極大地簡化了代和 O(1)算法一樣,樓梯算法也同樣為每一個(gè)優(yōu)一個(gè)進(jìn)程將這些列表組織在 active 數(shù)組當(dāng)選取下一個(gè)被調(diào)度進(jìn)程時(shí)SD算法也同樣從active數(shù)組中。與 O (1)算法不同在于,當(dāng)進(jìn)程用完了自己的時(shí)間片后,并不是被到 expire 數(shù)組中。而是被加入 active 數(shù)組的低一優(yōu)先級(jí)列表中,將其降低一個(gè)不過請(qǐng)注意這里只是將該低一級(jí)優(yōu)先任務(wù)列表中,任務(wù)本身的優(yōu)先級(jí)并沒有改變。當(dāng)

16、時(shí)間片再用完了自己的時(shí)間片之后就下一級(jí)樓梯。任務(wù)下到最低一級(jí)任務(wù)下到最低一級(jí)樓梯時(shí),如果時(shí)間片再次用完,它會(huì)回到初始優(yōu)級(jí)的下一級(jí)任務(wù)隊(duì)列中。比如某進(jìn)程的優(yōu)先級(jí)為 1,當(dāng)它到達(dá)最后一級(jí)臺(tái)階140后,再次用完時(shí)間片時(shí)將回到優(yōu)先級(jí)為2的任務(wù)隊(duì)列中,即第二級(jí)臺(tái)階。不過此時(shí)分配給該任務(wù)的 time_slice 將變成原來的 2倍。比如原來該任務(wù)的時(shí)間片 time_slice 為 10ms,則現(xiàn)在變成了 配的時(shí)間片??偨Y(jié)如設(shè)任務(wù)本身優(yōu)先級(jí)為 P,當(dāng)它從第 N 級(jí)臺(tái)階開始下樓梯并到達(dá)底后,將回到第 N+1 級(jí)臺(tái)階。并且賦予該任務(wù) N+1 倍的時(shí)間片以上描述的是普通進(jìn)程的調(diào)時(shí)進(jìn)程還是采用原來的調(diào)度略,即FIF

17、O或者RoundRobin樓梯算法能避免進(jìn)程饑餓現(xiàn)級(jí)的進(jìn)程會(huì)最終和低優(yōu)先級(jí)進(jìn)程競爭,使得低優(yōu)先級(jí)進(jìn)程最終獲得執(zhí)行機(jī)對(duì)于交互式應(yīng)用,當(dāng)進(jìn)入睡眠狀態(tài)時(shí),與它同等優(yōu)先級(jí)的其他進(jìn)程喚醒后,它還留在高處的樓梯臺(tái)階上,從而能更快地被調(diào)度加速了響應(yīng)時(shí)樓梯算法的優(yōu)從實(shí)現(xiàn)角度看,SD 基本上還是沿用了 O(1)的整體框架,只是刪O(1)調(diào)度器中動(dòng)態(tài)修改優(yōu)先級(jí)從實(shí)現(xiàn)角度看,SD 基本上還是沿用了 O(1)的整體框架,只是刪O(1)調(diào)度器中動(dòng)態(tài)修改優(yōu)先級(jí)的復(fù)雜代碼;還淘汰了 expire 數(shù)組從而簡化了代最重要的意義在于證明了完全公平這行性的3.2RSDL(TheingStaircaseDeadlineRSDL也是

18、由ConKolivas開發(fā)的,它是對(duì)SD算法的改還是“完全公平”。沒有復(fù)雜的動(dòng)態(tài)優(yōu)先級(jí)調(diào)整策的RSDL重新引入了expire為每一個(gè)優(yōu)先級(jí)都分配了一個(gè) “時(shí)組時(shí)標(biāo)記為 Tg;同一優(yōu)先級(jí)的每個(gè)本文中用 Tp 表示以便于后續(xù)描都擁有同樣的優(yōu)先級(jí)時(shí)當(dāng)進(jìn)程用完了自身的 Tp 時(shí),就下降到下一優(yōu)先級(jí)進(jìn)程組中。這個(gè)SD相同RSDL中這個(gè)過程叫minorion。請(qǐng)注意 不等于進(jìn)程的時(shí)間片,而是小于進(jìn)程的時(shí)間片。下圖表示了 ion。priority1 的隊(duì)列中一步一步下到 priority140 到 priority2 的隊(duì)列中,這個(gè)過程如下圖左邊所示,然后從 priority 開始再次一步一步下樓,到底后再

19、次反彈到 priority3 隊(duì)列中,如圖 所示圖 算法樓梯底部的圖 算法樓梯底部的低優(yōu)先級(jí)進(jìn)程必須等待所有的高優(yōu)級(jí)進(jìn)程執(zhí)行完才能獲得 CPU。因此低優(yōu)先級(jí)進(jìn)程的等待時(shí)間無法定。RSDL 中,當(dāng)高優(yōu)先級(jí)進(jìn)程組用完了它們的 Tg(即組)時(shí),無論該組中是否還有進(jìn)程 Tp 尚未用完,所有屬于該組的進(jìn)程S中 Deadline 代表的含進(jìn)程用完了自己的時(shí)間片 time_slice (下圖中 T2),將放入 數(shù)組中它初始的優(yōu)先級(jí)隊(duì)列中(priority 1)圖 當(dāng) active 數(shù)組為空或者所有的進(jìn)程都降低到最低優(yōu)先級(jí)時(shí)圖 當(dāng) active 數(shù)組為空或者所有的進(jìn)程都降低到最低優(yōu)先級(jí)時(shí)就會(huì)觸majorion

20、:。Major ion交換active數(shù)組和expire有進(jìn)程都恢復(fù)到初始狀態(tài),再一次從新開始 minor ion的過RSDL 對(duì)交互式進(jìn)程的支和 SD 同樣的道理,交互式進(jìn)程在睡眠時(shí)間時(shí),它所有的競爭者minorion 而降到了低優(yōu)先級(jí)進(jìn)程隊(duì)列中。當(dāng)它重新RUNNING 獲得了相對(duì)較高的優(yōu)先級(jí)從而能被迅速響應(yīng)3.3CFS 完全公平調(diào)度CFS 是最終被內(nèi)核采納的它從 RSDL/SD 中吸取了完全公的進(jìn)程的睡眠時(shí)間,也不再企圖區(qū)分交互式將所有的進(jìn)程對(duì)待,這就是公平的含義。CFS 的算將所有的進(jìn)程對(duì)待,這就是公平的含義。CFS 的算都相當(dāng)簡單,眾多的測(cè)試表明其性能也非常優(yōu)按照作者 Ingo Mol

21、nar 的說法:CFS 百分之八十的工作可以用一話概括:CFS 在真實(shí)的硬件上模擬了完全理想的多任務(wù)處理器。在 “完全理想的多任務(wù)處理器 “下,每個(gè)進(jìn)程都能同時(shí)獲得CPU的執(zhí)行時(shí)間。當(dāng)系統(tǒng)中有兩個(gè)進(jìn)程時(shí),CPU 的計(jì)算時(shí)間被分成兩份,每個(gè)進(jìn)程獲得 50%。然而在實(shí)際的硬件上,當(dāng)一個(gè)進(jìn)程占用 CPU 它進(jìn)程就必須等待。這就產(chǎn)。假設(shè)runqueue中有n當(dāng)前進(jìn)程運(yùn)行了 10ms“完全理的多任務(wù)處理器”中,10ms應(yīng)該平分給 n個(gè)進(jìn)程(不考慮各個(gè)進(jìn)程的 nice 值),因此當(dāng)前進(jìn)程應(yīng)得的時(shí)間是(10/n)ms,但是它卻運(yùn)行了 10ms。所以 CFS 將懲罰當(dāng)前進(jìn)程,使其它進(jìn)程能夠在下次調(diào)度時(shí)盡可能取

22、代當(dāng)前實(shí)現(xiàn)所有進(jìn)程的公平面將介紹 實(shí)現(xiàn)的一些重要部分,以便深入地理解 CFS 的工作原理CFS如何實(shí)現(xiàn)pickCFS 拋棄了 active/expire 數(shù)組,而程。所有狀態(tài)為 RUNABLE 的進(jìn)程樹選取下一個(gè)被調(diào)度樹。在每個(gè)調(diào)度點(diǎn)入CFS 調(diào)度器都會(huì)選cpu 的進(jìn)程樹的最左邊的葉子節(jié)點(diǎn)作為下一個(gè)將獲tick中CFS 中,tick中斷首先更新調(diào)度信息。然后調(diào)整當(dāng)前進(jìn)程樹中的位置。調(diào)整CFS 中,tick中斷首先更新調(diào)度信息。然后調(diào)整當(dāng)前進(jìn)程樹中的位置。調(diào)整完成后如果發(fā)現(xiàn)當(dāng)前進(jìn)程不再是最左邊的標(biāo)記 need_resched 標(biāo)志,中斷返回時(shí)就會(huì)調(diào)用 scheduler()完成進(jìn)傳統(tǒng)的時(shí)間片Ti

23、ck 中斷只需更tick中斷中遞減時(shí)當(dāng)時(shí)間片或者前的所有調(diào)度器被用完時(shí)才觸發(fā)優(yōu)先樹鍵值計(jì)理解 CFS 的關(guān)鍵就是樹鍵值的計(jì)算方法。該鍵值由三個(gè)子計(jì)算而得:一是進(jìn)程已經(jīng)占用的 CPU 時(shí)間;二是當(dāng)前進(jìn)程的 值;三是當(dāng)前的 cpu 負(fù)載進(jìn)程已經(jīng)占用的 CPU 時(shí)間對(duì)鍵值的影響最大,其實(shí)很大程在理解 CFS 時(shí)可以簡單地認(rèn)為鍵值就等于進(jìn)程已占用的 CPU 時(shí)間因此該值越大,鍵值越大,從而使得當(dāng)前進(jìn)程樹的右另外 CFS nice 值為 1 的進(jìn)程比nice 值為 0 的進(jìn)程多獲得 的 CPU 時(shí)間。在計(jì)算鍵值時(shí)也考慮到這鍵值也越大,因此nice值越大CFS 為每個(gè)進(jìn)程兩個(gè)重要變量:fair_clock

24、 和 wait_runtime在本文為每個(gè)進(jìn)的變量稱為進(jìn)程級(jí)變量,為每的稱作CPU級(jí)變量,為每個(gè)runqueue 級(jí)變量樹的鍵值即為 fair_clockwait_runtime的稱作CPU級(jí)變量,為每個(gè)runqueue 級(jí)變量樹的鍵值即為 fair_clockwait_runtime進(jìn)fair_clock 從其字面含義上講就是一個(gè)進(jìn)程應(yīng)獲得的 CPU 時(shí)間等于進(jìn)程已占用的 CPU 時(shí)間除以當(dāng)前 runqueue 中的進(jìn)程總數(shù)wait_runtime 是進(jìn)程的等待的差值代表了一個(gè)進(jìn)程的公程度。該值越大,代表當(dāng)前進(jìn)程相對(duì)于其它進(jìn)。對(duì)于交互式任務(wù),wait_runtime 長時(shí)間得不到更新,因此它

25、能擁高樹鍵值,更樹的左邊。從而得到快速響應(yīng)樹是平衡樹,調(diào)度器每次總最左邊讀出一個(gè)葉子作的時(shí)間復(fù)雜度是 O(LgN)操調(diào)度器管理為了支持實(shí)時(shí)進(jìn)程,CFS 提供了調(diào)度器模塊管理器。各種不同的度器算法都可以作為一個(gè)模到該管理器同的進(jìn)程可擇使用不同的調(diào)度器模塊。 2.6.23 中,CFS 實(shí)現(xiàn)了兩個(gè)調(diào)CFS 算法模塊和實(shí)時(shí)調(diào)度模塊。對(duì)應(yīng)實(shí)時(shí)進(jìn)程,將使用實(shí)時(shí)調(diào)度模塊對(duì)應(yīng)普通進(jìn)程則使用CFS算法IngoMolnar還邀請(qǐng)ConKolivas可以將 RSDL/SD 寫成一個(gè)調(diào)度算法模塊CFS 源代碼分Sched.c 中 scheduler_tick()函數(shù)會(huì)被時(shí)鐘中斷直接調(diào)用。它首先Sched.c 中 sc

26、heduler_tick()函數(shù)會(huì)被時(shí)鐘中斷直接調(diào)用。它首先runqueue級(jí)變量clock;然后調(diào)用CFStick處理函task_tick_fair()。task_tick_fairsched_fair.c中。它主要的工作是調(diào)用 entity_tick()函數(shù) entiry_tick 源代碼如下sicvoidentity_tick(structcfs_rq*cfs_rq,structstructsched_entitydequeue_entity(cfs_rq,curr,enqueue_entity(cfs_rq,curr,next=if(next= check_preempt_curr_f

27、air(cfs_rq, next, 首先調(diào)用 dequeue_entity ()函數(shù)樹中刪除再調(diào)enqueue_entity()重。這兩個(gè)動(dòng)作就調(diào)整了當(dāng)首先調(diào)用 dequeue_entity ()函數(shù)樹中刪除再調(diào)enqueue_entity()重。這兩個(gè)動(dòng)作就調(diào)整了當(dāng)前進(jìn)樹中的位置。 _pick_next_entity()樹中最左邊的節(jié)不再是當(dāng)前進(jìn)程,就調(diào)用_check_preempt_curr_fair。該函數(shù)設(shè)置度標(biāo)志,當(dāng)中斷返回時(shí)就會(huì)調(diào)用 schedule()進(jìn)行調(diào)度函數(shù) enqueue_entity()的源碼如下enqueue_entity(structcfs_rq*cfs_rq,st

28、ructsched_entity*Updatethefairifenqueue_sleeper(cfs_rq, s_enqueue(cfs_rq, enqueue_entity(cfs_rq, 它的第一個(gè)工作是更新調(diào)度信息。然后將進(jìn)樹中。其update_curr()函數(shù)它的第一個(gè)工作是更新調(diào)度信息。然后將進(jìn)樹中。其update_curr()函數(shù)。完成調(diào)度信息的更sicvoidupdate_curr(structcfs_rqstructsched_entity*curr=unsignedlongifdelta_exec=(unsignedlong)(rq_of(cfs_rq)-clockcurr

29、-curr-delta_exec+=if(unlikely(curr-delta_exec_granularity)update_curr(cfs_rq, curr-delta_exec=curr-exec_start=rq_of(cfs_rq)-該函數(shù)首先統(tǒng)計(jì)當(dāng)前進(jìn)程所獲得的 CPU 時(shí)間,rq_of(cfs_rq)-該函數(shù)首先統(tǒng)計(jì)當(dāng)前進(jìn)程所獲得的 CPU 時(shí)間,rq_of(cfs_rq)-值在 tick 中斷中被更新,curr-exec_start 就是當(dāng)前進(jìn)程開始獲CPU 時(shí)的時(shí)間戳。兩值相減就是當(dāng)前進(jìn)程所獲得的 CPU 變量存入 curr-delta_exec 中。然后調(diào)update_

30、curr(structcfs_rq*cfs_rq,structsched_entityunsignedlongdelta,delta_exec,delta_fair,structload_weight*lw=&cfs_rq-unsignedlongload=lw-delta_exec=curr-_set(curr-exec_max, curr-curr-sum_exec_runtime+=cfs_rq-exec_clock+=ifdelta_fair=calc_delta_fair(delta_exec,delta_mine=curr-load.weight, if(cfs_rq-sleeper_bonusdelta=cfs_rq-delta=min(delta,if(cfs_rq-sleeper_bonusdelta=cfs_rq-delta=min(delta,(unsigned(long)sysctl_sched_runtime_limit curr-cfs_rq-sleeper_bonus-=delta_mine-=cfs_rq-fair_clock+=add_wait_runtime(cfs_rq,curr,delta_mine-update_curr()的主要工作就是更新前面提到的 fair_clock wait_runtime。這兩個(gè)值的差值就

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論