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

下載本文檔

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

文檔簡介

1、操作系統(tǒng) 課程實驗報告實驗題 目處理機調(diào)度實驗地點實驗?zāi)?.通過編寫程序?qū)崿F(xiàn)進(jìn)程或作業(yè)先來先服務(wù)、高優(yōu)先權(quán)、按的 時間片輪轉(zhuǎn)調(diào)度算法,進(jìn)一步掌握進(jìn)程調(diào)度的概念和算法, 加深對處理機分配的理解。2.了解 Linux 中進(jìn)程(線程)的調(diào)度機制。3.學(xué)習(xí)使用 Linux 中進(jìn)程(線程)調(diào)度算法,掌握相應(yīng)的與 調(diào)度有關(guān)的函數(shù)。1 、程序說明 :(1) 先來先服務(wù)算法:如果早就緒的進(jìn)程排在就緒隊列的前面,遲 就緒的進(jìn)程排在就緒隊列的后面,那么先來先服務(wù)(FCFS: firstcome first service )總是把當(dāng)前處于就緒隊列之首的那個進(jìn)程調(diào)度 到運行狀態(tài)。實 驗 內(nèi) 容(2) 輪轉(zhuǎn)法就是按一

2、定時間片 (記為 q) 輪番運行各個進(jìn)程。如果 q 是一個定值,則輪轉(zhuǎn)法是一種對各進(jìn)程機會均等的調(diào)度方法。(3) 優(yōu)先級調(diào)度的基本思想是,把當(dāng)前處于就緒隊列中優(yōu)先級最高 的進(jìn)程投入運行, 而不管各進(jìn)程的下一個 CPU 周期的長短和其他 因素。2、具體步驟 :(1) 分析問題,提出解決問題的算法(2) 編制程序(3) 程序調(diào)試(4) 記錄實驗結(jié)果,以及思考是否能夠改善算法( 1)編輯程序 jcdd.c ,編譯并執(zhí)行。#include #include #define P_NUM 5#define P_TIME 50 enum state ready, execute, block, finish

3、;struct pcbb char name4; int priority; / 數(shù)越大優(yōu)先級越高 int cputime; / 已占用 CPU的時間 int needtime; / 執(zhí)行時間 int count;enum state process; struct pcbb *next;typedef struct pcbb pcb; void display_menu() printf(CHOOSE THE ALGORITHM:n);printf(1 PRIORITYn);printf(2 ROUNDROBINn);printf(3 EXITn);pcb* get_process()pcb

4、 *q;pcb *p; / 頭指針pcb *t; / 尾指針int i = 0;printf(input name and timen);while (i name); scanf(%d,&q-needtime); q-cputime = 0;q-priority = P_TIME - q-needtime; q-process = ready;q-next = NULL; if(i=0) p = q; t = q;else t-next = q; t = q; i+; return p;void free_process(pcb *p) pcb *q; while(p!= NULL)q =

5、p; p = p-next;free(q); void display(pcb *p)staten);printf(name cputime needtime priority while(p)printf(%s,p-name); printf( );printf(%d,p-cputime);printf( ); printf(%d,p-needtime); printf();printf(%d,p-priority);printf();switch(p-process)case ready:printf(readyn);break; case execute:printf(executen)

6、; break; case block:printf(blockn); break; case finish:printf(finishn); break;p = p-next;int process_finish(pcb *q)int b1 = 1;while(b1&q)b1 = b1&q-needtime=0;q = q-next;return b1;void cpuexe(pcb *q)pcb *t = q;int tp = 0;while(q) / 讓t 指向優(yōu)先級最高的進(jìn)程if (q-process!=finish)q-process = ready;if(q-needtime=0)

7、 q-process = finish;if(tppriority&q-process!=finish)tp = q-priority;t = q;q = q-next;if(t-needtime!=0)t-priority -=3;/ 每執(zhí)行一次優(yōu)先級降低三個單位t-needtime -;t-process = execute;t-cputime+;void priority_cal() pcb *p; p = get_process(); int cpu = 0; while(!process_finish(p) / 就緒隊列中還有進(jìn)程 cpu+;printf(cputime:%dn,cp

8、u); cpuexe(p); / 選擇優(yōu)先級最高的進(jìn)程執(zhí)行一個時間單位 display(p); / 每調(diào)度一次就顯示次sleep(2); free_process(p); / 釋放所有進(jìn)程 printf(All processes have finishedn);pcb *get_process_round()pcb *q;pcb *p; / 頭指針 pcb *t; / 尾指針 int i = 0;printf(input name and timen); while (iname); scanf(%d,&q-needtime); q-cputime = 0;q-count = 0; q-pr

9、ocess = ready; q-next = NULL;if(i=0)p = q;t = q;elset-next = q;t = q;i+;return p;void cpu_round(pcb *q) if(q-needtime=1) q-cputime+;else q-cputime +=2;q-needtime -=2; if(q-needtimeneedtime = 0;q-count+; q-process = execute;pcb *get_next(pcb *k,pcb *head)pcb *t;t = k;dot =t-next;while ( t & t-process

10、 = finish);if(t = NULL)t = head;/k 是剛剛被執(zhí)行的節(jié)點 ,如果 t-next=k, 所明就緒隊列除了 k和 t以外都已結(jié)束 ,按照時間片輪轉(zhuǎn)算法 ,該t執(zhí)行 while(t-next!=k & t-process = finish) t = t-next;return t;void set_state(pcb *p)while(p)if(p-needtime = 0) p-process = finish;if(p-process = execute) p-process = ready;p = p-next;void display_round(pcb *p

11、)printf(name cputime needtime count staten);while(p)printf(%s,p-name);printf( ); printf(%d,p-cputime); printf( );printf(%d,p-needtime);printf( ); printf(%d,p-count);printf( );switch(p-process)case ready:printf(readyn);break;case execute:printf(executen); break;case block:printf(blockn); break;case f

12、inish:printf(finishn); break;p = p-next;void round_cal()pcb *p;pcb *r;p = get_process_round();int cpu = 0;r=p;while(!process_finish(p) / 就緒隊列中還有進(jìn)程 if(r-needtime=1)cpu+=1;elsecpu+=2; / 時間片長度是 2 cpu_round(r);r = get_next(r,p); / 獲得下一個需要執(zhí)行的進(jìn)程 printf(cputime:%dn,cpu);display_round(p); / 每調(diào)度一次就顯示次 set_st

13、ate(p);sleep(2);free_process(p); / 釋放所有進(jìn)程main()display_menu();int k;scanf(%d,&k);switch(k)case 1:priority_cal();break;case 2:round_cal();break;case 3: break;default:printf(YOU HAVE NOT CHOOSE ANY ALGORITHM!n);( 2)編輯程序先來先服務(wù)調(diào)度算法fcfs.c,編譯并執(zhí)行。#include #include int SUM=0,K=0; typedef struct linkint time;

14、int averageTime;int priority;struct link *next;linknode; linknode *creat()int n,m;linknode *head,*r,*s;head=r=(linknode *)malloc(sizeof(linknode);printf( 輸入各進(jìn)程的處理時間和優(yōu)先級并以兩個0為結(jié)束標(biāo)志:n);while(scanf(%d %d,&n,&m)&n&m)s=(linknode *)malloc(sizeof(linknode);K+; s-time=n; s-priority=m; s-averageTime=0; r-next=s; r=s;r-next=NULL;return head;linknode *seekAverageTime(linknode *head)int sum=0;linknode *p; p=head-next;while(p)sum=sum+p-time; p-averageTime=sum;p=p-next;SUM+=sum;void print(linknode *head)linknode *p;p=h

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論