2.1-Linux進(jìn)程調(diào)度分析ppt課件_第1頁(yè)
2.1-Linux進(jìn)程調(diào)度分析ppt課件_第2頁(yè)
2.1-Linux進(jìn)程調(diào)度分析ppt課件_第3頁(yè)
2.1-Linux進(jìn)程調(diào)度分析ppt課件_第4頁(yè)
2.1-Linux進(jìn)程調(diào)度分析ppt課件_第5頁(yè)
已閱讀5頁(yè),還剩40頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、在分析源碼前,先從整體出發(fā),知道該操作系統(tǒng)的工作原理弄清Linux內(nèi)核源代碼的分布情況,即目錄結(jié)構(gòu)分析隨時(shí)Baidu 閱讀代碼的方法:縱向與橫向。 縱向:順著程序的執(zhí)行順序逐步進(jìn)行;橫向:就是分模塊進(jìn)行兩種方法應(yīng)交替進(jìn)行想看變量某一定義,先把光標(biāo)定位于該變量,然后點(diǎn)擊工具條上的相應(yīng) 選項(xiàng),該變量的定義就顯示出來,同樣可以用該方法查看函數(shù)定義。工具下載:/phanyoung/index_in.html可在課程BBS里找到該地址該軟件符合優(yōu)秀軟件的設(shè)計(jì)標(biāo)準(zhǔn):用戶不需要專門的學(xué)習(xí)就能使用。繼承和發(fā)揚(yáng) 2.4 版調(diào)度器的特點(diǎn): 交互式作業(yè)優(yōu)先 輕載條件下調(diào)度/喚醒的高性能 公

2、平共享 基于優(yōu)先級(jí)調(diào)度 高 CPU 使用率 SMP 高效親和 實(shí)時(shí)調(diào)度和 cpu 綁定等調(diào)度手段在此基礎(chǔ)之上的新特性: O(1)調(diào)度算法,調(diào)度器開銷恒定與當(dāng)前系統(tǒng)負(fù)載無關(guān)),實(shí)時(shí)性能更好 高可擴(kuò)展性,鎖粒度大幅度減小 新設(shè)計(jì)的 SMP 親和方法 優(yōu)化計(jì)算密集型的批處理作業(yè)的調(diào)度 重載條件下調(diào)度器工作更平滑 子進(jìn)程先于父進(jìn)程運(yùn)行等其他改進(jìn) 增加了對(duì)可搶占內(nèi)核的支持劇本:依賴的程序。不同劇場(chǎng)可以演出同一個(gè)劇本:依賴的程序。不同劇場(chǎng)可以演出同一個(gè)劇本劇本-一個(gè)程序可以有多個(gè)進(jìn)程。一個(gè)程序可以有多個(gè)進(jìn)程。私有財(cái)產(chǎn):專用的系統(tǒng)堆棧和獨(dú)享的用戶空間私有財(cái)產(chǎn):專用的系統(tǒng)堆棧和獨(dú)享的用戶空間戶口登記表:戶口登

3、記表:task_struct對(duì)進(jìn)程的描述對(duì)進(jìn)程的描述(如果沒有獨(dú)享的用戶空間,只能被稱為線(如果沒有獨(dú)享的用戶空間,只能被稱為線程)。程)。/include/linux/sched.h/kernel/sched.c類似uC/OS-II中的OS_TCB ,Linux的進(jìn)程控制塊task_struct包含有進(jìn)程的描述信息、控制信息以及資源信息,是進(jìn)程的靜態(tài)描述進(jìn)程與任務(wù):似乎是同一回事。Linux文檔把process和 task的概念未加區(qū)分。 為了方便和出于個(gè)人習(xí)慣,后文在不會(huì)造成誤解的條件下,對(duì)task_struc也稱為任務(wù)進(jìn)程控制塊或TCB。 進(jìn)程標(biāo)識(shí)符 優(yōu)先級(jí) 堆棧空間 進(jìn)程狀態(tài)task_

4、struct定義在 /kernel/include/linux/sched.h 的第437行-587行volatile long state;/* -1 unrunnable, 0 runnable, 0 stopped */ 2.6與2.4的宏定義數(shù)值上有較大的差別2.6新增了兩種狀態(tài):TRACED、DEAD TASK_DEAD是表示已經(jīng)退出且不需父進(jìn)程回收的進(jìn)程的狀態(tài)。 TASK_TRACED供調(diào)試使用似乎有STOPPED有點(diǎn)兒重復(fù)?)TASK_ZOMBIE一個(gè)已經(jīng)終止的但仍保留有任務(wù)結(jié)構(gòu)的進(jìn)程已經(jīng)死了,戶口未注銷)。TASK_RUNNING 就緒態(tài)(準(zhǔn)確的說應(yīng)該是task_runable

5、)TASK_INTERRUPTIBLE、TASK_UNITERRUPTIBLE 不同深度的睡眠態(tài)TASK_STOPPED 描述一個(gè)已經(jīng)停止的進(jìn)程,當(dāng)進(jìn)程接收到一個(gè)特殊信號(hào)或被使用ptrace系統(tǒng)調(diào)用的進(jìn)程監(jiān)控,并將控制權(quán)交給監(jiān)控進(jìn)程我的理解就是斷點(diǎn)調(diào)試)。據(jù)說是:“區(qū)分C程序員和嵌入式系統(tǒng)程序員的最基本的問題”一個(gè)變量加上修飾符volatile后:說明這個(gè)變量可能會(huì)被意想不到地改變,編譯器就不會(huì)去假設(shè)這個(gè)變量的值了。這樣,優(yōu)化器在用到這個(gè)變量時(shí)必須每次都小心地重新讀取這個(gè)變量的值(From Memory),而不是使用保存在計(jì)算單元寄存器里的備份。舉例:計(jì)數(shù)器的寄存器, 多線程, 中斷union

6、 task_union /cxl: 分配/回收/訪問 struct task_struct task; unsigned long stackINIT_TASK_SIZE/sizeof(long); ; 課堂上的講述:/xlanchen/EmbeddedOperatingSystems2019Spring/sched.h.html2.4版中,內(nèi)核在創(chuàng)建進(jìn)程時(shí),為每個(gè)進(jìn)程分配兩個(gè)連續(xù)的物理頁(yè)面(8KB),它的頂端(低地址部分)用作存儲(chǔ)進(jìn)程的task_struct結(jié)構(gòu)(約1KB),剩下的約7KB就是進(jìn)程的系統(tǒng)空間堆棧,內(nèi)核可以通過棧寄存器指針ESP快速地訪問該進(jìn)程.在L

7、inux 2.6中,這兩個(gè)頁(yè)面頂端存放的不再是進(jìn)程的整個(gè)task_struct結(jié)構(gòu),而是task_struct中的thread_info, task_struct的大部分信息保存在棧外,通過thread_info的task指針可以方便地訪問到. 在任務(wù)的系統(tǒng)堆棧頂部放入的是該任務(wù)的thread_info記錄,而不是TCB一一個(gè)個(gè)或或兩兩個(gè)個(gè)物物理理頁(yè)頁(yè)面面4/8k系系統(tǒng)統(tǒng)堆堆棧棧空空間間thread_info52字節(jié)include/asm-i386/thread_info.h 中對(duì)thread_info的定義thread_info是描述任務(wù)的一個(gè)重要結(jié)構(gòu)體,當(dāng)前進(jìn)程運(yùn)行的一些環(huán)境信息。task

8、指針指向其對(duì)應(yīng)的任務(wù)控制塊preempt_count是用來表示內(nèi)核能否被搶占的使能成員。如果它大于0,表示內(nèi)核不能被搶占;如果等于0,則表示內(nèi)核處于安全狀態(tài)即沒有加鎖),可以搶占。flags里面有一個(gè)TIF_NEED_RESCHED位,如果此標(biāo)志位為1,則表示應(yīng)該盡快啟動(dòng)調(diào)度器。_u8supervisor_stack0;并不是每個(gè)編譯器都支持0長(zhǎng)度數(shù)組。GCC支持,方便計(jì)算對(duì)象的大小。該數(shù)組沒有占用結(jié)構(gòu)體的空間,所以thread_info長(zhǎng)度為52,數(shù)組空間需要以后用malloc()來分配。該數(shù)組占據(jù)的空間和系統(tǒng)堆棧空間重疊,從該數(shù)組的位置和該數(shù)組的命名上推斷,它就是指的該進(jìn)程的系統(tǒng)堆棧。在a

9、sm-arm中的定義其中,cpu_context用來保存CPU上下文。struct thread_info *thread_info;個(gè)人認(rèn)為thread_info和task_struct一樣,是任務(wù)的一個(gè)重要記錄,兩者互相關(guān)聯(lián),并沒有從屬關(guān)系。通過thread_info指針,我們可以把TCB和它的堆棧聯(lián)系起來/include/asm-arm/current.h中實(shí)現(xiàn)current()/include/asm-arm/thread_info.h中實(shí)現(xiàn)current_thread_info()prio是進(jìn)程的動(dòng)態(tài)優(yōu)先級(jí),是調(diào)度器選擇候選進(jìn)程next的主要依據(jù) static_prio則是進(jìn)程的靜態(tài)

10、優(yōu)先級(jí), 應(yīng)該是進(jìn)程開始時(shí)從父程繼承來的kernel/sched.c中定義了兩個(gè)宏來完成將nice轉(zhuǎn)換到prio的取值區(qū)間和將prioity轉(zhuǎn)換到nice取值區(qū)間??梢妏rioity和nice的關(guān)系是: priority = MAX_RT_PRIO+nice+20進(jìn)程優(yōu)先級(jí)分實(shí)時(shí)和非實(shí)時(shí)兩部分,二者不可逾越。struct list_head run_list;include/linux/list.h定義了一種抽象的雙向鏈表struct list_head, 通過它可以將任意類型的結(jié)構(gòu)體鏈接到一起。task_struct也是通過這種方式鏈接起來的。 int activated;表示進(jìn)程因什么原因

11、進(jìn)入就緒態(tài),這一原因會(huì)影響到調(diào)度優(yōu)先級(jí)的計(jì)算。activated 有四個(gè)值:-1,進(jìn)程從 TASK_UNINTERRUPTIBLE 狀態(tài)被喚醒; 0,缺省值,進(jìn)程原本就處于就緒態(tài); 1,進(jìn)程從 TASK_INTERRUPTIBLE 狀態(tài)被喚醒,且不在中斷上下文中; 2,進(jìn)程從 TASK_INTERRUPTIBLE 狀態(tài)被喚醒,且在中斷上下文中。 TASK_INTERRUPTIBLE 狀態(tài)進(jìn)程由中斷激活,則該進(jìn)程最有可能是交互式的,因而,置 activated=2;否則置activated=1。 如果進(jìn)程是從 TASK_UNINTERRUPTIBLE 狀態(tài)中被喚醒的,那么 activated=-

12、1在try_to_wake_up()函數(shù)中)。 activated 變量的具體含義和使用見優(yōu)化了的優(yōu)先級(jí)計(jì)算方式。 其余的重要成員,諸如:進(jìn)程號(hào),父進(jìn)程指針等,老師已經(jīng)講得很詳細(xì),不再冗述定義在/kernel/sched.c 中,第217行289行2.6內(nèi)核為每CPU的數(shù)據(jù)結(jié)構(gòu),每個(gè)處理器都維護(hù)一個(gè)自己的就緒隊(duì)列。相對(duì)2.4公共的就緒隊(duì)列而言,這將大大減小競(jìng)爭(zhēng),具有更好并行計(jì)算能力。unsigned long nr_running ;本就緒隊(duì)列中就緒進(jìn)程的個(gè)數(shù).它是active隊(duì)列和expired隊(duì)列就緒進(jìn)程個(gè)數(shù)的和: nr_running = active-nr_active + expir

13、ed-nr_active prio_array_t *active, *expired, arrays2;就緒隊(duì)列根據(jù)時(shí)間片是否被用完分為了active隊(duì)列和expired隊(duì)列。queue是指定優(yōu)先級(jí)進(jìn)程list的指針,如queuei就是priority為 i 的進(jìn)程的指針。bitmap是一張優(yōu)先級(jí)的位圖,或者可以說的位數(shù)組,每一位代表了一個(gè)優(yōu)先級(jí)類似uC/OS-II)。MAX_PRIO指的是優(yōu)先級(jí)的數(shù)量. 其結(jié)構(gòu)為為什么要+1+7而不是直接+8 ?0 MAX_PRIO之間,共了MAX_PRIO+1個(gè)優(yōu)先級(jí),所以要加1被除數(shù)為8, 加7是為了向上取整。同理,被除數(shù)為sizof(long)時(shí),先加上sizeof(long)-1,也是為了上取整。這樣就求出了需要的長(zhǎng)整型變量數(shù)。問題:為什么不用char,而要用long?#define MAX_PRIO(MAX_RT_PRIO + 40)#define MAX_RT_PRIO MAX_USER_RT_PRIO#define MAX_USER_RT_PRIO100include/asm-arm/bitops.h中尋找最高優(yōu)先級(jí)函數(shù)_ffs()用來查找一個(gè)長(zhǎng)整型變量最右邊的1是第幾位include/asm-i386/bitops.h中尋找最高優(yōu)先級(jí)函數(shù) 按宏定義,會(huì)生成160bit的位數(shù)組5個(gè)long),構(gòu)成一張表。

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論