操作系統(tǒng)原理_第1頁(yè)
操作系統(tǒng)原理_第2頁(yè)
操作系統(tǒng)原理_第3頁(yè)
操作系統(tǒng)原理_第4頁(yè)
操作系統(tǒng)原理_第5頁(yè)
已閱讀5頁(yè),還剩13頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、操作系統(tǒng)原理實(shí)驗(yàn)二、線程/進(jìn)程及其調(diào)度重慶大學(xué)軟件學(xué)院 洪明堅(jiān)2014年8月實(shí)驗(yàn)?zāi)康?掌握線程的內(nèi)部表示、調(diào)度和切換 EPOS線程的表示 線程控制塊(Task Control Block,TCB) 線程的棧 EPOS線程的調(diào)度 調(diào)度算法 EPOS線程的切換EPOS線程的表示struct tcb /*hardcoded*/ uint32_t kstack; /*saved top of the kernel stack for this task*/ int32_t tid; /* task id */ int32_t state; / 狀態(tài)#define TASK_STATE_BLOCKED

2、-1 / 阻塞#define TASK_STATE_READY 1 / 就緒#define TASK_STATE_ZOMBIE 2 / 僵尸 int32_t quantum; / 時(shí)間片#define DEFAULT_QUANTUM 10 int32_t exit_code; / 退出代碼 struct wait_queue *wait_head; / 等待該線程退出的線程隊(duì)列 struct tcb *all_next; / 所有線程的鏈表指針;EPOS線程的表示 思考題 如何創(chuàng)建EPOS線程?EPOS線程如何退出? 請(qǐng)自行閱讀應(yīng)用程序源代碼(app/main.c),掌握線程的創(chuàng)建和退出 線程

3、函數(shù)的最后,一定要調(diào)用task_exit,不能直接return!為什么?實(shí)驗(yàn)內(nèi)容 隨機(jī)生成一個(gè)整數(shù)列表,然后創(chuàng)建3個(gè)線程,分別用3種不同的排序算法對(duì)列表進(jìn)行排序 用函數(shù)srand及random(app/rand.c)生成隨機(jī)數(shù) 進(jìn)入圖形模式,沿垂直方向把屏幕等分成3個(gè)區(qū)域,每個(gè)排序線程用一個(gè)區(qū)域,動(dòng)態(tài)顯示排序過(guò)程,運(yùn)行效果如這里 參考video.c和main.c線程的棧tid用戶模式棧User mode stack內(nèi)核模式棧Kernel mode stack內(nèi)核模式棧:線程在內(nèi)核模式運(yùn)行時(shí)所用的棧,用于在中斷處理、系統(tǒng)調(diào)用等過(guò)程中保存現(xiàn)場(chǎng)(struct context)、臨時(shí)變量、函數(shù)參數(shù)和返

4、回地址等等;由內(nèi)核在創(chuàng)建線程(sys_task_create,task.c)時(shí)申請(qǐng)用戶模式棧:線程在用戶模式運(yùn)行時(shí)所用的棧,用于在函數(shù)調(diào)用過(guò)程中保存臨時(shí)變量、函數(shù)參數(shù)和返回地址等等;由用戶自己申請(qǐng),并作為參數(shù)傳遞給task_create(app/syscall.S)內(nèi)核級(jí)線程不需要用戶模式棧Low addrHigh addrLow addrHigh addrstruct tcbkstack棧的切換 用戶棧到內(nèi)核棧 何時(shí)切換? 中斷處理或系統(tǒng)調(diào)用時(shí) 切換時(shí),要用臨時(shí)內(nèi)核棧(tmp_stack)做過(guò)渡 為什么?因?yàn)镃PU從用戶模式切換到內(nèi)核模式時(shí),總是把棧頂指針(ESP)設(shè)為tmp_stack t

5、mp_stack定義在entry.S中 內(nèi)核棧到用戶棧 何時(shí)切換? 中斷返回或系統(tǒng)調(diào)用結(jié)束時(shí)棧的切換:用戶棧 內(nèi)核棧#define hwint(irq, enable_icus) 保存現(xiàn)場(chǎng) movl _g_task_running, %eax; cmpl $0, %eax; je 3f; movl 56(%esp), %ebx; testl $3, %ebx; jz 3f; movl %ecx, %edx; shll $2, %edx; movl %esp, %esi; movl (%eax), %esp; subl %edx, %esp; movl %esp, %edi; cld; rep

6、movsd; 3:; 中斷處理中斷處理是否從用戶模式中來(lái)?保存現(xiàn)場(chǎng)到把現(xiàn)場(chǎng)(struct context)從臨時(shí)內(nèi)核棧移到當(dāng)前線程的內(nèi)核棧,并切換到當(dāng)前線程的內(nèi)核棧是否棧的切換:內(nèi)核棧 用戶棧 .globl _ret_from_syscall_ret_from_syscall: 3: popl %fs popl %es popl %ds popal addl $8, %esp # discard exception and errorcode iret恢復(fù)現(xiàn)場(chǎng)指令I(lǐng)RET依次彈出EIP, CS和EFLAGS如果將返回到用戶模式,還要彈出ESP和SS以切換回線程的用戶模式棧棧的切換 因此,中斷處

7、理和系統(tǒng)調(diào)用是在當(dāng)前線程的上下文中執(zhí)行的! 臨時(shí)內(nèi)核棧(tmp_stack)只起過(guò)渡作用! 總而言之,操作系統(tǒng)內(nèi)核總是代表著某個(gè)線程在執(zhí)行指令! 內(nèi)核披著線程的外衣在運(yùn)行棧的切換 思考題 當(dāng)線程回到用戶模式下運(yùn)行時(shí),它的內(nèi)核棧一定是空的。為什么?EPOS線程的調(diào)度 調(diào)度函數(shù) void schedule() task.c 何時(shí)調(diào)度? 由全局變量“g_resched”決定 請(qǐng)自行閱讀timer.c中的函數(shù)isr_timer尋找答案 isr_timer是系統(tǒng)定時(shí)器的中斷處理函數(shù) 理論上,系統(tǒng)定時(shí)器每秒鐘觸發(fā)100次中斷 目前只實(shí)現(xiàn)了輪轉(zhuǎn)算法(round-robin) 請(qǐng)自行閱讀task.c中函數(shù)sc

8、hedule的實(shí)現(xiàn)EPOS線程的切換 調(diào)度器選擇了一個(gè)可運(yùn)行的線程new后,要把CPU從當(dāng)前線程切換到new運(yùn)行 當(dāng)前線程:g_task_running 切換函數(shù) void swtich_to(struct tcb *new) machdep.cvoid switch_to(struct tcb *new) _asm_ _volatile_ ( pushalnt pushl $1fnt movl %0, %eaxnt movl %esp, 0(%eax)nt addl $36, %espnt : :m(g_task_running) :%eax ); g_task_running = new;

9、 _asm_ _volatile_ ( movl %0, %eaxnt movl 0(%eax), %espnt retnt 1:nt popalnt : :m(g_task_running) :%eax );EPOS線程的切換g_task_running-kstack=ESPnewtid內(nèi)核模式棧Kernel mode stackkstacktid內(nèi)核模式棧Kernel mode stackkstackESP=g_task_running-kstackg_task_runningEPOS線程的切換 從函數(shù)switch_to可以看出 線程切換只是切換了兩個(gè)線程的內(nèi)核棧,也就是說(shuō) 切換了內(nèi)核棧,就切換了線程!EPOS線程的切換 思考題 在創(chuàng)建一個(gè)新的線程時(shí),如何構(gòu)造它的現(xiàn)場(chǎng),使得它可以用switch_to函數(shù)啟動(dòng)? 請(qǐng)自行閱讀task.c中的函數(shù)sys_task_create以找到答案 特別是machdep.h中定義的宏INIT_TASK_CONTEXT實(shí)驗(yàn)內(nèi)容 重寫函數(shù)schedule,實(shí)現(xiàn)基于優(yōu)先級(jí)的線程調(diào)度 增加系統(tǒng)調(diào)用”int task_set_priority(int tid, int new_priority)”,用于改變線程的優(yōu)先級(jí) tid必須大于0 該系統(tǒng)調(diào)用返回線程之前的優(yōu)先級(jí) 測(cè)試你的調(diào)度器 注意 需

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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)論