版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、重 慶 大 學(xué)學(xué) 生 實(shí) 驗(yàn) 報(bào) 告實(shí)驗(yàn)課程名稱 操作系統(tǒng)原理 開課實(shí)驗(yàn)室 重慶大學(xué)DS1501 學(xué) 院 軟件工程 年級 2013 專業(yè)班 學(xué) 生 姓 名 學(xué) 號 開 課 時 間 2015 至 2016 學(xué)年第 一 學(xué)期總 成 績 教師簽名洪明堅(jiān)重慶大學(xué)軟件 學(xué)院制操作系統(tǒng)原理實(shí)驗(yàn)報(bào)告 開課實(shí)驗(yàn)室:DS1501 2016 年 1月 6 日學(xué)院軟件學(xué)院年級、專業(yè)、班姓名成績課程名稱操作系統(tǒng)原理實(shí)驗(yàn)項(xiàng)目名 稱線程及其調(diào)度指導(dǎo)教師教師評語教師簽名:年 月 日一、 實(shí)驗(yàn)?zāi)康模ㄜ浖枨笪臋n)掌握線程的創(chuàng)建掌握線程的調(diào)度a) 靜態(tài)優(yōu)先級調(diào)度b) 動態(tài)優(yōu)先級調(diào)度二、實(shí)驗(yàn)原理(軟件設(shè)計(jì)文檔) 系統(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, (void *)
3、0); 三、使用儀器、材料(軟硬件開發(fā)環(huán)境)Notepad+expenv四、實(shí)驗(yàn)步驟(實(shí)現(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; i50; i+)m = random() % 200;if (m0) m = 0 - m; draw(i * 10, 0, 0 + m);arryi = m;sort_m(arry, 50, 0);task_exit(0);void t
4、sk_foo_line2(void *pv)int m;int i;int arry50;srand(time(NULL);for (i = 0; i50; i+)m = random() % 200;if (m0) 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; i50; i+)m = random() % 200;i
5、f (m0) 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; iy2; i+)setPixel(i, x, RGB(255, 255, 255);void resetBK(int x, int y1, int y2)int i;for (i = y1; iy2; i+)setPixel(i, x, RGB(0, 0, 0);三排序:冒泡void sort_m(int* arry
6、, int n, int l)int i, j, tem;int t = 500 / n;for (i = 0; in; i+)for (j = 0; 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 + j + 1) = tem;draw(j*t, l, l + *(arry + j);draw(j*t + t, l, l + *(arry + j + 1);
7、插入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 (in & *(arry + i)key)*(arry + i - 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);
8、選擇void sort_x(int* arry, int n, int l)int i=0, j=0, lowindex = 0;int t = 500 / n;for (i = 0; ii; j-)if (arryj 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)先級*/把線
9、程tid的nice設(shè)為(prio-NZERO)int sys_setpriority(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 (prio40) prio=40;save_flags_cli(flags);tsk = get_task(tid); /用save_flags_cli/
10、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) &(select-state = TASK_
11、STATE_READY)/if(my_select=NULL) my_select=select; continue;if(select-nicenice)/選擇等待隊(duì)列里的線程優(yōu)先級高的my_select=select;if(my_select-tid=0)/跳過task0運(yùn)行my_select=select;select=select-next; if(my_select=g_task_running) if(g_task_running-state = TASK_STATE_READY) return;my_select = task0; /僅當(dāng)沒有其他可運(yùn)行的線程時,才能調(diào)度 g_re
12、sched = 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ù)荷用浮點(diǎn)(float-point)表示g_load_avg和estcpu:精度高,效率低動態(tài)調(diào)度schedule:void schedule() struct tcb *select=g_task_head;struct tcb *my_select=g_task_runni
13、ng;while (select != NULL)select-priority = 127 - fixedpt_toint(fixedpt_div(select-estcpu, fixedpt_fromint(4) - select-nice * 2; /計(jì)算所有線程的priority select = select-next;/動態(tài)優(yōu)先級select = g_task_head;while(select!=NULL)if(select-tid != 0) &(select-state = TASK_STATE_READY) if(my_select-prioritypriority) my
14、_select=select;/選擇等待隊(duì)列里的線程優(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_select = task0; printk(0x%d - 0x%drn, (g_task_running = NULL) ? -1 : g_task_running-tid, select-tid); g_resched = 0; switch_to
15、(my_select);timer.c中添加如下g_task_running-estcpu = fixedpt_add(g_task_running-estcpu, FIXEDPT_ONE);/計(jì)算線程使用CPU時間estcpuif(g_timer_ticks % HZ=0)/每隔一秒計(jì)算一次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
16、(my_select-state=TASK_STATE_READY) nready+;nice=my_select-nice;ratio = fixedpt_mul(FIXEDPT_TWO, g_load_avg); /每秒鐘為所有線程(運(yùn)行、就緒和等待)更新一次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
17、-next;fixedpt r59_60 = fixedpt_div(fixedpt_fromint(59), fixedpt_fromint(60);/計(jì)算系統(tǒng)的平均負(fù)荷g_load_avgfixedpt r01_60 = 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);
18、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(1024 * 1024);unsigned char* stack_foo4 = (unsigned char *)malloc(1024 * 10
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 文化創(chuàng)意技術(shù)合作合同匯編
- 工作室合伙合同書模板
- 設(shè)備租賃和購買合同模板
- 2024年讓與擔(dān)保合同范本
- 商品住宅購銷合同
- 個人債務(wù)轉(zhuǎn)讓協(xié)議書撰寫指南
- 房產(chǎn)二次抵押借款合同
- 房地產(chǎn)中介服務(wù)協(xié)議書正規(guī)范本2024年
- 債權(quán)轉(zhuǎn)讓協(xié)議合同
- 新型能源供電協(xié)議書
- 嬰兒培養(yǎng)箱校準(zhǔn)規(guī)范
- 《補(bǔ)貼與反補(bǔ)貼措施協(xié)議》對出口信貸的法律規(guī)制研究2
- 鐵道運(yùn)輸實(shí)訓(xùn)總結(jié)報(bào)告
- 企業(yè)信息管理概述課件
- MOOC 光纖光學(xué)-華中科技大學(xué) 中國大學(xué)慕課答案
- 中國醫(yī)藥流通行業(yè)情況分析
- 兒童民航知識課件
- 對科學(xué)施肥方法的
- (修改后) 電子工程中級職稱考試題
- 家長會示范課件引導(dǎo)孩子擁抱自信與勇氣
- 古建筑修復(fù)方案
評論
0/150
提交評論