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

下載本文檔

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

文檔簡介

1、操作系統(tǒng)原理實驗二、線程/進程及其調(diào)度重慶大學(xué)軟件學(xué)院 洪明堅2014年8月實驗?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; / 時間片#define DEFAULT_QUANTUM 10 int32_t exit_code; / 退出代碼 struct wait_queue *wait_head; / 等待該線程退出的線程隊列 struct tcb *all_next; / 所有線程的鏈表指針;EPOS線程的表示 思考題 如何創(chuàng)建EPOS線程?EPOS線程如何退出? 請自行閱讀應(yīng)用程序源代碼(app/main.c),掌握線程的創(chuàng)建和退出 線程

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

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

5、mp_stack定義在entry.S中 內(nèi)核棧到用戶棧 何時切換? 中斷返回或系統(tǒng)調(diào)用結(jié)束時棧的切換:用戶棧 內(nèi)核棧#define hwint(irq, enable_icus) 保存現(xiàn)場 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:; 中斷處理中斷處理是否從用戶模式中來?保存現(xiàn)場到把現(xiàn)場(struct context)從臨時內(nèi)核棧移到當前線程的內(nèi)核棧,并切換到當前線程的內(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)場指令I(lǐng)RET依次彈出EIP, CS和EFLAGS如果將返回到用戶模式,還要彈出ESP和SS以切換回線程的用戶模式棧棧的切換 因此,中斷處

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

8、hedule的實現(xiàn)EPOS線程的切換 調(diào)度器選擇了一個可運行的線程new后,要把CPU從當前線程切換到new運行 當前線程: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可以看出 線程切換只是切換了兩個線程的內(nèi)核棧,也就是說 切換了內(nèi)核棧,就切換了線程!EPOS線程的切換 思考題 在創(chuàng)建一個新的線程時,如何構(gòu)造它的現(xiàn)場,使得它可以用switch_to函數(shù)啟動? 請自行閱讀task.c中的函數(shù)sys_task_create以找到答案 特別是machdep.h中定義的宏INIT_TASK_CONTEXT實驗內(nèi)容 重寫函數(shù)schedule,實現(xiàn)基于優(yōu)先級的線程調(diào)度 增加系統(tǒng)調(diào)用”int task_set_priority(int tid, int new_priority)”,用于改變線程的優(yōu)先級 tid必須大于0 該系統(tǒng)調(diào)用返回線程之前的優(yōu)先級 測試你的調(diào)度器 注意 需

溫馨提示

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

評論

0/150

提交評論