




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、精選優(yōu)質(zhì)文檔-傾情為你奉上重 慶 大 學(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è)
2、計文檔) 系統(tǒng)調(diào)用接口,線程相關(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
3、, tsk_foo, (void *)0); 三、使用儀器、材料(軟硬件開發(fā)環(huán)境)Notepad+expenv四、實驗步驟(實現(xiàn)的過程)隨機(jī)生成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,
4、 50, 0);task_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 (
5、i = 0; i<50; 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+)setP
6、ixel(i, x, RGB(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 +
7、 1);*(arry + 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 -
8、 1) = *(arry + 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;i
9、f (lowindex != 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)前線程
10、的優(yōu)先級*/int sys_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_setpr
11、iority(int tid, 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); /用
12、save_flags_cli/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)
13、 &&(select->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
14、 = TASK_STATE_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 sched
15、ule() struct 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)i
16、f(select->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) re
17、turn; 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);timer.c中添加如下g_task_running->estcpu = fixedpt_add(g_task_running->estcpu, FIXEDPT_ONE);/計算線程使用CPU時間estcpuif(g_timer_ticks %
18、HZ=0)/每隔一秒計算一次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); /每秒鐘為所有線程(運行
19、、就緒和等待)更新一次ratio = 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_6
20、0 = fixedpt_div(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 *)malloc(1
溫馨提示
- 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/CNPPA 3022-2023藥用玻璃容器外觀缺陷評估指南
- T/CNIDA 005-2023核工程邊坡技術(shù)規(guī)程
- T/CNESA 1202-2020飛輪儲能系統(tǒng)通用技術(shù)條件
- T/CNCA 058-2023煤炭行業(yè)健康企業(yè)評價規(guī)范
- T/CIQA 47-2022紅花質(zhì)量分級
- T/CIIA 028-2022生態(tài)系統(tǒng)長期觀測數(shù)據(jù)產(chǎn)品規(guī)范
- T/CGCC 62-2022自動售貨設(shè)備運營管理規(guī)范
- T/CGAS 027-2023城鎮(zhèn)燃?xì)庵悄苷{(diào)壓箱技術(shù)規(guī)范
- T/CECS 10129-2021塑料扁絲土石籠袋
- T/CCS 068-2023井工煤礦智能化數(shù)據(jù)中心運維管理規(guī)范
- 《中央企業(yè)合規(guī)管理辦法》解讀與啟示
- 《齊齊哈爾烤肉制作工藝與服務(wù)規(guī)范》(征求意見稿)
- GB/T 10322.1-2023鐵礦石取樣和制樣方法
- 垃圾焚燒發(fā)電廠污水處理檢修規(guī)程
- 安徽省池州市貴池區(qū)2023年數(shù)學(xué)六年級第二學(xué)期期末達(dá)標(biāo)檢測試題含解析
- 2023中小學(xué)德育工作指南德育工作實施方案
- 無土栽培學(xué)(全套課件660P)
- 成語故事半途而廢
- GB/T 7233.1-2009鑄鋼件超聲檢測第1部分:一般用途鑄鋼件
- GB/T 545-1996海軍錨
- GB/T 3683-2011橡膠軟管及軟管組合件油基或水基流體適用的鋼絲編織增強(qiáng)液壓型規(guī)范
評論
0/150
提交評論