




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、重 慶 大 學(xué)學(xué) 生 實 驗 報 告實驗課程名稱 操作系統(tǒng)原理 開課實驗室 重慶大學(xué)DS1501 學(xué) 院 軟件工程 年級 2013 專業(yè)班 學(xué) 生 姓 名 學(xué) 號 開 課 時 間 2015 至 2016 學(xué)年第 一 學(xué)期總 成 績 教師簽名洪明堅重慶大學(xué)軟件 學(xué)院制操作系統(tǒng)原理實驗報告 開課實驗室:DS1501 2016 年 1月 6 日學(xué)院軟件學(xué)院年級、專業(yè)、班姓名成績課程名稱操作系統(tǒng)原理實驗項目名 稱線程及其調(diào)度指導(dǎo)教師教師評語教師簽名:年 月 日一、 實驗?zāi)康模ㄜ浖枨笪臋n)掌握線程的創(chuàng)建掌握線程的調(diào)度a) 靜態(tài)優(yōu)先級調(diào)度b) 動態(tài)優(yōu)先級調(diào)度二、實驗原理(軟件設(shè)計文檔) 系統(tǒng)調(diào)用接口,線
2、程相關(guān)函數(shù): Step1:定義線程函數(shù)void tsk_foo(void *pv) printf("This is task foo with tid=%drn“, task_getid(); task_exit(0); Step2:申請用戶棧unsigned char *stack_foo; stack_foo = (unsigned char *)malloc(1024*1024); 線程退出后,才能把用戶棧用free釋放掉! Step3:創(chuàng)建線程int tid_foo; tid_foo = task_create(stack_foo+1024*1024, tsk_foo, (v
3、oid *)0); 三、使用儀器、材料(軟硬件開發(fā)環(huán)境)Notepad+expenv四、實驗步驟(實現(xiàn)的過程)隨機生成3組非負(fù)整數(shù)列表,創(chuàng)建3個線程,分別用3種不同的排序算法(插入,冒泡,選擇)對列表進(jìn)行排序三線程:void tsk_foo_line1(void *pv)int m;int i;int arry50;srand(time(NULL);for (i = 0; i<50; i+)m = random() % 200;if (m<0) m = 0 - m; draw(i * 10, 0, 0 + m);arryi = m;sort_m(arry, 50, 0);task_
4、exit(0);void tsk_foo_line2(void *pv)int m;int i;int arry50;srand(time(NULL);for (i = 0; i<50; i+)m = random() % 200;if (m<0) m = 0 - m; draw(i * 10, 345, 345 + m);arryi = m;sort_x(arry, 50, 345);task_exit(0);void tsk_foo_line3(void *pv)int m;int i;int arry50;srand(time(NULL);for (i = 0; i<5
5、0; i+)m = random() % 200;if (m<0) m = 0 - m; draw(i * 10, 690, 690 + m);arryi = m;sort_c(arry, 50, 690);task_exit(0);void draw(int x, int y1, int y2)int i;for (i = y1; i<y2; i+)setPixel(i, x, RGB(255, 255, 255);void resetBK(int x, int y1, int y2)int i;for (i = y1; i<y2; i+)setPixel(i, x, RG
6、B(0, 0, 0);三排序:冒泡void sort_m(int* arry, int n, int l)int i, j, tem;int t = 500 / n;for (i = 0; i<n; i+)for (j = 0; j<n - i - 1; j+)if (*(arry + j)>*(arry + j + 1)resetBK(j*t, l, l + *(arry + j);resetBK(j*t + t, l, l + *(arry + j + 1);tem = *(arry + j);*(arry + j) = *(arry + j + 1);*(arry +
7、j + 1) = tem;draw(j*t, l, l + *(arry + j);draw(j*t + t, l, l + *(arry + j + 1);插入void sort_c(int* arry, int n, int l)int i, j, key;int t = 500 / n;for (j = n - 2; j >= 0; j-)key = *(arry + j); i = j + 1;resetBK(j*t, l, l + key);while (i<n && *(arry + i)<key)*(arry + i - 1) = *(arry
8、+ i);draw(i*t - t, l, l + *(arry + i - 1);i = i + 1;*(arry + i - 1) = key;draw(i*t - t, l, l + key);選擇void sort_x(int* arry, int n, int l)int i=0, j=0, lowindex = 0;int t = 500 / n;for (i = 0; i<n; i+) lowindex = i;for (j = n - 1; j>i; j-)if (arryj < arrylowindex)lowindex = j;if (lowindex !
9、= i)resetBK(i*t, l, l + *(arry + i);resetBK(lowindex*t, l, l + *(arry + lowindex);int temp = arryi;arryi = arrylowindex;arrylowindex = temp; draw(i*t, l, l + *(arry + i);draw(lowindex*t, l, l + *(arry + lowindex);線程控制塊tcb中增加nice屬性,在函數(shù)sys_task_create中初始化nice=0/*系統(tǒng)調(diào)用getpriority的執(zhí)行函數(shù)獲取當(dāng)前線程的優(yōu)先級*/int sys
10、_getpriority(int tid)if(tid=0) return g_task_running->nice+NZERO;/獲取當(dāng)前線程的nice值uint32_t flags; struct tcb *tsk;save_flags_cli(flags);tsk = get_task(tid);restore_flags(flags); return tsk->nice+NZERO; /獲取線程的nice值/*系統(tǒng)調(diào)用setpriority的執(zhí)行函數(shù)調(diào)整當(dāng)前線程的優(yōu)先級*/把線程tid的nice設(shè)為(prio-NZERO)int sys_setpriority(int ti
11、d, int prio)uint32_t flags; struct tcb *tsk;if(tid=0) save_flags_cli(flags);g_task_running->nice=prio-20;/設(shè)置當(dāng)前線程的nice值restore_flags(flags);return 0;/if(tsk=NULL) return -1;if (prio<0) prio = 0; /prio必須在0,2*NZERO-1if(prio>40) prio=40;save_flags_cli(flags);tsk = get_task(tid); /用save_flags_cl
12、i/restore_flags保護(hù)restore_flags(flags);tsk->nice=prio-20;/設(shè)置線程的nice值return 0;把這兩個個函數(shù)做成系統(tǒng)調(diào)用,分別是getpriority(int tid),setpriority(int tid, int prio)靜態(tài)調(diào)度schedule:void schedule()struct tcb *select = g_task_head;struct tcb *my_select=g_task_running;while(select!=NULL)if(select->tid != 0) &&(s
13、elect->state = TASK_STATE_READY)/if(my_select=NULL) my_select=select; continue;if(select->nice<=my_select->nice)/選擇等待隊列里的線程優(yōu)先級高的my_select=select;if(my_select->tid=0)/跳過task0運行my_select=select;select=select->next; if(my_select=g_task_running) if(g_task_running->state = TASK_STATE
14、_READY) return;my_select = task0; /僅當(dāng)沒有其他可運行的線程時,才能調(diào)度 g_resched = 0; switch_to(my_select);線程控制塊tcb中增加estcpu屬性,在函數(shù)sys_task_create中初始化estcpu=0;增加priority屬性,在函數(shù)sys_task_create中初始化priority=0;timer.c中增加全局變量g_load_avg:表示系統(tǒng)的平均負(fù)荷用浮點(float-point)表示g_load_avg和estcpu:精度高,效率低動態(tài)調(diào)度schedule:void schedule() struct
15、tcb *select=g_task_head;struct tcb *my_select=g_task_running;while (select != NULL)select->priority = 127 - fixedpt_toint(fixedpt_div(select->estcpu, fixedpt_fromint(4) - select->nice * 2; /計算所有線程的priority select = select->next;/動態(tài)優(yōu)先級select = g_task_head;while(select!=NULL)if(select->
16、tid != 0) &&(select->state = TASK_STATE_READY) if(my_select->priority<select->priority) my_select=select;/選擇等待隊列里的線程優(yōu)先級高的 else if(my_select->tid=0) my_select=select; select=select->next; if(my_select=g_task_running) if(my_select->state = TASK_STATE_READY) return; my_sele
17、ct = task0; printk("0x%d -> 0x%drn", (g_task_running = NULL) ? -1 : g_task_running->tid, select->tid); g_resched = 0; switch_to(my_select);timer.c中添加如下g_task_running->estcpu = fixedpt_add(g_task_running->estcpu, FIXEDPT_ONE);/計算線程使用CPU時間estcpuif(g_timer_ticks % HZ=0)/每隔一秒計算一
18、次int nready=0; /表示處于就緒狀態(tài)的線程個數(shù)struct tcb *my_select=g_task_head;int nice;/g_task_running->nice;/my_select=g_task_head;fixedpt ratio;while(my_select!=NULL)if(my_select->state=TASK_STATE_READY) nready+;nice=my_select->nice;ratio = fixedpt_mul(FIXEDPT_TWO, g_load_avg); /每秒鐘為所有線程(運行、就緒和等待)更新一次ra
19、tio = fixedpt_div(ratio, fixedpt_add(ratio, FIXEDPT_ONE);my_select->estcpu = fixedpt_add(fixedpt_mul(ratio,my_select->estcpu), fixedpt_fromint(nice);my_select=my_select->next;fixedpt r59_60 = fixedpt_div(fixedpt_fromint(59), fixedpt_fromint(60);/計算系統(tǒng)的平均負(fù)荷g_load_avgfixedpt r01_60 = fixedpt_d
20、iv(FIXEDPT_ONE,fixedpt_fromint(60);g_load_avg = fixedpt_add(fixedpt_mul(r59_60, g_load_avg), fixedpt_mul(r01_60, fixedpt_fromint(nready);主函數(shù):int mode = 0x0118;initGraphics(mode);int y = 0;for (y = 0; y < g_mib.YResolution; y+)setPixel(g_mib.XResolution / 3, y, RGB(0, 125, 125);setPixel(g_mib.XResolution / 3 * 2, y, RGB(0, 125, 125);int* pcode_exit;/申請用戶棧unsigned char* stack_foo1 = (unsigned char *)malloc(1024 * 1024);unsigned char* stack_foo2 = (unsigned char *)malloc(1024 * 1024);unsigned char* stack_foo3 = (unsigned char *)mal
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- T/CECS 10214-2022鋼面鎂質(zhì)復(fù)合風(fēng)管
- T/CECS 10081-2020餐廚廢棄物智能處理設(shè)備
- T/CCS 032-2023礦井智能化通風(fēng)系統(tǒng)建設(shè)技術(shù)規(guī)范
- T/CCMA 0188-2024純電動裝載機動態(tài)噪聲試驗方法
- T/CCMA 0074-2019挖掘機載荷譜試驗方法
- T/CAS 512-2021個人理財在線培訓(xùn)服務(wù)要求
- T/CAQI 10-2021新風(fēng)凈化機
- 調(diào)研素材面試題及答案
- 帶頭致富面試題及答案
- 工大博士面試題及答案
- TSM0501G 豐田試驗測試標(biāo)準(zhǔn)
- 實驗室安全準(zhǔn)入考試題庫答案
- 機械加工圖紙標(biāo)注法資料
- HDB3編解碼電路設(shè)計
- 體系文件編號規(guī)則
- 公路安全監(jiān)理細(xì)則
- 分布式系統(tǒng)復(fù)習(xí)題與答案
- 壓力彈簧力度計算器及計算公式
- (3)-小兒推拿促生長的診療思路及手法演示
- 唐宋名家詞智慧樹知到答案章節(jié)測試2023年河南大學(xué)
- 超星學(xué)習(xí)通《漢書》導(dǎo)讀(中國人民大學(xué))章節(jié)測試答案
評論
0/150
提交評論