




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
實(shí)驗(yàn)二作業(yè)調(diào)度實(shí)驗(yàn)一.目的要求:
用高級(jí)語言編寫和調(diào)試一個(gè)或多個(gè)作業(yè)調(diào)度的模擬程序,以加深對(duì)作業(yè)調(diào)度算法的理解。二.實(shí)習(xí)題:1、編寫并調(diào)試一個(gè)單道處理系統(tǒng)的作業(yè)等待模擬程序。作業(yè)等待算法:分別采用先來先服務(wù)(FCFS),最短作業(yè)優(yōu)先(SJF)、響應(yīng)比高者優(yōu)先(HRN)的調(diào)度算法。對(duì)每種調(diào)度算法都要求打印每個(gè)作業(yè)開始運(yùn)行時(shí)刻、完成時(shí)刻、周轉(zhuǎn)時(shí)間、帶權(quán)周轉(zhuǎn)時(shí)間,以及這組作業(yè)的平均周轉(zhuǎn)時(shí)間及帶權(quán)平均周轉(zhuǎn)時(shí)間,以比較各種算法的優(yōu)缺點(diǎn)。
先來先服務(wù)算法:按照作業(yè)提交給系統(tǒng)的先后順序來挑選作業(yè),先提交的先被挑選。最短作業(yè)優(yōu)先算法:是以進(jìn)入系統(tǒng)的作業(yè)所提出的“執(zhí)行時(shí)間”為標(biāo)準(zhǔn),總是優(yōu)先選取執(zhí)行時(shí)間最短的作業(yè)。響應(yīng)比高者優(yōu)先算法:是在每次調(diào)度前都要計(jì)算所有被選作業(yè)(在后備隊(duì)列中)的響應(yīng)比,然后選擇響應(yīng)比最高的作業(yè)執(zhí)行。調(diào)度算法的流程圖如下圖所示。(4)執(zhí)行結(jié)果源程序:#include<stdio.h>#include<stdlib.h>#include<conio.h>#definegetpch(type)(type*)malloc(sizeof(type))//#defineNULL0intn;floatT1=0,T2=0;inttimes=0;structjcb//作業(yè)控制塊{charname[10];//作業(yè)名intreachtime;//作業(yè)到達(dá)時(shí)間intstarttime;//作業(yè)開始時(shí)間intneedtime;//作業(yè)需要運(yùn)行的時(shí)間floatsuper;//作業(yè)的響應(yīng)比intfinishtime;//作業(yè)完成時(shí)間floatcycletime;//作業(yè)周轉(zhuǎn)時(shí)間floatcltime;//作業(yè)帶權(quán)周轉(zhuǎn)時(shí)間charstate;//作業(yè)狀態(tài)structjcb*next;//結(jié)構(gòu)體指針}*ready=NULL,*p,*q;typedefstructjcbJCB;voidinital(){inti;printf("\n輸入作業(yè)數(shù):");scanf("%d",&n);for(i=0;i<n;i++){p=getpch(JCB);printf("\n輸入作業(yè)名:");scanf("%s",p->name);getch();p->reachtime=i;printf("作業(yè)默認(rèn)到達(dá)時(shí)間:%d",i);printf("\n輸入作業(yè)要運(yùn)行的時(shí)間:");scanf("%d",&p->needtime);p->state='W';p->next=NULL;if(ready==NULL)ready=q=p;else{q->next=p;q=p;}}}voiddisp(JCB*q,intm){if(m==3){printf("\n作業(yè)%s正在運(yùn)行,估計(jì)其運(yùn)行情況:\n",q->name);printf("開始運(yùn)行時(shí)刻:%d\n",q->starttime);printf("完成時(shí)刻:%d\n",q->finishtime);printf("周轉(zhuǎn)時(shí)間:%f\n",q->cycletime);printf("帶權(quán)周轉(zhuǎn)時(shí)間:%f\n",q->cltime);printf("相應(yīng)比:%f\n",q->super);getch();}else{printf("\n作業(yè)%s正在運(yùn)行,估計(jì)其運(yùn)行情況:\n",q->name);printf("開始運(yùn)行時(shí)刻:%d\n",q->starttime);printf("完成時(shí)刻:%d\n",q->finishtime);printf("周轉(zhuǎn)時(shí)間:%f\n",q->cycletime);printf("帶權(quán)周轉(zhuǎn)時(shí)間:%f\n",q->cltime);getch();}}voidrunning(JCB*p,intm){if(p==ready){ready=p->next;p->next=NULL;}else{q=ready;while(q->next!=p)q=q->next;q->next=p->next;}p->starttime=times;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->cycletime;T2+=p->cltime;disp(p,m);times+=p->needtime;p->state='F';printf("\n%shasbeenfinished!\npressanykeytocontinue...\n",p->name);free(p);getch();}voidsuper(){JCB*padv;padv=ready;do{if(padv->state=='W'&&padv->reachtime<=times)padv->super=(float)(times-padv->reachtime+padv->needtime)/padv->needtime;padv=padv->next;}while(padv!=NULL);}voidfinal(){floats,t;t=T1/n;s=T2/n;getch();printf("\n\n作業(yè)已經(jīng)全部完成!");printf("\n%d個(gè)作業(yè)的平均周轉(zhuǎn)時(shí)間是:%f",n,t);printf("\n%d個(gè)作業(yè)的平均帶權(quán)周轉(zhuǎn)時(shí)間是%f:\n\n\n",n,s);}voidhrn(intm){JCB*min;inti,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;}if(p->super>min->super)min=p;p=p->next;}while(p!=NULL);if(iden){i--;times++;if(times>1000){printf("\nruntimeistoolong...error...");getch();}}else{running(min,m);//調(diào)用running()函數(shù)}}//forfinal();//調(diào)用running()函數(shù)}voidsjf(intm)//最短作業(yè)優(yōu)先算法{JCB*min;inti,iden;system("cls");inital();for(i=0;i<n;i++){p=min=ready;iden=1;do{if(p->state=='W'&&p->reachtime<=times)if(iden){min=p;iden=0;}if(p->needtime<min->needtime)min=p;p=p->next;}while(p!=NULL);if(iden){i--;//printf("\ntime=%d:\tnoJCBsubmib...wait...",time);times++;if(times>100){printf("\nruntimeistoolong...error");getch();}}else{running(min,m);}}//forfinal();}voidfcfs(intm){inti,iden;system("cls");inital();for(i=0;i<n;i++){p=ready;iden=1;do{if(p->state=='W'&&p->reachtime<=times)iden=0;if(iden)p=p->next;}while(p!=NULL&&iden);if(iden){i--;printf("\n沒有滿足要求的進(jìn)程,需等待");times++;if(times>100){printf("\n時(shí)間過長");getch();}}else{running(p,m);}}final();}voidmune(){intm;system("cls");printf("\n\n\t\t*********************************************\t\t\n");printf("\t\t\t\t作業(yè)調(diào)度演示\n");printf("\t\t*********************************************\t\t\n");printf("\n\n\n\t\t\t1.先來先服務(wù)算法.");printf("\n\t\t\t2.最短作業(yè)優(yōu)先算法.");printf("\n\t\t\t3.響應(yīng)比高者優(yōu)先算法");printf("\n\t\t\t0.退出程序.");printf("\n\n\t\t\t\t選擇所要操作:");scanf("%d",&m);switch(m){case1:fcfs(m);getch();system("cls");mune();break;case2:sjf(m);getch();system("cls");mune();break;case3:hrn(m);getch();system("cls");mune();break;case0:system("cls");break;default:printf("選擇錯(cuò)誤,重新選擇.");getch();system("cls");mune();}}intmain()//主函數(shù){mune();return0;}2、編寫并調(diào)度一個(gè)多道程序系統(tǒng)的作業(yè)調(diào)度模擬程序。作業(yè)調(diào)度算法:采用基于先來先服務(wù)的調(diào)度算法。可以參考課本中的方法進(jìn)行設(shè)計(jì)。對(duì)于多道程序系統(tǒng),要假定系統(tǒng)中具有的各種資源及數(shù)量、調(diào)度作業(yè)時(shí)必須考慮到每個(gè)作業(yè)的資源要求。2.1實(shí)驗(yàn)原理及設(shè)計(jì)方案采用多道程序設(shè)計(jì)方法的操作系統(tǒng),在系統(tǒng)中要經(jīng)常保留多個(gè)運(yùn)行的作業(yè),以提高系統(tǒng)效率。作業(yè)調(diào)度從系統(tǒng)已接納的暫存在輸入井中的一批作業(yè)中挑選出若干個(gè)可運(yùn)行的作業(yè),并為這些被選中的作業(yè)分配所需的系統(tǒng)資源。對(duì)被選中運(yùn)行的作業(yè)必須按照它們各自的作業(yè)說明書規(guī)定的步驟進(jìn)行控制。采用先來先服務(wù)算法算法模擬設(shè)計(jì)作業(yè)調(diào)度程序。(1)、作業(yè)調(diào)度程序負(fù)責(zé)從輸入井選擇若干個(gè)作業(yè)進(jìn)入主存,為它們分配必要的資源,當(dāng)它們能夠被進(jìn)程調(diào)度選中時(shí),就可占用處理器運(yùn)行。作業(yè)調(diào)度選擇一個(gè)作業(yè)的必要條件是系統(tǒng)中現(xiàn)有的尚未分配的資源可滿足該作業(yè)的資源要求。但有時(shí)系統(tǒng)中現(xiàn)有的尚未分配的資源既可滿足某個(gè)作業(yè)的要求也可滿足其它一些作業(yè)的要求,那么,作業(yè)調(diào)度必須按一定的算法在這些作業(yè)中作出選擇。先來先服務(wù)算法是按照作業(yè)進(jìn)入輸入井的先后次序來挑選作業(yè),先進(jìn)入輸入井的作業(yè)優(yōu)先被挑選,當(dāng)系統(tǒng)中現(xiàn)有的尚未分配的資源不能滿足先進(jìn)入輸入井的作業(yè)時(shí),那么順序挑選后面的作業(yè)。(2)假定某系統(tǒng)可供用戶使用的主存空間共100k,并有5臺(tái)磁帶機(jī)。2.2執(zhí)行結(jié)果:2.3代碼源代碼#include<stdio.h>#include<stdlib.h>#include<string.h>#include<conio.h>#definegetjcb()(JCB*)malloc(sizeof(JCB))typedefstruct{ intmemory; inttape;}RESOURCE;typedefstructJCB{//作業(yè)控制塊 charusername[20];//用戶名 charjobname[10];//作業(yè)名 charstate;//作業(yè)狀態(tài) charatime[5];//到達(dá)時(shí)間 floatrtime;//運(yùn)行時(shí)間 RESOURCEresource;//資源數(shù)量 structJCB*link;}JCB;RESOURCEsource={100,5};JCB*pjcb=getjcb();charnowtime[5];FILE*ignore(FILE*fp){ if(feof(fp))returnfp; charch=fgetc(fp); while(!feof(fp)&&(ch==''||ch==' ')){ ch=fgetc(fp); } //if(!feof(fp))returnfp; fseek(fp,-1,SEEK_CUR); returnfp; }FILE*findchar(FILE*fp,charc){ if(feof(fp))returnfp; charch=fgetc(fp); while(!feof(fp)&&(ch!=c)){ ch=fgetc(fp); } fseek(fp,-1,SEEK_CUR); returnfp;}voiddestory()//{ JCB*p=pjcb->link; while(pjcb){ free(pjcb); pjcb=p; if(p) p=p->link; }}floatstof(char*time)//{ floath=0,m=0; inti=0; while(time[i]!=':'){ h=h*10+time[i]-'0'; i++; } i++; while(time[i]!='\0'){ m=m*10+time[i]-'0'; i++; } return(h+m/60);}char*ftos(doubleftime)//{ inth,m; h=int(ftime); m=int((ftime-h)*60); sprintf(nowtime,"%c:%c%c",h+'0',int(m/10)+'0',int(m%10)+'0'); returnnowtime;}floattimesub(char*time1,char*time2){ returnstof(time1)-stof(time2);}voidprint()//打印輸出{ JCB*p=pjcb->link; printf("現(xiàn)在時(shí)間是%s\n",nowtime); printf("現(xiàn)在資源的數(shù)量%d\t\t%d\n",source.memory,source.tape); printf("\t\t\t\t\t\t\t資源要求\n"); printf("用戶名\t作業(yè)名\t狀態(tài)\t到達(dá)時(shí)間\t運(yùn)行時(shí)間(小時(shí))\t主存(K)\t磁帶機(jī)\n"); while(p){ printf("%s\t%s\t%c\t%s\t\t\t%.2f\t%d\t%d\n",p->username,p->jobname,p->state,p->atime,p->rtime,p->resource.memory,p->resource.tape); p=p->link; }}voidsendsource()//為作業(yè)分配資源{ JCB*p; p=pjcb->link; while(p){//為到達(dá)的作業(yè)調(diào)度 if(p->state=='W'&&source.memory-p->resource.memory>=0&&source.tape-p->resource.tape>=0){ p->state='R'; source.memory-=p->resource.memory; source.tape-=p->resource.tape; printf("\n%s\t%s被調(diào)入內(nèi)存\n",p->username,p->jobname); } p=p->link; } }voidinit(){ FILE*fp; JCB*p=NULL,*q=pjcb; if((fp=fopen("jobs.txt","r"))==NULL){ printf("Cannotopenthefile!"); exit(1); } rewind(fp); fp=findchar(fp,'A'); while(!feof(fp)){ p=getjcb(); fscanf(fp,"%s",p->username); fp=ignore(fp); fscanf(fp,"%s",p->jobname); fp=ignore(fp); fscanf(fp,"%c",&p->state); fp=ignore(fp); fscanf(fp,"%s",p->atime); fp=ignore(fp); p->rtime=0;//不初始化則會(huì)發(fā)生錯(cuò)誤,????? fscanf(fp,"%f",&(p->rtime)); fp=ignore(fp); fscanf(fp,"%d",&p->resource.memory); fp=ignore(fp); fscanf(fp,"%d",&p->resource.tape); fp=ignore(fp); q->link=p; q=p; } p->link=NULL; sendsource(); fclose(fp);}intcheckend() { JCB*p=pjcb->link; while(p){ if(p->state!='F'){ return0; } p=p->link; } return1;}voidrun()//運(yùn)行作業(yè){ if(checkend()){ printf("所有作業(yè)都已經(jīng)完成...\n"); exit(0); } JCB*p=pjcb->link; doubletime; while(p){//作業(yè)運(yùn)行完畢釋放資源 time=stof(nowtime)-stof(p->atime); if(p->state=='R'&&time>=p->rtime){ p->state='F'; source.memory+=p->resource.memory; source.tape+=p->resource.tape; printf("\n%s\t%s已經(jīng)執(zhí)行結(jié)束\n",p->username,p->jobname); break; } p=p->link; } p=pjcb->link; while(p){//計(jì)算到達(dá)的作業(yè) if(strcmp(nowtime,p->atime)==0&&p->state=='N'){ p->state='W'; printf("\n%s\t%s作業(yè)已到達(dá)\n",p->username,p->jobname); } p=p->link; } sendsource();//為作業(yè)分配資源 print(); }intmain(){ charch; doubletime=9.00; doublestep=float(5)/60+0.00001; ftos(9.0); init(); do{ run(); puts("**************************************************\n"); puts("是否繼續(xù)運(yùn)行,每次運(yùn)行5分鐘Y/N。。。。"); puts("**************************************************\n"); ch=getche(); time+=step; ftos(time); }while(toupper(ch)=='Y'); destory(); return0;}3、編寫并調(diào)試一個(gè)多道程序系統(tǒng)的作業(yè)調(diào)度模擬程序。作業(yè)調(diào)度算法:采用基于優(yōu)先級(jí)的作業(yè)調(diào)度。二.實(shí)驗(yàn)代碼#include<stdio.h>#include<stdlib.h>#definegetjch(type)(type*)malloc(sizeof(type))#defineN10structjcb{/*定義作業(yè)控制塊PCB*/ charname[10]; floatneedtime;/*運(yùn)行時(shí)間*/ floatarrivetime;/*提交時(shí)刻*/ floatstorage[N];/*系統(tǒng)資源*/ structjcb*link;}*ready=NULL,*pb=NULL,*p;typedefstructjcbJCB;floatTc,Ti,Wi,T=0;/*完成時(shí)刻,周轉(zhuǎn)時(shí)間,帶權(quán)周轉(zhuǎn)時(shí)間,時(shí)間量*/floatTiSum=0,WiSum=0;/*平均周轉(zhuǎn)時(shí)間,帶權(quán)a平均周轉(zhuǎn)時(shí)間*/floatsource[N];intn;voidinput();/*輸入作業(yè)信息*/intspace();/*返回就緒隊(duì)列中作業(yè)的數(shù)目*/voidfcfs();/*先來先服務(wù)算法*/voiddisp(JCB*pr);/*顯示相應(yīng)的作業(yè)*/voidrunning();/*運(yùn)行作業(yè)組*/voiddestroy();/*撤銷作業(yè)*/voidinput()/*建立作業(yè)控制塊函數(shù)*/{ inti,k,num; printf("請輸入所擁有的資源種類:"); scanf("%d",&n); printf("輸入系統(tǒng)所擁有資源數(shù):\n"); for(i=0;i<n;i++) { printf("資源[%d]:",i); scanf("%f",&source[i]); } printf("\n輸入作業(yè)數(shù)量:"); scanf("%d",&num); for(i=0;i<num;i++) { printf("\n作業(yè)號(hào)[%d]:\n",i); p=getjch(JCB); printf("輸入作業(yè)名:"); scanf("%s",p->name); printf("輸入提交時(shí)間:"); scanf("%f",&p->arrivetime); printf("輸入運(yùn)行時(shí)間:"); scanf("%f",&p->needtime); printf("輸入所需資源數(shù):\n"); for(k=0;k<n;k++) { printf("資源[%d]:",i); scanf("%f",&p->storage[k]); } printf("\n"); p->link=NULL; fcfs(); }}intspace(){ intl=0; JCB*pr=ready; while(pr!=NULL) { l++; pr=pr->link; } return(l);}voiddisp(JCB*pr)/*建立作業(yè)顯示函數(shù),用于顯示當(dāng)前作業(yè)*/{ inti; printf("\n%6s\t%6s\t%6s\t","作業(yè)名","運(yùn)行時(shí)間","提交時(shí)刻"); for(i=0;i<n;i++) printf("資源[%d]\t",i); printf("\n%6s\t%6.2f\t\t%6.2f\t",pr->name,pr->needtime,pr->arrivetime); for(i=0;i<n;i++) printf("\t%6.2f",pr->storage[i]); printf("\n"); }voiddestroy()/*建立作業(yè)撤消函數(shù)(作業(yè)運(yùn)行結(jié)束,撤消作業(yè))*/{ free(p);}voidcheck(){ JCB*first,*fir,*p; intflag=0,i,test=0; first=pb; while(first&&(T>=first->arrivetime)&&(flag==0)) { for(i=0;i<n;i++) { if(source[i]>=first->storage[i]) source[i]=source[i]-first->storage[i]; else test=1; } if(test==0) { p=first; first=first->link; p->link=NULL; if(ready==NULL) ready=p; else { fir=ready; while(fir->link!=NULL) { fir=fir->link; } fir->link=p; } } else flag=1; } pb=first;}voidfcfs(){ JCB*first,*second; intins=0; if((pb==NULL)||(p->arrivetime<pb->arrivetime)) { p->link=pb; pb=p; } else { fir
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 幼兒園戶外活動(dòng)的教研探討計(jì)劃
- 第19課 探索宇宙(教學(xué)設(shè)計(jì))-2023-2024學(xué)年六年級(jí)科學(xué)下冊同步備課(青島版)
- 加強(qiáng)倉庫流程管理的實(shí)施方案計(jì)劃
- 《貴州創(chuàng)泰礦業(yè)有限公司修文縣龍場鎮(zhèn)高倉老二洞鋁鐵礦山礦產(chǎn)資源綠色開發(fā)利用方案(三合一)》評(píng)審意見
- (高清版)DB3715∕T 7-2022 黑水虻飼養(yǎng)技術(shù)規(guī)程
- 統(tǒng)編版小學(xué)語文二年級(jí)下冊第3課《開滿鮮花的小路》精美課件
- Unit 7 Days and Months Lesson 5 colorful seasons 教學(xué)設(shè)計(jì) 2024-2025學(xué)年冀教版(2024)七年級(jí)英語上冊
- 固態(tài)電池知識(shí)培訓(xùn)課件
- 能源行業(yè):石油工程師簡歷
- 初中體育與健康 初二上 水平四 八年級(jí)(第一學(xué)期)籃球大單元教學(xué)設(shè)計(jì)+體前變向換手運(yùn)球突破投籃教學(xué)設(shè)計(jì)
- 2024年蘇州衛(wèi)生職業(yè)技術(shù)學(xué)院單招職業(yè)傾向性測試題庫附答案
- 六年級(jí)語文下冊第五單元教材解析
- 湖南省2021年普通高等學(xué)校對(duì)口招生考試英語
- 《通信電源培訓(xùn)》課件
- 《CT檢查技術(shù)》課件-CT圖像后處理
- 水產(chǎn)生物遺傳育種學(xué)課件
- 婦產(chǎn)科醫(yī)患溝通護(hù)理課件
- 第3課《萬物共存》課件
- 精致的八寶飯
- GB/T 43602-2023物理氣相沉積多層硬質(zhì)涂層的成分、結(jié)構(gòu)及性能評(píng)價(jià)
- 醫(yī)院預(yù)算執(zhí)行情況分析報(bào)告
評(píng)論
0/150
提交評(píng)論