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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、江南大學實驗報告課程名稱 操作系統(tǒng) 實驗名稱 作業(yè)調度實驗 實驗日期 2014 12 11 班級 信計1202 姓名 任航 學號 1130112211 儀器編號 實驗報告要求 1實驗目的 2實驗要求 3實驗步驟 4程序清單 5運行情況 5實驗體會 一、 實驗目的:用高級語言編寫和調試一個進程調度程序,以加深對進程的概念及進程調度算法的理解。二 .  實驗要求:(1)編寫并調試一個單道處理系統(tǒng)的作業(yè)調度模擬程序。作業(yè)等待算法:分別采用先來先服務(FCFS),最短作業(yè)優(yōu)先(SJF)、響應比高者優(yōu)先(HRN)的調度算法。對每種調度算法都要求打印每個作業(yè)開始運行時刻、完成時刻、周轉時間、帶權

2、周轉時間,以及這組作業(yè)的平均周轉時間及帶權平均周轉時間,以比較各種算法的優(yōu)缺點。(2) 編寫并調度一個多道程序系統(tǒng)的作業(yè)調度模擬程序。作業(yè)調度算法:采用基于先來先服務的調度算法。可以參考課本中的方法進行設計。對于多道程序系統(tǒng),要假定系統(tǒng)中具有的各種資源及數(shù)量、調度作業(yè)時必須考慮到每個作業(yè)的資源要求。3. 實驗步驟.4. 程序清單:單道批處理先來先服務算法:#include <stdio.h>#include <stdlib.h>#include <conio.h>int n;/全局變量nfloat T1=0,T2=0;/分別用來表示周轉時間和帶權周轉時間之和

3、int times=0;struct jcb /作業(yè)控制塊 char name10; /作業(yè)名 int reachtime; /作業(yè)到達時間 int starttime; /作業(yè)開始時間 int needtime; /作業(yè)需要運行的時間 int finishtime; /作業(yè)完成時間 float cycletime; /作業(yè)周轉時間 float cltime; /作業(yè)帶權周轉時間 char state; /作業(yè)狀態(tài) struct jcb *next; /結構體指針*ready=NULL,*p,*q;typedef struct jcb JCB;void inital()/建立作業(yè)控制塊隊列,先

4、將其排成先來先服務的模式隊列 int i; printf("ntt輸入作業(yè)數(shù):"); scanf("%d",&n); for(i=0; i<n; i+) p=(JCB*)malloc(sizeof(JCB);/聲明結點 printf("tt輸入第%d個作業(yè)名:",i+1); scanf("%s",p->name); p->reachtime=i;/第一個0秒到,第二個1秒到 printf("tt第%d個作業(yè)到達時間默認為:%d",i+1,i); printf("

5、;ntt輸入作業(yè)要運行的時間:"); scanf("%d",&p->needtime); p->state='W'/狀態(tài)初始化為等待 p->next=NULL; if(ready=NULL)/如果是第一個結點的話執(zhí)行 ready=q=p; else/不是第一個結點 q->next=p;/鏈接起來 q=p;/q向后移動一個結點,ready始終指向第一個 void disp(JCB* q)/顯示作業(yè)運行后的周轉時間及帶權周轉時間等 printf("n作業(yè)%s正在運行,其運行情況如下:n",q->

6、name); printf("開始運行時刻:%dn",q->starttime); printf("完成時刻:%dn",q->finishtime); printf("周轉時間:%fn",q->cycletime); printf("帶權周轉時間:%fn",q->cltime); getch();void running(JCB *p) /運行作業(yè) if(p=ready)/先將要運行的作業(yè)從隊列中分離出來 ready=p->next; p->next=NULL; else q=r

7、eady; while(q->next!=p) q=q->next; q->next=p->next; p->starttime=times;/計算作業(yè)運行后的完成時間,周轉時間等等 p->state='R' p->finishtime=p->starttime+p->needtime; p->cycletime=(float)(p->finishtime-p->reachtime); p->cltime=(float)(p->cycletime/p->needtime); T1+=p-&

8、gt;cycletime;/周轉時間之和 T2+=p->cltime;/帶全周轉時間之和 disp(p);/調用disp()函數(shù),顯示作業(yè)運行情況 times+=p->needtime;/累加時間量 p->state='F'/完成狀態(tài) printf("n%s has been finished!npress any key to continue.n",p->name); free(p); /釋放 getch();void final() /最后打印作業(yè)的平均周轉時間,平均帶權周轉時間 float s,t; t=T1/n; s=T2/

9、n; getch(); printf("nn作業(yè)已經全部完成!"); printf("n%d個作業(yè)的平均周轉時間是:%f",n,t); printf("n%d個作業(yè)的平均帶權周轉時間是%f:nnn",n,s);void fcfs() /先來先服務算法 int i,iden; system("cls"); inital(); for(i=0; i<n; i+)/n是作業(yè)的個數(shù) p=ready;/p指向第一個 iden=1; do if(p->state='W'&&p->

10、;reachtime<=times) iden=0; if(iden)p=p->next; while(p!=NULL&&iden) ; if(iden) i-; printf("n沒有滿足要求的進程,需等待"); times+; if(times>100) printf("n時間過長"); getch(); else running(p); /調用running()函數(shù) final(); /調用running()函數(shù)int main() /主函數(shù) printf("ntt先來先服務算法,按任意鍵繼續(xù)."

11、;); getch(); fcfs();單道批處理最短作業(yè)優(yōu)先算法:#include <stdio.h>#include <stdlib.h>#include <conio.h>int n;/全局變量nfloat t1=0,t2=0;/分別用來表示周轉時間和帶權周轉時間之和int times=0;struct jcb /作業(yè)控制塊 char name10; /作業(yè)名 int reachtime; /作業(yè)到達時間 int starttime; /作業(yè)開始時間 int needtime; /作業(yè)需要運行的時間 float super; /作業(yè)的響應比 int f

12、inishtime; /作業(yè)完成時間 float cycletime; /作業(yè)周轉時間 float cptime; /作業(yè)帶權周轉時間 char state; /作業(yè)狀態(tài) struct jcb *next; /結構體指針*head=NULL,*p,*q;typedef struct jcb JCB;void inital()/建立作業(yè)控制塊隊列,先將其排成先來先服務的模式隊列 int i; printf("ntt輸入作業(yè)數(shù):"); scanf("%d",&n); for(i=0; i<n; i+) p=(JCB*)malloc(sizeof

13、(JCB);/聲明結點 printf("tt輸入第%d個作業(yè)名:",i+1); scanf("%s",p->name); p->reachtime=i;/默認第一個0秒到,第二個1秒到。 printf("tt第%d個作業(yè)到達時間默認為:%d",i+1,i); printf("ntt輸入作業(yè)要運行的時間:"); scanf("%d",&p->needtime); p->state='W'/狀態(tài)初始化為等待 p->next=NULL; if(he

14、ad=NULL)/如果是第一個結點的話執(zhí)行 head=q=p; else/不是第一個結點 q->next=p;/鏈接起來 q=p;/q向后移動一個結點,ready始終指向第一個 void display(JCB* q)/顯示作業(yè)運行后的周轉時間及帶權周轉時間等 printf("n作業(yè)%s正在運行,其運行情況如下:n",q->name); printf("開始運行時刻:%dn",q->starttime); printf("完成時刻:%dn",q->finishtime); printf("周轉時間:%

15、fn",q->cycletime); printf("帶權周轉時間:%fn",q->cptime); getch();void run(JCB *min)/min為正在運行作業(yè) if(min=head)/先將要運行的作業(yè)從隊列中分離出來,此時的min是min head=min->next; min->next=NULL; else q=head;/形成循環(huán)對列 while(q->next!=min) q=q->next; q->next=min->next;/分離出最小作業(yè) min->starttime=tim

16、es;/計算作業(yè)運行后的完成時間,周轉時間等等 min->state='R' min->finishtime=min->starttime+min->needtime; min->cycletime=(float)(min->finishtime-min->reachtime); min->cptime=(float)(min->cycletime/min->needtime); t1+=min->cycletime;/周轉時間之和 t2+=min->cptime;/帶全周轉時間之和 display(min

17、);/調用disp()函數(shù),顯示作業(yè)運行情況 times+=min->needtime;/累加時間量 min->state='F'/完成狀態(tài) printf("n%s has been finished!npress any key to continue.n",min->name); free(min); /釋放 getch();void super() /計算隊列中作業(yè)的高響應比 JCB *padv; padv=head; do if(padv->state='W'&&padv->reachti

18、me<=times) padv->super=(float)(times-padv->reachtime+padv->needtime)/padv->needtime; padv=padv->next; while(padv!=NULL);void final() /最后打印作業(yè)的平均周轉時間,平均帶權周轉時間 float s,t; t=t1/n; s=t2/n; getch(); printf("nn作業(yè)已經全部完成!"); printf("n%d個作業(yè)的平均周轉時間是:%f",n,t); printf("

19、n%d個作業(yè)的平均帶權周轉時間是%f:nnn",n,s);void sjf()/ 最短作業(yè)優(yōu)先算法 JCB *min;/min表示最短作業(yè) int i,iden; system("cls"); inital(); for(i=0; i<n; i+)/n是作業(yè)個數(shù) p=min=head; iden=1; do if(p->state='W'&&p->reachtime<=times)/第一個作業(yè)times=0 if(iden)/第一個作業(yè)iden=1 min=p; iden=0; /iden=0 else if

20、(p->needtime<min->needtime)/判斷作業(yè)的長短,min min=p; p=p->next; while(p!=NULL) ;/這個循環(huán)遍歷作業(yè)隊列,目的是找出最短的作業(yè),最后p=null,min指向最短作業(yè) if(iden) i-; /printf("ntime=%d:tno JCB submib.wait.",time); times+; if(times>100) printf("nruntime is too long.error"); getch(); else run(min); /調用ru

21、n()函數(shù) final(); /調用final()函數(shù)int main() /主函數(shù) printf("ntt最短作業(yè)優(yōu)先算法,按任意鍵繼續(xù)."); getch(); sjf();運行結果:單道批處理響應比高者優(yōu)先算法:#include <stdio.h>#include <stdlib.h>#include <conio.h>int n;/全局變量nfloat T1=0,T2=0;/分別用來表示周轉時間和帶權周轉時間之和int times=0;struct jcb /作業(yè)控制塊 char name10; /作業(yè)名 int reachtim

22、e; /作業(yè)到達時間 int starttime; /作業(yè)開始時間 int needtime; /作業(yè)需要運行的時間 float super; /作業(yè)的響應比 int finishtime; /作業(yè)完成時間 float cycletime; /作業(yè)周轉時間 float cltime; /作業(yè)帶權周轉時間 char state; /作業(yè)狀態(tài) struct jcb *next; /結構體指針*ready=NULL,*p,*q;typedef struct jcb JCB;void inital()/建立作業(yè)控制塊隊列,先將其排成先來先服務的模式隊列 int i; printf("ntt輸

23、入作業(yè)數(shù):"); scanf("%d",&n); for(i=0; i<n; i+) p=(JCB*)malloc(sizeof(JCB);/聲明結點 printf("tt輸入作業(yè)名:"); scanf("%s",p->name); p->reachtime=i;/第一個0秒到,第二個1秒到 printf("tt第%d個作業(yè)到達時間默認為:%d",i+1,i); printf("ntt輸入作業(yè)要運行的時間:"); scanf("%d",&a

24、mp;p->needtime); p->state='W'/狀態(tài)初始化為等待 p->next=NULL; if(ready=NULL)/如果是第一個結點的話執(zhí)行 ready=q=p; else/不是第一個結點 q->next=p;/鏈接起來 q=p;/q向后移動一個結點,ready始終指向第一個 void display(JCB* q)/顯示作業(yè)運行后的周轉時間及帶權周轉時間等 printf("n作業(yè)%s正在運行,其運行情況如下:n",q->name); printf("開始運行時刻:%dn",q->s

25、tarttime); printf("完成時刻:%dn",q->finishtime); printf("周轉時間:%fn",q->cycletime); printf("帶權周轉時間:%fn",q->cltime); printf("響應比:%fn",q->super); getch();void run(JCB *p) /運行作業(yè) if(p=ready)/先將要運行的作業(yè)從隊列中分離出來 ready=p->next; p->next=NULL; else q=ready; w

26、hile(q->next!=p) q=q->next; q->next=p->next; p->starttime=times;/計算作業(yè)運行后的完成時間,周轉時間等等 p->state='R' p->finishtime=p->starttime+p->needtime; p->cycletime=(float)(p->finishtime-p->reachtime); p->cltime=(float)(p->cycletime/p->needtime); T1+=p->cycl

27、etime;/周轉時間之和 T2+=p->cltime;/帶全周轉時間之和 display(p);/調用disp()函數(shù),顯示作業(yè)運行情況 times+=p->needtime;/累加時間量 p->state='F'/完成狀態(tài) printf("n%s has been finished!npress any key to continue.n",p->name); free(p); /釋放 getch();void super() /計算隊列中作業(yè)的高響應比 JCB *padv; padv=ready; do if(padv->

28、state='W'&&padv->reachtime<=times) padv->super=(float)(times-padv->reachtime+padv->needtime)/padv->needtime; padv=padv->next; while(padv!=NULL);void final()/最后打印作業(yè)的平均周轉時間,平均帶權周轉時間 float s,t; t=T1/n; s=T2/n; getch(); printf("nn作業(yè)已經全部完成!"); printf("n

29、%d個作業(yè)的平均周轉時間是:%f",n,t); printf("n%d個作業(yè)的平均帶權周轉時間是%f:nnn",n,s);void hrn()/高響應比算法 JCB *min; int i,iden; system("cls"); inital(); for(i=0; i<n; i+) p=min=ready; iden=1; super(); do if(p->state='W'&&p->reachtime<=times) if(iden) min=p; iden=0; else if(

30、p->super>min->super) min=p; p=p->next; while(p!=NULL); if(iden) i-; times+; if(times>1000) printf("nruntime is too long.error."); getch(); else run(min); /調用run()函數(shù) final(); /調用run()函數(shù)int main() /主函數(shù) printf("tt響應比高者優(yōu)先算法,按任意鍵繼續(xù)."); getch(); hrn(); getch();(2)、編寫并調度一

31、個多道程序系統(tǒng)的作業(yè)調度模擬程序。 作業(yè)調度算法:采用基于先來先服務的調度算法??梢詤⒖颊n本中的方法進行設計。 對于多道程序系統(tǒng),要假定系統(tǒng)中具有的各種資源及數(shù)量、調度作業(yè)時必須考慮到每個作業(yè)的資源要求。多道程序(基于先來先算服務)#include <stdio.h>#include <stdlib.h> #define getjch(type) (type*)malloc(sizeof(type) #define N 10struct jcb /* 定義作業(yè)控制塊PCB */ char name10; float needtime; /*運行時間*/float arr

32、ivetime;/*提交時刻*/float storageN;/*系統(tǒng)資源*/struct jcb* link; *ready=NULL,*pb=NULL,*p; typedef struct jcb JCB; float Tc,Ti,Wi,T=0;/*完成時刻,周轉時間,帶權周轉時間,時間量*/float TiSum=0,WiSum=0;/*平均周轉時間,帶權a平均周轉時間*/float sourceN;int n;void input(); /*輸入作業(yè)信息*/int space(); /* 返回就緒隊列中作業(yè)的數(shù)目*/void fcfs(); /*先來先服務算法*/void disp(J

33、CB *pr); /* 顯示相應的作業(yè)*/void running(); /*運行作業(yè)組*/void destroy(); /* 撤銷作業(yè)*/void input() /* 建立作業(yè)控制塊函數(shù)*/ int i,k,num; printf("請輸入所擁有的資源種類:");scanf("%d",&n);printf("輸入系統(tǒng)所擁有資源數(shù):n");for(i=0;i<n;i+)printf("資源%d:",i);scanf("%f",&sourcei); printf(&quo

34、t;n 輸入作業(yè)數(shù)量:");scanf("%d",&num); for(i=0;i<num;i+) printf("n 作業(yè)號%d:n",i);p=getjch(JCB); printf("輸入作業(yè)名:");scanf("%s",p->name); printf("輸入提交時間:");scanf("%f",&p->arrivetime);printf("輸入運行時間:");scanf("%f"

35、,&p->needtime); printf("輸入所需資源數(shù):n");for(k=0;k<n;k+)printf("資源%d:",i);scanf("%f",&p->storagek); printf("n"); p->link=NULL; fcfs(); int space() int l=0; JCB* pr=ready; while(pr!=NULL) l+; pr=pr->link; return(l); void disp(JCB * pr) /*建立作業(yè)顯

36、示函數(shù),用于顯示當前作業(yè)*/ int i;printf("n%6st%6st%6st","作業(yè)名","運行時間","提交時刻");for(i=0;i<n;i+)printf("資源%dt",i);printf("n%6st%6.2ftt%6.2ft",pr->name,pr->needtime,pr->arrivetime);for(i=0;i<n;i+)printf("t%6.2f",pr->storagei);pri

37、ntf("n"); void destroy() /*建立作業(yè)撤消函數(shù)(作業(yè)運行結束,撤消作業(yè))*/ free(p); void check()JCB *first,*fir,*p;int flag=0,i,test=0;first=pb;while(first&&(T>=first->arrivetime)&&(flag=0)for(i=0;i<n;i+)if(sourcei>=first->storagei)sourcei=sourcei-first->storagei;elsetest=1;if(te

38、st=0)p=first;first=first->link;p->link=NULL;if(ready=NULL)ready=p;elsefir=ready;while(fir->link!=NULL)fir=fir->link;fir->link=p;elseflag=1;pb=first;void fcfs()JCB *first,*second;int ins=0;if(pb=NULL)|(p->arrivetime<pb->arrivetime)p->link=pb;pb=p;elsefirst=pb;second=first->link;while(second!=NULL)if(p->arrivetime<second->arrivetime)p->link=second;second=NULL;first->link=p;ins=1;else first=first->link; second=second->link;if(ins=0)first->link=p;void running()JCB *pr;int i;printf("正在運行的作業(yè)是:%

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論