操作系統(tǒng)實驗報告二_第1頁
操作系統(tǒng)實驗報告二_第2頁
操作系統(tǒng)實驗報告二_第3頁
操作系統(tǒng)實驗報告二_第4頁
操作系統(tǒng)實驗報告二_第5頁
已閱讀5頁,還剩4頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、重 慶 大 學(xué)學(xué) 生 實 驗 報 告實驗課程名稱 操作系統(tǒng)原理 開課實驗室 DS1501 學(xué) 院 軟件學(xué)院 年級 2013 專業(yè)班 軟件工程2 班 學(xué) 生 姓 名 胡其友 學(xué) 號 20131802 開 課 時 間 2015 至 2016 學(xué)年第 一 學(xué)期總 成 績教師簽名洪明堅軟件學(xué)院制操作系統(tǒng)原理實驗報告 開課實驗室: 年 月 日學(xué)院軟件學(xué)院年級、專業(yè)、班2013級軟件工程2班姓名胡其友成績課程名稱操作系統(tǒng)原理實驗項目名 稱指導(dǎo)教師洪明堅教師評語教師簽名:洪明堅年 月 日1實驗?zāi)康模?隨機生成3組非負整數(shù)列表,然后創(chuàng)建3個線程,分別用3種不同的排序算法對列表進行排序 如何生成隨機數(shù)? Ste

2、p1:void srand(uint32_t seed) seed是隨機數(shù)的種子,建議用實驗(一)中實現(xiàn)的系統(tǒng)調(diào)用“time_t time(time_t *loc)” srand(time(NULL) Step2:多次調(diào)用“uint32_t random()”獲得隨機數(shù) 進入圖形模式,沿垂直方向把屏幕分成3個區(qū)域,每個排序線程用一個區(qū)域,動態(tài)顯示排序過程,運行效果如這里所示。 如何進入圖形模式? Step1:調(diào)用listGraphicsModes()輸出系統(tǒng)支持的圖形模式» 該函數(shù)必須在文本模式下運行,才能看到結(jié)果 Step2:選擇一個模式,調(diào)用initGraphics(int mo

3、de)進入圖形模式 如何獲取屏幕的分辨率? 水平:g_mib.XResolution 垂直:g_mib.YResolution 如何打點? void setPixel(int x, int y, COLORREF cr); » (x, y)是點坐標» cr是顏色,用宏定義RGB(r,g,b)生成,其中r,g,b的取值范圍都是0-255 如何從cr中取出r,g,b?用getXValue(cr),其中X=R,G,B 如何退出圖形模式? int exitGraphics();2實驗內(nèi)容: 實現(xiàn)靜態(tài)優(yōu)先級調(diào)度算法 修改task.c中的函數(shù)schedule,實現(xiàn)靜態(tài)優(yōu)先級調(diào)度 在“s

4、truct tcb”中增加線程的靜態(tài)優(yōu)先級屬性nice 一定要加在kstack字段之后! 在函數(shù)sys_task_create中初始化nice=0 nice是整數(shù),取值范圍-NZERO, NZERO-1,值越小優(yōu)先級越高 #define NZERO 20 函數(shù)schedule被調(diào)用時,CPU的中斷已經(jīng)被關(guān)閉 線程0(task0,它的ID=0)是一個特殊的線程,僅當(dāng)沒有其他可運行的線程時,才能調(diào)度task0運行! 實現(xiàn)靜態(tài)優(yōu)先級調(diào)度算法(續(xù)) 增加系統(tǒng)調(diào)用 int getpriority(int tid) 成功返回(nice+NZERO),失敗返回-1 int setpriority(int t

5、id, int prio) 把線程tid的nice設(shè)為(prio-NZERO) prio必須在0,2*NZERO-1 成功返回0,失敗返回-1 注意 如果tid=0,表示獲取/設(shè)置當(dāng)前線程的nice值,而不是task0! 在調(diào)用函數(shù)“struct tcb *get_task(int tid)”獲取struct tcb指針時,一定要用save_flags_cli/restore_flags保護起來 uint32_t flags; struct tcb *tsk; save_flags_cli(flags); tsk = get_task(tid); restore_flags(flags);3實

6、驗步驟: 實現(xiàn)動態(tài)優(yōu)先級調(diào)度算法 在“struct tcb”中,再增加兩個屬性 estcpu:表示線程最近使用了多少CPU時間 在函數(shù)sys_task_create中初始化estcpu=0 每次定時器中斷時:g_task_running->estcpu+,task0除外! 每秒鐘為所有線程(運行、就緒和等待)更新一次 priority:表示線程的動態(tài)優(yōu)先級 priority = PRI_USER_MAX-(estcpu/4)-(nice*2) 取值范圍從0(PRI_USER_MIN)到127(PRI_USER_MAX) 值越大優(yōu)先級越高 每次調(diào)度前,先計算所有線程的priority,再調(diào)

7、度 實現(xiàn)動態(tài)優(yōu)先級調(diào)度算法(續(xù)) 增加一個全局屬性 g_load_avg:表示系統(tǒng)的平均負荷 初值為零,每秒鐘更新一次 g_load_avg=(59/60) ×g_load_avg+(1/60) × nready» nready表示處于就緒狀態(tài)的線程個數(shù),task0除外! 屬性計算 g_load_avg 和線程的estcpu:在定時器的中斷處理函數(shù)(ISR)中計算 文件timer.c中的函數(shù)isr_timer 如何每隔一秒計算一次? (g_timer_ticks % HZ)» =0,表示1秒鐘已經(jīng)過去» 否則,還不到1秒鐘 函數(shù)isr_time

8、r被調(diào)用時,CPU的中斷已經(jīng)被關(guān)閉 線程的priority:在函數(shù)schedule中,調(diào)度之前計算,然后基于priority進行調(diào)度 效率問題 nice ,priority和nready都是整數(shù) 效率不是問題 g_load_avg 和estcpu是實數(shù) 浮點(float-point)表示:精度高,效率低! 定點(fixed-point)表示:精度低,效率高! 文件fixedptc.h中定義了定點數(shù)的類型fixedpt及其運算 如何顯示fixedpt類型變量的值,比如g_load_avg?char num20; fixedpt_str(g_load_avg, num, -2); printk(&

9、quot;g_load_avg = %srn", num); 定點數(shù)的運算 g_task_running->estcpu+g_task_running->estcpu = fixedpt_add(g_task_running->estcpu, FIXEDPT_ONE); g_load_avg = (59/60)*g_load_avg+(1/60)*nreadyfixedpt r59_60 = fixedpt_div(fixedpt_fromint(59), fixedpt_fromint(60);fixedpt r01_60 = fixedpt_div(FIXEDP

10、T_ONE, fixedpt_fromint(60);g_load_avg = fixedpt_add(fixedpt_mul(r59_60, g_load_avg), fixedpt_mul(r01_60, fixedpt_fromint(nready); priority = PRI_USER_MAX-(estcpu/4)-(nice*2)priority = PRI_USER_MAX - fixedpt_toint(fixedpt_div(estcpu, fixedpt_fromint(4) - p->nice*2; 定點數(shù)的運算4實驗報告:動態(tài)優(yōu)先級調(diào)度算法while(selec

11、t!=NULL)select->priority=127 - fixedpt_toint(fixedpt_div(select->estcpu, fixedpt_fromint(4) - select->nice*2;if(select->tid != 0) && (select->state = TASK_STATE_READY) if(my_select->priority<select->priority) my_select=select; else if(my_select->tid=0) my_select=se

12、lect; select=select->next; if(my_select=g_task_running) if(my_select->state = TASK_STATE_READY) return; my_select = task0; /printk("0x%d -> 0x%drn", (g_task_running = NULL) ? -1 : g_task_running->tid, select->tid); g_resched = 0; switch_to(my_select);靜態(tài)優(yōu)先級調(diào)度算法void schedule()struct tcb *select = g_task_head;struct tcb *my_select=g_task_running;while(select!=NULL)if(select->tid != 0) && (select->state = TASK_STATE_READY)/if(my_select=NULL) my_select=select; continue;if(select->nice<=my_select->nice)my_select=select;i

溫馨提示

  • 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)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論