




版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 無(wú)刷直流電機(jī)調(diào)速控制系統(tǒng)設(shè)計(jì)方案畢業(yè)論文
- 25年公司級(jí)員工安全培訓(xùn)考試試題及參考答案(典型題)
- 2025日常安全培訓(xùn)考試試題附答案(B卷)
- 2025年國(guó)際商業(yè)代理合同范本
- 2025實(shí)習(xí)協(xié)議、就業(yè)協(xié)議和勞動(dòng)合同的區(qū)別與選擇
- 2025關(guān)于建設(shè)局《合同價(jià)款結(jié)算管理》和《合同變更與索賠管理》及
- 2025起重機(jī)械租賃合同
- 2025年院線經(jīng)營(yíng)項(xiàng)目建議書
- 2025網(wǎng)站信息會(huì)員信息服務(wù)合同書樣本
- 2025廣告公司收購(gòu)合同范本
- 高樓遮光補(bǔ)償協(xié)議書范本
- 課題申報(bào)書:生成式人工智能賦能高職教學(xué)變革研究
- 母乳喂養(yǎng)知識(shí)培訓(xùn)課件下載
- 《自由現(xiàn)金流折現(xiàn)法對(duì)東鵬特飲公司的財(cái)務(wù)估值實(shí)例分析》2000字
- 西安市曲江第三中學(xué)行政人員及教師招聘筆試真題2024
- 2025-2030中國(guó)竹纖維行業(yè)市場(chǎng)發(fā)展現(xiàn)狀及競(jìng)爭(zhēng)策略與投資前景研究報(bào)告
- 委托外包催收合同協(xié)議
- 2025-2030中國(guó)涂裝行業(yè)市場(chǎng)深度分析及發(fā)展預(yù)測(cè)與投資策略研究報(bào)告
- 乳腺癌診治指南與規(guī)范(2025年版)解讀
- 銀行系統(tǒng)招聘考試(經(jīng)濟(jì)、金融、會(huì)計(jì))模擬試卷14
- 2025屆百師聯(lián)盟高三聯(lián)考模擬預(yù)測(cè)(沖刺二)語(yǔ)文試題含答案
評(píng)論
0/150
提交評(píng)論