




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
專業(yè):計(jì)算機(jī)科學(xué)與技術(shù)年級(jí)/班級(jí):08級(jí)計(jì)科二班—第一學(xué)期課程名稱計(jì)算機(jī)操作系統(tǒng)指導(dǎo)教師本組組員學(xué)號(hào)姓名試驗(yàn)地點(diǎn)試驗(yàn)時(shí)間項(xiàng)目名稱進(jìn)程管理試驗(yàn)類型綜合性一、試驗(yàn)?zāi)康暮鸵?guī)定通過(guò)使用不一樣的算法來(lái)實(shí)現(xiàn)進(jìn)程調(diào)度,運(yùn)用優(yōu)先級(jí)調(diào)度的時(shí)間片輪轉(zhuǎn)算法、先後次序的時(shí)間片輪轉(zhuǎn)調(diào)度算法和先來(lái)先服務(wù)算法來(lái)模擬進(jìn)程調(diào)度的過(guò)程,加深對(duì)進(jìn)程概念和進(jìn)程調(diào)度過(guò)程的理解。在Linux下用C語(yǔ)言編程模擬優(yōu)先級(jí)和時(shí)間片輪轉(zhuǎn)進(jìn)程調(diào)度算法。為了清晰地觀測(cè)每個(gè)進(jìn)程的調(diào)度過(guò)程,程序應(yīng)將每個(gè)時(shí)間片內(nèi)的進(jìn)程狀況顯示出來(lái)。二、試驗(yàn)儀器或設(shè)備配有l(wèi)inux操作系統(tǒng)的微型計(jì)算機(jī)一臺(tái)三、總體設(shè)計(jì)(設(shè)計(jì)原理、設(shè)計(jì)方案及流程等)首先,用交互式的過(guò)程來(lái)動(dòng)態(tài)模擬進(jìn)程的調(diào)度過(guò)程。通過(guò)輸入數(shù)字來(lái)按特定的算法模擬處理機(jī)調(diào)度過(guò)程。輸入1時(shí),按優(yōu)先級(jí)調(diào)度的時(shí)間片輪轉(zhuǎn)算法模擬進(jìn)程調(diào)度;輸入2時(shí),按先後次序的時(shí)間片輪轉(zhuǎn)調(diào)度算法模擬進(jìn)程調(diào)度;輸入3時(shí),按先來(lái)先服務(wù)算法模擬進(jìn)程調(diào)度;輸入4時(shí),退出程序;輸入其他數(shù)字時(shí),會(huì)顯示信息“YOUHAVENOTCHOOSEANYALGORITHM!”并退出程序。另一方面,為進(jìn)程的信息寄存和進(jìn)程的狀態(tài)設(shè)置必要的數(shù)據(jù)構(gòu)造來(lái)寄存。進(jìn)程的信息包括進(jìn)程名、已經(jīng)執(zhí)行的cpu時(shí)間、還需要的cpu時(shí)間、進(jìn)程所處的狀態(tài)和在進(jìn)程隊(duì)列中指向此進(jìn)程的下一種進(jìn)程的指針。這些是上述三個(gè)算法都要用到的。尚有某些信息是某個(gè)算法所特有的,如優(yōu)先級(jí)時(shí)間片輪轉(zhuǎn)算法需要用到進(jìn)程優(yōu)先級(jí),先後次序的時(shí)間片輪轉(zhuǎn)需要用到得到執(zhí)行的時(shí)間片的個(gè)數(shù)(有的是2個(gè)cpu為一種時(shí)間片,有的是1個(gè)cpu為一種時(shí)間片),先來(lái)先服務(wù)的算法需要用到進(jìn)程到來(lái)時(shí)間。尤其闡明,為了便于描述進(jìn)程所處的狀態(tài),將進(jìn)程的狀態(tài)用枚舉類型來(lái)寄存。最終,執(zhí)行合適的算法來(lái)實(shí)現(xiàn)基礎(chǔ)調(diào)度過(guò)程。四、試驗(yàn)環(huán)節(jié)(包括重要環(huán)節(jié)、代碼分析等)試驗(yàn)分4次完畢第1次:完畢程序的主框架設(shè)計(jì),進(jìn)行調(diào)試,驗(yàn)證其對(duì)的性;)第2次:詳細(xì)設(shè)計(jì),進(jìn)行調(diào)試,驗(yàn)證其對(duì)的性;第3次:進(jìn)行整體調(diào)試;第4次:驗(yàn)證其設(shè)計(jì)的對(duì)的性,完畢試驗(yàn)匯報(bào)。代碼分析:#include<stdio.h>#include<stdlib.h>#defineP_NUM5#defineP_TIME50enumstate{ ready,//準(zhǔn)備好 execute,//執(zhí)行 block,//阻塞 finish//結(jié)束};structpcbb{ charname[4]; intcometime;//進(jìn)程到來(lái)時(shí)間 intpriority;//數(shù)越大優(yōu)先級(jí)越高 intcputime;//已占用CPU的時(shí)間,也就是該處理機(jī)開(kāi)始工作的時(shí)間 intneedtime;//執(zhí)行時(shí)間 intcount;//得到的時(shí)間片的次數(shù) enumstateprocess; structpcbb*next;};typedefstructpcbbpcb;voiddisplay_menu(){ printf("CHOOSETHEALGORITHM:\n"); printf("1PRIORITY\n"); printf("2ROUNDROBIN\n"); printf("3FIRSTCOMEFISETSERVER\n"); printf("4EXIT\n");}pcb*get_process(){//輸入各個(gè)進(jìn)程,并組合成鏈隊(duì)列處理,返回隊(duì)頭指針 pcb*q;inti=0; pcb*p;//隊(duì)頭指針 pcb*t;//隊(duì)尾指針 printf("inputnameandtime\n"); while(i<P_NUM){ q=(pcb*)malloc(sizeof(pcb)); scanf("%s",q->name); scanf("%d",&q->needtime); q->cputime=0;//cputime初始化為0 q->priority=P_TIME-q->needtime;//所需要的時(shí)間越少優(yōu)先級(jí)越高 q->process=ready;//process的狀態(tài)初始化為ready q->next=NULL; if(i==0){//隊(duì)列中的第一種 p=q; t=q;//隊(duì)尾指針也要處理 } else{//插入到隊(duì)列尾 t->next=q; t=q; } i++; } returnp;}voidfree_process(pcb*p){ pcb*q; while(p!=NULL){//隊(duì)列不空時(shí),處理隊(duì)頭 q=p; p=p->next; free(q); }}voiddisplay(pcb*p){ printf("namecputimeneedtime priority state\n"); 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){ caseready:printf("ready\n");break; caseexecute:printf("execute\n");break; caseblock:printf("block\n");break; casefinish:printf("finish\n");break; } p=p->next; }}intprocess_finish(pcb*q){//判斷隊(duì)列中有無(wú)進(jìn)程,沒(méi)有返回1,有返回0 intb=1; while(q){ b=b&&q->needtime==0; q=q->next; } returnb;}voidcpuexe(pcb*q){//cputime指已經(jīng)執(zhí)行的時(shí)間,needtime指還需要的時(shí)間 pcb*tr=q; inttp=0; while(q){ if(q->process!=finish){//時(shí)間片到,修改上次執(zhí)行的進(jìn)程的狀態(tài) q->process=ready; if(q->needtime==0){ q->process=finish; } } if(tp<q->priority&&q->process!=finish){//讓tr指向優(yōu)先級(jí)最高的未完畢的進(jìn)程 tp=q->priority; tr=q; } q=q->next; } if(tr->needtime!=0){//執(zhí)行tr所指向的進(jìn)程 tr->priority-=3;//每執(zhí)行一次優(yōu)先級(jí)減少三個(gè)單位 tr->needtime--;//進(jìn)程還需要的時(shí)間減去1 tr->process=execute;//狀態(tài)為執(zhí)行 tr->cputime++;//進(jìn)程的已經(jīng)執(zhí)行的時(shí)間加上1 }}voidpriority_cal(){ pcb*p;intcpu; p=get_process();//輸入各個(gè)進(jìn)程,并組合成鏈隊(duì)列處理,返回隊(duì)頭指針 printf("輸出各個(gè)進(jìn)程的初始化信息:\n"); display(p); cpu=0;//表達(dá)目前執(zhí)行的cpu時(shí)間 while(!process_finish(p)){//就緒隊(duì)列中尚有進(jìn)程 cpu++; printf("cputime:%d\n",cpu); cpuexe(p);//選擇優(yōu)先級(jí)最高的進(jìn)程執(zhí)行一種時(shí)間單位 display(p);//每調(diào)度一次就顯示次 sleep(2); } free_process(p);//釋放所有進(jìn)程 printf("Allprocesseshavefinished\n");}pcb*get_process_round(){ pcb*q; pcb*p;//頭指針 pcb*t;//尾指針 inti=0; printf("inputnameandtime\n"); while(i<P_NUM){ q=(pcb*)malloc(sizeof(pcb)); scanf("%s",q->name); scanf("%d",&q->needtime); q->cputime=0; q->count=0; q->process=ready; q->next=NULL; if(i==0){ p=q; t=q; } else{ t->next=q; t=q; } i++; } returnp;}voidcpu_round(pcb*q){ if(q->needtime==1)q->cputime++;else q->cputime+=2; q->needtime-=2; if(q->needtime<0){ q->needtime=0; } q->count++; q->process=execute;}pcb*get_next(pcb*k,pcb*head){ pcb*t; t=k; do{ t=t->next; }while(t&&t->process==finish); if(t==NULL){ t=head; //k是剛剛被執(zhí)行的節(jié)點(diǎn),假如t->next=k,所明就緒隊(duì)列除了k和t以外都 //已結(jié)束,按照時(shí)間片輪轉(zhuǎn)算法,該t執(zhí)行 while(t->next!=k&&t->process==finish){ t=t->next; } } returnt;}voidset_state(pcb*p){ pcb*q; q=p; while(q){ if(q->needtime==0){ q->process=finish; } if(q->process==execute){ q->process=ready; } q=q->next; }}voiddisplay_round(pcb*p){//顯示各個(gè)進(jìn)程的信息 pcb*q; q=p; printf("namecputimeneedtime count state\n"); while(q){ printf("%s",q->name); printf(" "); printf("%d",q->cputime); printf(" "); printf("%d",q->needtime); printf(" "); printf("%d",q->count); printf(" "); switch(q->process){ caseready:printf("ready\n");break; caseexecute:printf("execute\n");break; caseblock:printf("block\n");break; casefinish:printf("finish\n");break; } q=q->next; }}voidround_cal(){ pcb*p; pcb*r;intcpu; p=get_process_round();//輸入各個(gè)進(jìn)程,并構(gòu)成鏈隊(duì)列,返回隊(duì)頭指針 printf("輸出各個(gè)進(jìn)程的初始化信息:\n"); display_round(p); cpu=0; r=p; while(!process_finish(p)){//就緒隊(duì)列中尚有進(jìn)程 if(r->needtime==1) cpu+=1; else //假如需要的時(shí)間長(zhǎng)度不小于等于2 cpu+=2;//時(shí)間片長(zhǎng)度是2 cpu_round(r); r=get_next(r,p);//獲得下一種需要執(zhí)行的進(jìn)程 printf("cputime:%d\n",cpu); display_round(p);//每調(diào)度一次就顯示次 set_state(p); sleep(2); } free_process(p);//釋放所有進(jìn)程 printf("Allprocesseshavefinished\n");}pcb*get_process_fcfs(){//輸入各個(gè)進(jìn)程,并構(gòu)成鏈隊(duì)列處理,返回隊(duì)頭指針 pcb*q,*r,*f;inti=0; pcb*p;//隊(duì)頭指針 pcb*t;//隊(duì)尾指針 printf("inputname、cometimeandneedtime\n"); while(i<P_NUM) { q=(pcb*)malloc(sizeof(pcb)); scanf("%s",q->name); scanf("%d",&q->cometime); scanf("%d",&q->needtime); q->cputime=0;//cputime初始化為0 q->process=ready;//process的狀態(tài)初始化為ready q->next=NULL; if(i==0){//隊(duì)列中的第一種 printf("隊(duì)列中的第一種\n"); p=q; t=q;//隊(duì)尾指針也要處理 } else{ if(q->cometime>=t->cometime){//插到隊(duì)列尾 t->next=q; t=q; } else {//從隊(duì)頭開(kāi)始掃描 if(p->cometime>q->cometime) { q->next=p; p=q; } else { r=p; f=r; while(r) { if(r->cometime<=q->cometime) { f=r; r=r->next; } else {//插入到r前面 q->next=r; f->next=q; break; } } } } } i++; } returnp;}voiddisplay_fcfs(pcb*p,intcpu){//顯示各個(gè)進(jìn)程的信息 pcb*q; q=p; printf("namecputimeneedtimecometime state\n"); while(q&&cpu>=q->cometime){ printf("%s",q->name); printf(" "); printf("%d",q->cputime); printf(" "); printf("%d",q->needtime); printf(" "); printf("%d",q->cometime); printf(" "); switch(q->process){ caseready:printf("ready\n");break; caseexecute:printf("execute\n");break; caseblock:printf("block\n");break; casefinish:printf("finish\n");break; } q=q->next; }}voidfcfs_cal(){ pcb*p; pcb*r; intcpu; intcpufree; p=get_process_fcfs();//輸入各個(gè)進(jìn)程,并構(gòu)成鏈隊(duì)列,返回隊(duì)頭指針 printf("輸出各個(gè)進(jìn)程的初始化信息:\n"); display_fcfs(p,100); cpu=0; r=p; while(r&&r->process!=finish){//就緒隊(duì)列中尚有進(jìn)程 cpufree=0; if(cpu<=r->cometime){//cpu空閑 cpufree=r->cometime-cpu; cpu=r->cometime+r->needtime; } else{ cpu=cpu+r->needtime; } r->cputime=r->needtime; r->needtime=0; r->process=execute; printf("cputime:%dcpufree:%d\n",cpu,cpufree); display_fcfs(p,cpu);//每調(diào)度一次就顯示次 set_state(p); r=r->next; sleep(2); } free_process(p);//釋放所有進(jìn)程 printf("Allprocesseshavefinished\n");}intmain(){ intk; display_menu(); scanf("%d",&k); switch(k){ case1:priority_cal();break;//按優(yōu)先級(jí)的時(shí)間片輪轉(zhuǎn) case2:round_cal();break;//按先後次序的有條件的時(shí)間片輪轉(zhuǎn) case3:fcfs_cal();break;//按先來(lái)先服務(wù)執(zhí)行算法 case4:printf("退出!\n");break; default:printf("YOUHAVENOTCHOOSEANYALGORITHM!\n"); }}五、成果分析與總結(jié)成果與分析:成果1:CHOOSETHEALGORITHM:1PRIORITY2ROUNDROBIN3FIRSTCOMEFISETSERVER4EXIT1inputnameandtimea3b2c1d5e4輸出各個(gè)進(jìn)程的初始化信息:namecputimeneedtime priority statea 0 3 47 readyb 0 2 48 readyc 0 1 49 readyd 0 5 45 readye 0 4 46 readycputime:1namecputimeneedtime priority statea 0 3 47 readyb 0 2 48 readyc 1 0 46 executed 0 5 45 readye 0 4 46 readycputime:2namecputimeneedtime priority statea 0 3 47 readyb 1 1 45 executec 1 0 46 finishd 0 5 45 readye 0 4 46 readycputime:3namecputimeneedtime priority statea 1 2 44 executeb 1 1 45 readyc 1 0 46 finishd 0 5 45 readye 0 4 46 readycputime:4namecputimeneedtime priority statea 1 2 44 readyb 1 1 45 readyc 1 0 46 finishd 0 5 45 readye 1 3 43 executecputime:5namecputimeneedtime priority statea 1 2 44 readyB2 0 42 executec 1 0 46 finishd 0 5 45 readye 1 3 43 readycputime:6namecputimeneedtime priority statea 1 2 44 readyb 2 0 42 finishc 1 0 46 finishd 1 4 42 executee 1 3 43 readycputime:7namecputimeneedtime priority statea 2 1 41 executeb 2 0 42 finishc 1 0 46 finishd 1 4 42 readye 1 3 43 readycputime:8namecputimeneedtime priority statea 2 1 41 readyb 2 0 42 finishc 1 0 46 finishd 1 4 42 readye 2 2 40 executecputime:9namecputimeneedtime priority statea 2 1 41 readyb 2 0 42 finishc 1 0 46 finishd 2 3 39 executee 2 2 40 readycputime:10namecputimeneedtime priority statea 3 0 38 executeb 2 0 42 finishc 1 0 46 finishd 2 3 39 readye 2 2 40 readycputime:11namecputimeneedtime priority statea 3 0 38 finishb 2 0 42 finishc 1 0 46 finishd 2 3 39 readye 3 1 37 executecputime:12namecputimeneedtime priority statea 3 0 38 finishb 2 0 42 finishc 1 0 46 finishd 3 2 36 executee 3 1 37 readycputime:13namecputimeneedtime priority statea 3 0 38 finishb 2 0 42 finishc 1 0 46 finishd 3 2 36 readye 4 0 34 executecputime:14namecputimeneedtime priority statea 3 0 38 finishb 2 0 42 finishc 1 0 46 finishd 4 1 33 executee 4 0 34 finishcputime:15namecputimeneedtime priority statea 3 0 38 finishb 2 0 42 finishc 1 0 46 finishd 5 0 30 executee 4 0 34 finishAllprocesseshavefinished進(jìn)程調(diào)度的時(shí)間片輪轉(zhuǎn)次序?yàn)椋篶baebdaedaededd,可以看出進(jìn)程c結(jié)束時(shí)間為cpu=1時(shí),進(jìn)程b結(jié)束時(shí)間為cpu=5時(shí),進(jìn)程a結(jié)束時(shí)間為cpu=10時(shí),進(jìn)程e結(jié)束時(shí)間為cpu=13時(shí),進(jìn)程d結(jié)束時(shí)間為cpu=15時(shí)。成果2:CHOOSETHEALGORITHM:1PRIORITY2ROUNDROBIN3FIRSTCOMEFISETSERVER4EXIT2inputnameandtimea3b2c1d5e4輸出各個(gè)進(jìn)程的初始化信息:namecputimeneedtime count statea 0 3 0 readyb 0 2 0 readyc 0 1 0 readyd 0 5 0 readye 0 4 0 readycputime:2namecputimeneedtime count statea 2 1 1 executeb 0 2 0 readyc 0 1 0 readyd 0 5 0 readye 0 4 0 readycputime:4namecputimeneedtime count statea 2 1 1 readyb 2 0 1 executec 0 1 0 readyd 0 5 0 readye 0 4 0 readycputime:5namecputimeneedtime count statea 2 1 1 readyb 2 0 1 finishc 1 0 1 executed 0 5 0 readye 0 4 0 readycputime:7namecputimeneedtime count statea 2 1 1 readyb 2 0 1 finishc 1 0 1 finishd 2 3 1 executee 0 4 0 readycputime:9namecputimeneedtime count statea 2 1 1 readyb 2 0 1 finishc 1 0 1 finishd 2 3 1 readye 2 2 1 executecputime:10namecputimeneedtime count statea 3 0 2 executeb 2 0 1 finishc 1 0 1 finishd 2 3 1 readye 2 2 1 readycputime:12namecputimeneedtime count statea 3 0 2 finishb 2 0 1 finishc 1 0 1 finishd 4 1 2 executee 2 2 1 readycputime:14namecputimeneedtime count statea 3 0 2 finishb 2 0 1 finishc 1 0 1 finishd 4 1 2 readye 4 0 2 executecputime:15namecputimeneedtime count statea 3 0 2 finishb 2 0 1 finishc 1 0 1 finishd 5 0 3 executee 4 0 2 finishAllprocesseshavefinished進(jìn)程調(diào)度的執(zhí)行次序?yàn)椋篴bcdeaded,可以看出進(jìn)程b結(jié)束時(shí)間為cpu=4時(shí),進(jìn)程c結(jié)束時(shí)間為cpu=5時(shí),進(jìn)程a結(jié)束時(shí)間為cpu=10時(shí),進(jìn)程e結(jié)束時(shí)間為cpu=14時(shí),進(jìn)程d結(jié)束時(shí)間為cpu=15時(shí)。成果3:CHOOSETHEALGORITHM:1PRIORITY2ROUNDROBIN3FIRSTCOMEFISETSERVER4EXIT3inputname、cometimeandneedtimea14b73c52d03e151隊(duì)列中的第一種輸出各個(gè)進(jìn)程的初始化信息:namecputimeneedtimecometime stated 0 3 0 readya 0
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 建筑裝飾工程勞務(wù)分包合同包清工
- 考研翻譯寫作基礎(chǔ)
- 四人合伙經(jīng)營(yíng)協(xié)議書
- 衢州社區(qū)標(biāo)識(shí)施工方案
- 電子商務(wù)運(yùn)營(yíng)經(jīng)理簡(jiǎn)介簡(jiǎn)歷
- 預(yù)應(yīng)力空心墩柱施工方案
- 2024-2025學(xué)年下學(xué)期高中英語(yǔ)選修四第四單元A卷
- 安徽高一下數(shù)學(xué)試卷
- 建筑工程供貨合同
- 配電箱出線施工方案
- 油氣勘探行業(yè)技術(shù)趨勢(shì)分析
- 技術(shù)研發(fā)主管崗位招聘筆試題及解答(某大型國(guó)企)
- 2024年全國(guó)職業(yè)院校技能大賽高職組(中藥傳統(tǒng)技能賽項(xiàng))考試題庫(kù)(含答案)
- 浙江省金華市2024年初中畢業(yè)升學(xué)適應(yīng)性檢測(cè) 科學(xué)試題卷
- 2024年六年級(jí)語(yǔ)文下冊(cè)全冊(cè)單元教材分析
- 2024年江西省中考生物·地理合卷試卷真題(含答案逐題解析)
- 延長(zhǎng)石油招聘筆試試題
- 2020-2021年度廣東省職業(yè)院校學(xué)生專業(yè)技能大賽(高職組)CAD機(jī)械設(shè)計(jì)賽項(xiàng)競(jìng)賽規(guī)程
- DB-T 29-22-2024 天津市住宅設(shè)計(jì)標(biāo)準(zhǔn)
- 2024年贛州職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)適應(yīng)性測(cè)試題庫(kù)及答案解析
- DL∕T 5209-2020 高清版 混凝土壩安全監(jiān)測(cè)資料整編規(guī)程
評(píng)論
0/150
提交評(píng)論