使用動(dòng)態(tài)優(yōu)先權(quán)的進(jìn)程調(diào)度算法的模擬_第1頁
使用動(dòng)態(tài)優(yōu)先權(quán)的進(jìn)程調(diào)度算法的模擬_第2頁
使用動(dòng)態(tài)優(yōu)先權(quán)的進(jìn)程調(diào)度算法的模擬_第3頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、計(jì)算機(jī)操作系統(tǒng)實(shí)驗(yàn)報(bào)告學(xué)號(hào):姓名:提交日期:2017.10.19成績:計(jì)算機(jī)與通信工程學(xué)院實(shí)驗(yàn)1使用動(dòng)態(tài)優(yōu)先權(quán)的進(jìn)程調(diào)度算法的模擬1實(shí)驗(yàn)?zāi)康耐ㄟ^動(dòng)態(tài)優(yōu)先權(quán)算法的模擬加深對(duì)進(jìn)程概念和進(jìn)程調(diào)度過程的理解。2實(shí)驗(yàn)容(1) 實(shí)現(xiàn)對(duì)N個(gè)進(jìn)程采用動(dòng)態(tài)優(yōu)先權(quán)優(yōu)先算法的進(jìn)程調(diào)度。(2) 每個(gè)用來標(biāo)識(shí)進(jìn)程的進(jìn)程控制塊PCB用結(jié)構(gòu)來描述,包括以下字段:進(jìn)程標(biāo)識(shí)數(shù)ID。進(jìn)程優(yōu)先數(shù)PRIORITY,并規(guī)定優(yōu)先數(shù)越大的進(jìn)程,其優(yōu)先權(quán)越高。進(jìn)程已占用的CPU時(shí)間CPUTIME。進(jìn)程還需占用的CPU時(shí)間ALLTIME。當(dāng)進(jìn)程運(yùn)行完畢時(shí),ALLTIME變?yōu)?。進(jìn)程的阻塞時(shí)間STARTBLOCK,表示當(dāng)進(jìn)程再運(yùn)行STARTBL

2、OCK個(gè)時(shí)間片后,將進(jìn)入阻塞狀態(tài)。進(jìn)程被阻塞的時(shí)間BLOCKTIME,表示已阻塞的進(jìn)程再等待BLOCKTIME個(gè)時(shí)間片后,將轉(zhuǎn)換成就緒狀態(tài)。進(jìn)程狀態(tài)STATE。隊(duì)列指針NEXT,用來將PCB排成隊(duì)列。(3) 優(yōu)先數(shù)改變的原則:進(jìn)程在就緒隊(duì)列中停留一個(gè)時(shí)間片,優(yōu)先數(shù)加1。進(jìn)程每運(yùn)行一個(gè)時(shí)間片,優(yōu)先數(shù)減3。ID01234PRIORITY93830290CPUTIME00000ALLTIME33634STARTBLOCK2-1-1-1-1BLOCKTIME30000STATEreadyreadyreadyreadyready(4) 假設(shè)在調(diào)度前,系統(tǒng)中有5個(gè)進(jìn)程,它們的初始狀態(tài)如下:(5) 為了清楚

3、的觀察各進(jìn)程的調(diào)度過程,程序應(yīng)將每個(gè)時(shí)間片的情況顯示出來,參照的具體格式如下:RUNNINGPROG:iREADY-QUEUE:->id1->id2BLOCK-QUEUE:->id3->id4ID01234PRIORITYP0P1P2P3P4CUPTIMEC0C1C2C3C4ALLTIMEA0A1A2A3A4STARTBLOCKT0T1T2T3T4BLOCKTIMEB0B1B2B3B4STATES0S1S2S3S43實(shí)驗(yàn)結(jié)果(1)流程圖(2)程序源代碼#include<stdio.h>#include<stdlib.h>#include<s

4、tring.h>typedefstructnode(intid;intpriority;intcputime;intalltime;intstartblock;intblocktime;charstate10;structnode*next;PCB;/進(jìn)程標(biāo)識(shí)數(shù)/進(jìn)程優(yōu)先數(shù),優(yōu)先數(shù)越大優(yōu)先級(jí)越高/進(jìn)程已占用的CPU時(shí)間/進(jìn)程還需占用的CPU時(shí)間/進(jìn)程的阻塞時(shí)間/進(jìn)程被阻塞的時(shí)間/進(jìn)程狀態(tài)/隊(duì)列指針PCB*CreatQueue(intnum)(inti;/i為循環(huán)計(jì)數(shù)器PCB*head,*temp1,*temp2,*temp3;創(chuàng)建一個(gè)就緒隊(duì)列/head為就緒隊(duì)列的頭指針,temp1為創(chuàng)建

5、進(jìn)程結(jié)點(diǎn)的指針,temp2、temp3分別為比較結(jié)點(diǎn)的前驅(qū)結(jié)點(diǎn)和比較結(jié)點(diǎn)根據(jù)進(jìn)程的個(gè)數(shù)創(chuàng)建結(jié)點(diǎn)并按從大到小的順序進(jìn)行排序for(i=0;i<num;i+)(temp1=(PCB*)malloc(sizeof(PCB);printf("輸入第d個(gè)進(jìn)程的(id-state)n",i);scanf("%d%d%d%d%d%d%s”,&temp1->id,&temp1->priority,&temp1->cputime,&temp1->alltime,&temp1->startblock,&

6、;temp1->blocktime,temp1->state);if(i=0)/如果創(chuàng)建的是第一個(gè)結(jié)點(diǎn)(head=temp1;head->next=NULL;continue;if(head->priority<temp1->priority)如果創(chuàng)建結(jié)點(diǎn)中所保存的數(shù)比頭結(jié)點(diǎn)所保存的數(shù)要大,接把該結(jié)點(diǎn)插入到頭結(jié)點(diǎn)之前則直temp1->next=head;head=temp1;continue;temp2=head;temp3=temp2->next;while(temp3!=NULL&&temp3->priority>

7、=temp1->priority)(temp2=temp3;temp3=temp2->next;temp2->next=temp1;temp1->next=temp3;/temp2為比較結(jié)點(diǎn)的直接前驅(qū)結(jié)點(diǎn)/temp3為比較的結(jié)點(diǎn)/實(shí)現(xiàn)查找的功能returnhead;PCB*InsertQueue(PCB*head,PCB*run)(PCB*temp1,*temp2;if(head=NULL)(head=run;head->next=NULL;elseif(head->priority<run->priority)(run->next=hea

8、d;head=run;else/在就緒隊(duì)列中插入一個(gè)結(jié)點(diǎn)/temp1和temp2分別為比較結(jié)點(diǎn)的前驅(qū)和比較結(jié)點(diǎn)/如果就緒隊(duì)列為空如果插入結(jié)點(diǎn)中所保存的數(shù)比頭結(jié)點(diǎn)所保存的數(shù)要大,結(jié)點(diǎn)插入到頭結(jié)點(diǎn)之前則直接把該(/temp1為比較結(jié)點(diǎn)的直接前驅(qū)結(jié)點(diǎn)/temp2為比較的結(jié)點(diǎn)temp1=head;temp2=temp1->next;while(temp2!=NULL&&temp2->priority>=run->priority)/實(shí)現(xiàn)查找的功能(temp1=temp2;temp2=temp1->next;temp1->next=run;run-&g

9、t;next=temp2;returnhead;:");CPU時(shí)間main()(intnum;intalltime=0;PCB*head;PCB*run=NULL;PCB*block=NULL;PCB*temp;printf("請(qǐng)輸入進(jìn)程的個(gè)數(shù)scanf("%d”,&num);head=CreatQueue(num);getchar();temp=head;while(temp!=NULL)(/num為進(jìn)程的個(gè)數(shù)/用來保存所有進(jìn)程需要占用的/head為就緒隊(duì)列的頭指針/run為執(zhí)行進(jìn)程結(jié)點(diǎn)的指針/block為阻塞進(jìn)程的結(jié)點(diǎn)alltime+=temp->

10、;alltime;temp=temp->next;while(alltime>0)(if(head!=NULL)(run=head;head=head->next;strcpy(run->state,"run");run->next=NULL;/*顯示狀態(tài)*/把就緒隊(duì)列中的第一個(gè)進(jìn)程取出來執(zhí)行/就緒隊(duì)列的頭指針指向下一個(gè)結(jié)點(diǎn)/狀態(tài)改為執(zhí)行printf("RUNNINGPROG:%dn”,run->id);printf("READY_QUEUE:");temp=head;while(temp!=NULL)(pr

11、intf("->%d",temp->id);temp=temp->next;printf("n");printf("BLOCK_QUEUE:");if(block!=NULL)(printf("%d”,block->id);printf("n");/顯示執(zhí)行進(jìn)程/顯示就緒進(jìn)程/顯示阻塞進(jìn)程printf("=n");printf("IDPRIORITYCPUTIMEALLTIMESTARTBLOCKBLOCKTIMESTATEn");print

12、f("%d%d%d%d%d%d%sn",run->id,run->priority,run->cputime,run->alltime,run->startblock,run->blocktime,run->state);temp=head;while(temp!=NULL)(printf("%d%d%d%d%d%d%sn",temp->id,temp->priority,temp->cputime,temp->alltime,temp->startblock,temp->bl

13、ocktime,temp->state);temp=temp->next;if(block!=NULL)(printf("%d%d%d%d%d%d%s”,block->id,block->priority,block->cputime,block->alltime,block->startblock,block->blocktime,block->state);printf("n");printf("n");/*顯示狀態(tài)*/*改變優(yōu)先數(shù)*/run->priority-=3;temp=h

14、ead;while(temp!=NULL)(temp->priority+=1;temp=temp->next;/*改變優(yōu)先數(shù)*/*改變執(zhí)行進(jìn)程的有關(guān)參數(shù)run->cputime+=1;run->alltime-=1;if(run->alltime!=0)/執(zhí)行進(jìn)程的優(yōu)先數(shù)減3/就緒進(jìn)程的優(yōu)先數(shù)加1*/執(zhí)行進(jìn)程的已占用CPU時(shí)間加1還需要的CPU時(shí)間減1(if(run->startblock>0)(run->startblock-=1;if(run->startblock=0)(block=run;strcpy(block->stat

15、e,"b");alltime-;printf("n");continue;/如果該進(jìn)程會(huì)被阻塞/執(zhí)行完一個(gè)時(shí)間片后,開始阻塞的時(shí)間減1/如果阻塞的時(shí)間到了/執(zhí)行轉(zhuǎn)阻塞/狀態(tài)轉(zhuǎn)阻塞strcpy(run->state,"r");head=InsertQueue(head,run);run=NULL;/*改變執(zhí)行進(jìn)程的有關(guān)參數(shù)alltime-;else(/*顯示狀態(tài)*/printf("RUNNINGPROG:n");printf("READY_QUEUE:n");printf("BLO

16、CK_QUEUE:");if(block!=NULL)(printf("%d”,block->id);/狀態(tài)轉(zhuǎn)就緒/執(zhí)行轉(zhuǎn)就緒*/顯示執(zhí)行進(jìn)程/顯示就緒進(jìn)程/顯示阻塞進(jìn)程printf("printf("n");n");printf("IDPRIORITYCPUTIMEALLTIMESTARTBLOCKBLOCKTIMESTATEn");if(block!=NULL)printf("%d%d%d%d%d%d%s”,block->id,block->priority,block->cp

17、utime,block->alltime,block->startblock,block->blocktime,block->state);printf("n");n");printf("=/*顯示狀態(tài)*/*改變阻塞進(jìn)程的有關(guān)參數(shù)*/if(block!=NULL)/如果有阻塞進(jìn)程(block->blocktime-=1;被阻塞的時(shí)間減1if(block->blocktime=0)/如果被阻塞的時(shí)間到了(strcpy(block->state,"r");/狀態(tài)轉(zhuǎn)就緒head=InsertQueue(head,block);/阻塞轉(zhuǎn)就緒block=NULL;/*改變阻塞進(jìn)程的有關(guān)參數(shù)*/getchar();4思考(1) 實(shí)際進(jìn)程調(diào)度中,除了按調(diào)度算法選擇下一個(gè)執(zhí)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(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)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論