版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
一.課程概述1.1.設(shè)計(jì)構(gòu)想程序能夠完成以下操作:創(chuàng)建進(jìn)程:先輸入進(jìn)程數(shù)目,再一次輸入每個(gè)進(jìn)程進(jìn)程名、運(yùn)行總時(shí)間和優(yōu)先級(jí),先抵達(dá)先輸入;進(jìn)程調(diào)度:進(jìn)程創(chuàng)建完成后就選擇進(jìn)程調(diào)度算法,并單步實(shí)施,每次實(shí)施結(jié)果全部從屏幕上輸出來。1.2.需求分析在多道程序環(huán)境下,主存中有著多個(gè)進(jìn)程,其數(shù)目往往多于處理機(jī)數(shù)目,要使這多個(gè)進(jìn)程能夠并發(fā)地實(shí)施,這就要求系統(tǒng)能按某種算法,動(dòng)態(tài)地把處理機(jī)分配給就緒隊(duì)列中一個(gè)進(jìn)程,使之實(shí)施。分配處理機(jī)任務(wù)是由處理機(jī)調(diào)度程序完成。因?yàn)樘幚頇C(jī)是最關(guān)鍵計(jì)算機(jī)資源,提升處理機(jī)利用率及改善系統(tǒng)必(吞吐量、響應(yīng)時(shí)間),在很大程度上取決于處理機(jī)調(diào)度性能好壞,所以,處理機(jī)調(diào)度便成為操作系統(tǒng)設(shè)計(jì)中心問題之一。此次試驗(yàn)在VC++6.0環(huán)境下實(shí)現(xiàn)先來先服務(wù)調(diào)度算法,短作業(yè)優(yōu)先調(diào)度算法,高優(yōu)先權(quán)調(diào)度算法,時(shí)間片輪轉(zhuǎn)調(diào)度算法和多級(jí)反饋隊(duì)列調(diào)度算法。1.3.理論依據(jù)為了描述和管制進(jìn)程運(yùn)行,系統(tǒng)為每個(gè)進(jìn)程定義了一個(gè)數(shù)據(jù)結(jié)構(gòu)——進(jìn)程控制塊PCB(ProcessControlBlock),PCB中統(tǒng)計(jì)了操作系統(tǒng)所需、用于描述進(jìn)程目前情況和控制進(jìn)程運(yùn)行全部信息,系統(tǒng)總是經(jīng)過PCB對進(jìn)程進(jìn)行控制,亦即,系統(tǒng)是依據(jù)進(jìn)程PCB而不是任何別什么而感知進(jìn)程存在,PCB是進(jìn)程存在惟一標(biāo)志。此次課程設(shè)計(jì)用結(jié)構(gòu)體Process替換PCB功效。1.4.課程任務(wù)用C語言(或C++)編程實(shí)現(xiàn)操作模擬操作系統(tǒng)進(jìn)程調(diào)度子系統(tǒng)基礎(chǔ)功效;利用多個(gè)算法實(shí)現(xiàn)對進(jìn)程模擬調(diào)度。經(jīng)過編寫程序?qū)崿F(xiàn)進(jìn)程或作業(yè)先來先服務(wù)、高優(yōu)先權(quán)、按時(shí)間片輪轉(zhuǎn)、短作業(yè)優(yōu)先、多級(jí)反饋隊(duì)列調(diào)度算法,使學(xué)生深入掌握進(jìn)程調(diào)度概念和算法,加深對處理機(jī)分配了解。實(shí)現(xiàn)用戶界面開發(fā)1.5.功效模塊分析:進(jìn)程概念:進(jìn)程是被獨(dú)立分配資源最小單位。進(jìn)程是動(dòng)態(tài)概念,必需程序運(yùn)行才有進(jìn)程產(chǎn)生。2、進(jìn)程狀態(tài)模型:(1)運(yùn)行:進(jìn)程已取得處理機(jī),目前處于運(yùn)行狀態(tài)。(2)就緒:進(jìn)程已經(jīng)準(zhǔn)備好,一旦有處理器就可運(yùn)行。3、處理機(jī)調(diào)度:在多道程序設(shè)計(jì)系統(tǒng)中,內(nèi)存中有多道程序運(yùn)行,她們相互爭奪處理機(jī)這一關(guān)鍵資源。處理機(jī)調(diào)度就是從就緒隊(duì)列中,根據(jù)一定算法選擇一個(gè)進(jìn)程并將處理機(jī)分配給它運(yùn)行,以實(shí)現(xiàn)進(jìn)程并發(fā)地實(shí)施。4、進(jìn)程調(diào)度算法功效:統(tǒng)計(jì)系統(tǒng)中全部進(jìn)程實(shí)施情況選擇占有處理機(jī)進(jìn)程進(jìn)行進(jìn)程上下文切換5、進(jìn)程調(diào)度算法:(1)先來先服務(wù)算法:假如早就緒進(jìn)程排在就緒隊(duì)列前面,遲就緒進(jìn)程排在就緒隊(duì)列后面,那么先來先服務(wù)總是把目前處于就緒隊(duì)列之首那個(gè)進(jìn)程調(diào)度到運(yùn)行狀態(tài)。(2)優(yōu)先數(shù)算法:即進(jìn)程實(shí)施次序由高優(yōu)先級(jí)到低優(yōu)先級(jí)。系統(tǒng)或用戶按某種標(biāo)準(zhǔn)為進(jìn)程指定一個(gè)優(yōu)先級(jí)來表示該進(jìn)程所享受確實(shí)調(diào)度優(yōu)先權(quán)。該算法關(guān)鍵是確定進(jìn)程優(yōu)先級(jí)。(3)時(shí)間片輪轉(zhuǎn)算法:固定時(shí)間片,每個(gè)進(jìn)程在實(shí)施一個(gè)時(shí)間片后,輪到下一進(jìn)程實(shí)施,知道全部進(jìn)程實(shí)施完成。處理器同一個(gè)時(shí)間只能處理一個(gè)任務(wù)。處理器在處理多任務(wù)時(shí)候,就要看請求時(shí)間次序,假如時(shí)間一致,就要進(jìn)行估計(jì)。挑到一個(gè)任務(wù)后,需要若干步驟才能做完,這些步驟中有些需要處理器參與,有些不需要(如磁盤控制器存放過程)。不需要處理器處理時(shí)候,這部分時(shí)間就要分配給其它進(jìn)程。原來進(jìn)程就要處于等候時(shí)間段上。經(jīng)過周密分配時(shí)間,宏觀上就象是多個(gè)任務(wù)一起運(yùn)行一樣,但微觀上是有前后,就是時(shí)間片輪換。(4)多級(jí)反饋隊(duì)列法:又稱反饋循環(huán)隊(duì)列或多隊(duì)列策略,關(guān)鍵思想是將就緒進(jìn)程分為兩級(jí)或多級(jí),系統(tǒng)對應(yīng)建立兩個(gè)或多個(gè)就緒進(jìn)程隊(duì)列,較高優(yōu)先級(jí)隊(duì)列通常分配給較短時(shí)間片。處理器調(diào)度先從高級(jí)就緒進(jìn)程隊(duì)列中選擇可占有處理器進(jìn)程,只有在選不到時(shí),才從較低級(jí)就緒進(jìn)程隊(duì)列中選擇。(5)短作業(yè)優(yōu)先法:對短進(jìn)程優(yōu)先調(diào)度算法,它是從后備隊(duì)列中選擇一個(gè)或若干個(gè)進(jìn)程,將處理機(jī)分配給它,使它立即實(shí)施并一直實(shí)施到完成,或發(fā)生某事件而被阻塞放棄處理機(jī)時(shí)再重新調(diào)度。二.設(shè)計(jì)方案2.1.先來先服務(wù)調(diào)度2.1.1.算法思想先來先服務(wù)調(diào)度算法思想是根據(jù)進(jìn)程進(jìn)入就緒隊(duì)列前后次序調(diào)度并分配處理機(jī)實(shí)施。先來先服務(wù)調(diào)度算法是一個(gè)不可搶占算法,優(yōu)異入就緒隊(duì)列進(jìn)程,先被處理機(jī)運(yùn)行。一旦一個(gè)進(jìn)程占有了處理機(jī),它就一直運(yùn)行下去,直到該進(jìn)程完成工作或因?yàn)榈群蚰呈录荒芾^續(xù)運(yùn)行時(shí)才釋放處理機(jī)。2.1.2.算法步驟圖圖1.先來先服務(wù)算法步驟圖2.1.3.程序代碼#include<stdio.h>#include<stdlib.h>#include<string.h>typedefstructnode{ charname[10];/*進(jìn)程名*/ intcputime;/*占用cpu時(shí)間*/ charstarttime[5];//進(jìn)程開始時(shí)間 intneedtime;/*要求運(yùn)行時(shí)間*/ charstate;/*狀態(tài)*/ structnode*next;/*指針*/}PCB;PCB*ready,*run,*finish;//就緒、實(shí)施、結(jié)束指針intN;//進(jìn)程數(shù)量voidprint()//輸出函數(shù){ PCB*p; printf("NAMECPUTIMESTARTTIMENEEDTIMESTATUS\n"); if(run!=NULL) printf("%-10s%-10d%-10s%-10d%c\n", run->name, run->cputime, run->starttime, run->needtime, run->state);/*輸出實(shí)施進(jìn)程信息*/ p=ready; while(p!=NULL) { printf("%-10s%-10d%-10s%-10d%c\n", p->name, p->cputime, p->starttime, p->needtime, p->state);/*輸出就緒進(jìn)程信息*/ p=p->next; } p=finish; while(p!=NULL) { printf("%-10s%-10d%-10s%-10d%c\n", p->name, p->cputime, p->starttime, p->needtime, p->state);/*輸出結(jié)束隊(duì)列信息*/p=p->next; } getchar();/*使用getchar()函數(shù)能夠讓輸出時(shí)停留畫面, 等候人按回車?yán)^續(xù)*/}voidinsert(PCB*q)/*插入新進(jìn)程,把進(jìn)程按進(jìn)程到來時(shí)間大小排序*/{ PCB*p1,*s,*r; intb; s=q;/*指針s指向新要插入進(jìn)程*/ p1=ready;/*指針p1指向原來進(jìn)程隊(duì)列隊(duì)首*/ r=p1;/*使用指針r是指向p1前面進(jìn)程*/ b=1; while((p1!=NULL)&&b) if(strcmp(p1->starttime,s->starttime)<0) { r=p1;p1=p1->next; }/*新進(jìn)程開始時(shí)間大,則p1指向下一個(gè)進(jìn)程繼續(xù)比*/ else b=0; if(r!=p1) { r->next=s;s->next=p1; }/*新進(jìn)程找到位置,插在r和p1之間*/ else { s->next=p1;ready=s; }/*新進(jìn)程開始時(shí)間按最小,插在隊(duì)首,并修改就緒隊(duì)首ready指針*/}voidcreate(){ PCB*p; inti; ready=NULL; run=NULL; finish=NULL; printf("PleaseenterthenameandtimeandstarttimeofPCB:\n"); /*輸入進(jìn)程名、運(yùn)行時(shí)間和開始時(shí)間*/ for(i=0;i<N;i++) { p=(PCB*)malloc(sizeof(PCB));/*為新進(jìn)程開辟空間*/ scanf("%s",p->name);/*輸入進(jìn)程名*/ scanf("%d",&p->needtime);/*輸入進(jìn)程要求運(yùn)行時(shí)間*/ scanf("%s",p->starttime);//輸入進(jìn)程開始時(shí)間 p->cputime=0; p->state='W';/*表示就緒隊(duì)列中未在隊(duì)首先實(shí)施,但也是就緒狀態(tài)*/ if(ready!=NULL) insert(p);/*就緒隊(duì)首不為NULL,插入新進(jìn)程*/ else {/*不然先插在NULL前*/ p->next=ready; ready=p; } } printf("Displayisgoingtostart:\n"); printf("***********************************************\n"); print(); getchar(); run=ready;/*隊(duì)列排好,run指向就緒隊(duì)列隊(duì)首*/ ready=ready->next;/*ready指向下一個(gè)進(jìn)程*/ run->state='R';/*隊(duì)首進(jìn)程狀態(tài)為就緒*/}voidFCFS(){ while(run!=NULL) { run->cputime=run->cputime+run->needtime; run->needtime=0; run->next=finish; finish=run; run->state='E'; run=NULL; if(ready!=NULL) { run=ready; run->state='R'; ready=ready->next; } print(); }}voidmain(){ printf("PleaseenterthetotalnumberofPCB:\n"); scanf("%d",&N); create();/*模擬創(chuàng)建進(jìn)程,并輸入相關(guān)信息*/ FCFS();/*先來先服務(wù)調(diào)度算法*/}2.1.4.測試結(jié)果及說明首先輸入進(jìn)程個(gè)數(shù)(為5個(gè)),這里命名為A,B,C,D,E,然后分別輸入運(yùn)行時(shí)間和開始時(shí)間全部進(jìn)程全部在隊(duì)列中,并全部處于等候狀態(tài)其中一個(gè)進(jìn)程實(shí)施完成全部進(jìn)程全部實(shí)施完成2.2.優(yōu)先級(jí)調(diào)度2.2進(jìn)程實(shí)施次序由高優(yōu)先級(jí)到低優(yōu)先級(jí),系統(tǒng)或用戶按某種標(biāo)準(zhǔn)為進(jìn)程指定一個(gè)優(yōu)先級(jí)來表示該進(jìn)程所享受確實(shí)調(diào)度優(yōu)先權(quán)。該算法關(guān)鍵是確定進(jìn)程優(yōu)先級(jí)。2.2.2圖2.優(yōu)先級(jí)調(diào)度步驟圖2.2#include<stdio.h>#include<stdlib.h>#include<string.h>typedefstructnode{charname[10];/*進(jìn)程名*/intprio;/*優(yōu)先數(shù)*/intcputime;/*占用cpu時(shí)間*/intneedtime;/*要求運(yùn)行時(shí)間*/charstate;/*狀態(tài)*/structnode*next;/*指針*/}PCB;PCB*ready,*run,*finish;/*就緒實(shí)施結(jié)束指針*/intN;voidprt()/*輸出函數(shù),能夠方便看到進(jìn)程實(shí)施演示*/{PCB*p;printf("NAMECPUTIMENEEDTIMEPRIORITYSTATUS\n");if(run!=NULL)printf("%-10s%-10d%-10d%-10d%c\n",run->name,run->cputime,run->needtime,run->prio,run->state);/*輸出實(shí)施進(jìn)程信息*/p=ready;while(p!=NULL){printf("%-10s%-10d%-10d%-10d%c\n",p->name,p->cputime,p->needtime,p->prio,p->state);/*輸出就緒進(jìn)程信息*/p=p->next;}p=finish;while(p!=NULL){printf("%-10s%-10d%-10d%-10d%c\n",p->name,p->cputime,p->needtime,p->prio,p->state);/*輸出結(jié)束隊(duì)列信息*/p=p->next;}getchar();}/*使用getchar()函數(shù)能夠讓輸出時(shí)停留畫面,等候人按回車?yán)^續(xù)*/voidinsert(PCB*q)/*插入新進(jìn)程,把進(jìn)程按優(yōu)先數(shù)大小排序*/{PCB*p1,*s,*r;intb;s=q;/*指針s指向新要插入進(jìn)程*/p1=ready;/*指針p1指向原來進(jìn)程隊(duì)列隊(duì)首*/r=p1;/*使用指針r是指向p1前面進(jìn)程*/b=1;while((p1!=NULL)&&b)if(p1->prio>=s->prio){r=p1;p1=p1->next;}/*新進(jìn)程優(yōu)先數(shù)小,則p1指向下一個(gè)進(jìn)程繼續(xù)比*/ elseb=0;if(r!=p1){r->next=s;s->next=p1;}/*新進(jìn)程找到位置,插在r和p1之間*/else{s->next=p1;ready=s;}}/*新進(jìn)程優(yōu)先數(shù)最大,插在隊(duì)首,并 修改就緒隊(duì)首ready指針*/voidcreate(){PCB*p;inti;ready=NULL;run=NULL;finish=NULL;printf("PleaseenterthenameandtimeandpriorityofPCB:\n");/*輸入進(jìn)程名、運(yùn)行時(shí)間和優(yōu)先級(jí)*/for(i=0;i<N;i++){p=(PCB*)malloc(sizeof(PCB));/*為新進(jìn)程開辟空間*/scanf("%s",p->name);/*輸入進(jìn)程名*/scanf("%d",&p->needtime);/*輸入進(jìn)程要求運(yùn)行時(shí)間*/scanf("%d",&p->prio);/*輸入進(jìn)程優(yōu)先數(shù)*/p->cputime=0;p->state='W';/*表示就緒隊(duì)列中未在隊(duì)首先實(shí)施,但也是就緒狀態(tài)*/if(ready!=NULL)insert(p);/*就緒隊(duì)首不為NULL,插入新進(jìn)程*/else{p->next=ready;ready=p;}}/*不然先插在NULL前*/printf("Displayisgoingtostart:\n");printf("***********************************************\n");prt();run=ready;/*隊(duì)列排好,run指向就緒隊(duì)列隊(duì)首*/ready=ready->next;/*ready指向下一個(gè)進(jìn)程,這么當(dāng)進(jìn)程實(shí)施時(shí)假如優(yōu)先數(shù)小于其它進(jìn)程,應(yīng)該優(yōu)異行優(yōu)先數(shù)最大進(jìn)程*/run->state='R';}/*隊(duì)首進(jìn)程狀態(tài)為就緒*/voidprio(){while(run!=NULL){run->cputime=run->cputime+1;/*運(yùn)行一次cpu占用時(shí)間加一*/run->needtime=run->needtime-1;/*運(yùn)行一次要求運(yùn)行時(shí)間減一*/run->prio=run->prio-1;/*運(yùn)行一次優(yōu)先數(shù)減一*/if(run->needtime==0)/*若要求運(yùn)行時(shí)間為0時(shí)*/{run->next=finish;/*退出隊(duì)列*/finish=run;/*finish為結(jié)束進(jìn)程隊(duì)列*/run->state='E';/*修改狀態(tài)為結(jié)束*/run=NULL;/*釋放run指針*/if(ready!=NULL)/*創(chuàng)建新就緒隊(duì)列頭指針*/{run=ready;run->state='R';ready=ready->next;}}elseif((ready!=NULL)&&(run->prio<ready->prio))/*隊(duì)首進(jìn)程優(yōu)先數(shù)比它下一個(gè)小,且下一個(gè)進(jìn)程不為NULL時(shí)實(shí)施*/{run->state='W';run->next=NULL;/*隊(duì)首進(jìn)程退出進(jìn)程隊(duì)列*/insert(run);/*在進(jìn)程隊(duì)列中重新插入原來隊(duì)首進(jìn)程*/run=ready;/*重新置就緒隊(duì)列頭指針*/run->state='R';ready=ready->next;}prt();}}voidmain(){printf("PleaseenterthetotalnumberofPCB:\n");scanf("%d",&N);create();/*模擬創(chuàng)建進(jìn)程,并輸入相關(guān)信息*/prio();}/*優(yōu)先數(shù)調(diào)度算法*/2.2優(yōu)先級(jí)調(diào)度算法運(yùn)行情況圖1,圖2,圖3,圖4所表示圖1.輸入進(jìn)程塊數(shù)量圖2.輸入每個(gè)進(jìn)程名稱、時(shí)間、優(yōu)先級(jí)圖3.輸入全部進(jìn)程相關(guān)信息圖4.全部進(jìn)程調(diào)度算法完成2.3.時(shí)間片輪轉(zhuǎn)調(diào)度2.3全部就緒進(jìn)程按先來先服務(wù)標(biāo)準(zhǔn)排成一個(gè)隊(duì)列,將新來進(jìn)程加到就緒對列末尾,每當(dāng)實(shí)施進(jìn)程調(diào)度時(shí),總是把處理機(jī)分配給隊(duì)首進(jìn)程,各進(jìn)程占用CPU時(shí)間片相同。也就是說CPU處理時(shí)間劃分成一個(gè)個(gè)相同時(shí)間片,就緒隊(duì)列全部進(jìn)程輪番運(yùn)行一個(gè)時(shí)間片。當(dāng)一個(gè)時(shí)間片結(jié)束時(shí),假如運(yùn)行進(jìn)程用完它時(shí)間片后還未完成,就強(qiáng)迫運(yùn)行進(jìn)程讓出CPU,就把它送回到就緒隊(duì)列末尾,等候下一次調(diào)度。同時(shí),進(jìn)程調(diào)度又去選擇就緒隊(duì)列中隊(duì)首進(jìn)程,分配給它一時(shí)間片,以投入運(yùn)行。直至全部進(jìn)程運(yùn)行完成。2.32.3#include<stdio.h>#include<stdlib.h>#include<string.h>typedefstructnode{ charname[10];/*進(jìn)程名*/intcount;/*計(jì)數(shù)器,判定是否=時(shí)間片大小*/ intcputime;/*占用cpu時(shí)間*/ intneedtime;/*要求運(yùn)行時(shí)間*/ charstate;/*狀態(tài)*/ structnode*next;/*指針*/}PCB;PCB*ready,*run,*finish,*tail;/*就緒實(shí)施結(jié)束尾指針*/intN,round;voidprt()/*輸出函數(shù),能夠方便看到進(jìn)程實(shí)施演示*/{ PCB*p;printf("NAMECPUTIMENEEDTIMESTATUS\n");if(run!=NULL) printf("%-10s%-10d%-10d%c\n",run->name,run->cputime,run->needtime,run->state);/*輸出實(shí)施進(jìn)程信息*/p=ready;while(p!=NULL){ printf("%-10s%-10d%-10d%c\n",p->name,p->cputime,p->needtime,p->state);/*輸出就緒進(jìn)程信息*/p=p->next; }p=finish;while(p!=NULL){ printf("%-10s%-10d%-10d%c\n",p->name,p->cputime,p->needtime,p->state);/*輸出結(jié)束隊(duì)列信息*/p=p->next; }getchar();}voidinsert(PCB*q)/*在隊(duì)尾插入新進(jìn)程*/{ PCB*p; p=ready; while(p->next!=NULL) { p=ready->next; } tail=p; tail->next=q; q->next=NULL;}voidcreate(){ PCB*p;inti; ready=NULL;run=NULL;finish=NULL; printf("PleaseenterthenameandtimeofPCB:\n");/*輸入進(jìn)程名、和*/ for(i=0;i<N;i++){ p=(PCB*)malloc(sizeof(PCB));/*為新進(jìn)程開辟空間*/scanf("%s",p->name);/*輸入進(jìn)程名*/scanf("%d",&p->needtime);/*輸入進(jìn)程要求運(yùn)行時(shí)間*/p->cputime=0;p->state='W';/*表示就緒隊(duì)列中未在隊(duì)首先實(shí)施,但也是就緒狀態(tài)*/if(ready!=NULL)insert(p);/*就緒隊(duì)首不為NULL,插入新進(jìn)程*/else { p->next=ready;ready=p;tail=p; } }printf("Displayisgoingtostart:\n");printf("***********************************************\n");prt(); getchar();run=ready;/*隊(duì)列排好,run指向就緒隊(duì)列隊(duì)首*/ready=ready->next;/*ready指向下一個(gè)進(jìn)程*/run->state='R';}/*隊(duì)首進(jìn)程狀態(tài)為就緒*/voidcount(){ while(run!=NULL) { run->cputime=run->cputime+1;/*運(yùn)行一次cpu占用時(shí)間加一*/ run->needtime=run->needtime-1;/*運(yùn)行一次要求運(yùn)行時(shí)間減一*/ run->count=run->count+1;/*運(yùn)行一次計(jì)數(shù)器加一*/ if(run->needtime==0)/*若要求運(yùn)行時(shí)間為0時(shí)*/ { run->next=finish;/*退出隊(duì)列*/ finish=run;/*finish為結(jié)束進(jìn)程隊(duì)列*/ run->state='E';/*修改狀態(tài)為結(jié)束*/ run=NULL;/*釋放run指針*/ if(ready!=NULL)/*創(chuàng)建新就緒隊(duì)列頭指針*/ { run=ready;run->state='R';ready=ready->next; } } else if(run->count==round)/*假如時(shí)間片到*/ { run->count=0;/*計(jì)數(shù)器置0*/ if(ready!=NULL)/*如就緒隊(duì)列不空*/ { run->state='W'; insert(run);/*在進(jìn)程隊(duì)列中重新插入原來進(jìn)程,插入隊(duì)尾*/ run=ready;/*重新置就緒隊(duì)列頭指針*/ run->state='R'; ready=ready->next; } } prt(); }}voidmain(){ printf("PleaseenterthetotalnumberofPCB:\n"); scanf("%d",&N); create();/*模擬創(chuàng)建進(jìn)程,并輸入相關(guān)信息*/ count();/*優(yōu)先數(shù)調(diào)度算法*/}2.3時(shí)間片輪轉(zhuǎn)調(diào)度算法運(yùn)行情況圖1,圖2,圖3所表示圖1全部進(jìn)程全部在隊(duì)列中圖2其中一個(gè)進(jìn)程實(shí)施完成圖4全部進(jìn)程全部實(shí)施完成2.4.多級(jí)反饋隊(duì)列調(diào)度2.4.1算法思想許可進(jìn)程在隊(duì)列之間移動(dòng)。在系統(tǒng)中設(shè)置多個(gè)就緒隊(duì)列,每個(gè)隊(duì)列對應(yīng)一個(gè)優(yōu)先級(jí),第一個(gè)隊(duì)列優(yōu)先級(jí)最高,第二隊(duì)列次之。以下各隊(duì)列優(yōu)先級(jí)逐步低。各就緒隊(duì)列中進(jìn)程運(yùn)行時(shí)間片不一樣,高優(yōu)先級(jí)隊(duì)列時(shí)間片小,低優(yōu)先級(jí)隊(duì)列時(shí)間片大。進(jìn)程并非總是固定在某一隊(duì)列中,新進(jìn)程進(jìn)入系統(tǒng)后,被存放在第一個(gè)隊(duì)列末尾。假如某個(gè)進(jìn)程在要求時(shí)間片內(nèi)沒有完成工作,則把它轉(zhuǎn)入到下一個(gè)隊(duì)列末尾,直至進(jìn)入最終一個(gè)隊(duì)列。系統(tǒng)先運(yùn)行第一個(gè)隊(duì)列中進(jìn)程。當(dāng)?shù)谝魂?duì)列為空時(shí),才運(yùn)行第二個(gè)隊(duì)列中進(jìn)程。依這類推,僅目前面全部隊(duì)列全部為空時(shí),才運(yùn)行最終一個(gè)隊(duì)列中進(jìn)程。當(dāng)處理器正在第i個(gè)隊(duì)列中為某個(gè)進(jìn)程服務(wù)時(shí),又有新進(jìn)程進(jìn)入優(yōu)先級(jí)最高隊(duì)列(第1—(i-1)中任何一個(gè)對列),則此新進(jìn)程要搶占正在運(yùn)行進(jìn)程處理器,即由調(diào)度程序把正在運(yùn)行進(jìn)程放回第i隊(duì)列末尾,把處理器分配給新到高優(yōu)先級(jí)進(jìn)程。除最低優(yōu)先權(quán)隊(duì)列外全部其它隊(duì)列,均采取相同進(jìn)程調(diào)度算法,即按時(shí)間片輪轉(zhuǎn)FIFO(優(yōu)異先出)算法。最終一個(gè)隊(duì)列中進(jìn)程按按時(shí)間片輪轉(zhuǎn)或FCFS策略進(jìn)行調(diào)度。它是綜合了FIFO、RR和剝奪式HPF一個(gè)進(jìn)程調(diào)度算法。2.4.2算法步驟圖2.4.3程序代碼#include<stdio.h>#include<stdlib.h>#include<string.h>#defineNULL0typedefstructnode{ charname[10];/*進(jìn)程名*/ intnum; /*進(jìn)程所在隊(duì)列數(shù),也是該隊(duì)列時(shí)間片*/ intcputime;/*占用cpu時(shí)間*/ intneedtime;/*要求運(yùn)行時(shí)間*/ structnode*next;/*指針*/}PCB;PCB*qf1,*ql1;PCB*qf2,*ql2;PCB*qf3,*ql3;//定義三個(gè)隊(duì)列頭指針和尾指針intblog1,blog2,blog3; /*分別統(tǒng)計(jì)隊(duì)列1,、隊(duì)列2、隊(duì)列3中進(jìn)程數(shù)*/voidinsert(PCB*q,PCB*qf,PCB*ql){ q->num++; if(qf==NULL&&ql==NULL) {//隊(duì)列為空 qf=ql=q; } else {//隊(duì)列不為空 ql->next=q; ql=q; } ql->next=NULL;}voidcreate(intn){//創(chuàng)建進(jìn)程,剛來進(jìn)程全部進(jìn)入隊(duì)列1 PCB*p; p=(PCB*)malloc(sizeof(PCB)); inti; blog1=blog2=blog3=0; //各隊(duì)列中進(jìn)程數(shù)均為0 printf("PleaseenterthenameandneedtimeofPCB:\n"); /*輸入進(jìn)程名和所需時(shí)間*/ for(i=0;i<n;i++) { //p=(PCB*)malloc(sizeof(PCB));/*為新進(jìn)程開辟空間*/ scanf("%s",p->name);/*輸入進(jìn)程名*/ scanf("%d",&(p->needtime));/*輸入進(jìn)程要求運(yùn)行時(shí)間*/ p->cputime=0; p->num=0; insert(p,qf1,ql1); blog1++; //隊(duì)列中進(jìn)程數(shù)加1 }}intrun(PCB*q,PCB*qf,PCB*ql){ PCB*p,*f,*l; /*p=(PCB*)malloc(sizeof(PCB)); f=(PCB*)malloc(sizeof(PCB)); l=(PCB*)malloc(sizeof(PCB));*/ p=q; f=qf; l=ql; if(q->needtime<=q->num)/*在時(shí)間片內(nèi)完成*/ { //q->cputime+=q->needtime; q->needtime=0; free(q); return0; } else /*不能在時(shí)間片內(nèi)完成*/ { //q->cputime+=q->num; q->needtime-=q->num; if(q->num<3) q->num++; insert(p,f,l); //進(jìn)入下一個(gè)隊(duì)列 return1; } }voidprt()/*輸出函數(shù),能夠方便看到進(jìn)程實(shí)施演示*/{ PCB*p; //p=(PCB*)malloc(sizeof(PCB)); inta; printf("NAMECPUTIMENEEDTIMESTATUS\n"); while(blog1>0||blog2>0||blog3>0) { if(blog1>0) /*第一個(gè)隊(duì)列不為空*/ { p=qf1; qf1=qf1->next; p->next=NULL; blog1--; printf("%-10s%-10d%\n",p->name,p->needtime); a=run(p,qf2,ql2); if(a==1) blog2++; } elseif(blog2>0) /*第二個(gè)隊(duì)列不為空*/ { p=qf2; qf2=qf2->next;p->next=NULL; blog2--; printf("%-10s%-10d%\n",p->name,p->needtime); a=run(p,qf3,ql3); if(a==1) blog3++; } elseif(blog3>0) /*第三個(gè)隊(duì)列不為空*/ { p=qf3; qf3=qf3->next;p->next=NULL; blog3--; printf("%-10s%-10d%\n",p->name,p->needtime); a=run(p,qf3,ql3); if(a==1) blog3++; } }}/*使用getchar()函數(shù)能夠讓輸出時(shí)停留畫面,等候人按回車?yán)^續(xù)*/voidmain(){ qf1=ql1=(PCB*)malloc(sizeof(PCB)); qf2=ql2=(PCB*)malloc(sizeof(PCB)); qf2=ql2=(PCB*)malloc(sizeof(PCB)); intn; blog1=blog2=blog3=0; printf("請輸入進(jìn)程個(gè)數(shù):"); scanf("%d",&n); create(n); prt();}2.42.5.短作業(yè)調(diào)度2.5.1短作業(yè)優(yōu)先調(diào)度算法是指對短作業(yè)進(jìn)行調(diào)度算法。它從后備隊(duì)列總選擇一個(gè)或若干個(gè)運(yùn)行時(shí)間最短作業(yè),將她們調(diào)入內(nèi)存運(yùn)行。2.5.2開始開始輸入進(jìn)程名輸入進(jìn)程名就緒隊(duì)列空?就緒隊(duì)列空?結(jié)束 Y結(jié)束 N按時(shí)間服務(wù)進(jìn)行排序按時(shí)間服務(wù)進(jìn)行排序?qū)嵤┏绦驅(qū)嵤┏绦蚨套鳂I(yè)優(yōu)先算法步驟圖2.5#include<stdio.h>#include<stdlib.h>#include<string.h>typedefstructnode{ charname[10];/*進(jìn)程名*/ intcputime;/*占用cpu時(shí)間*/ intneedtime;/*要求運(yùn)行時(shí)間*/ charstate;/*狀態(tài)*/ structnode*next;/*指針*/}PCB;PCB*ready,*run,*finish;//就緒、實(shí)施、結(jié)束指針intN;//進(jìn)程數(shù)量voidprint()//輸出函數(shù){ PCB*p; printf("NAMECPUTIMENEEDTIMESTATUS\n"); if(run!=NULL) printf("%-10s%-10d%-10d%c\n", run->name, run->cputime, run->needtime, run->state);/*輸出實(shí)施進(jìn)程信息*/ p=ready; while(p!=NULL) { printf("%-10s%-10d%-10d%c\n", p->name, p->cputime, p->needtime, p->state);/*輸出就緒進(jìn)程信息*/ p=p->next; } p=finish; while(p!=NULL) { printf("%-10s%-10d%-10d%c\n", p->name, p->cputime, p->needtime, p->state);/*輸出結(jié)束隊(duì)列信息*/p=p->next; } getchar();/*使用getchar()函數(shù)能夠讓輸出時(shí)停留畫面, 等候人按回車?yán)^續(xù)*/}voidinsert(PCB*q)/*插入新進(jìn)程,把進(jìn)程按進(jìn)程到來時(shí)間大小排序*/{ PCB*p1,*s,*r; intb; s=q;/*指針s指向新要插入進(jìn)程*/ p1=ready;/*指針p1指向原來進(jìn)程隊(duì)列隊(duì)首*/ r=p1;/*使用指針r是指向p1前面進(jìn)程*/ b=1; while((p1!=NULL)&&b) if(p1->needtime<s->needtime) { r=p1;p1=p1->next; }/*新進(jìn)程開始時(shí)間大,則p1指向下一個(gè)進(jìn)程繼續(xù)比*/ else b=0; if(r!=p1) { r->next=s;s->next=p1; }/*新進(jìn)程找到位置,插在r和p1之間*/ else { s->next=p1;ready=s; }/*新進(jìn)程開始時(shí)間按最小,插在隊(duì)首,并修改就緒隊(duì)首ready指針*/}voidcreate(){ PCB*p; inti; ready=NULL; run=NULL; finish=NULL; printf("PleaseenterthenameandtimeofPCB:\n"); /*輸入進(jìn)程名、運(yùn)行時(shí)間和開始時(shí)間*/ for(i=0;i<N;i++) { p=(PCB*)malloc(sizeof(PCB));
溫馨提示
- 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ǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年代理加盟協(xié)議范本
- 《民族復(fù)興中國夢》課件
- 2025年個(gè)人消費(fèi)貸款抵押合同
- 2025年化學(xué)災(zāi)難責(zé)任保險(xiǎn)合同
- 2025年寬帶網(wǎng)絡(luò)使用協(xié)約
- 2025年石材質(zhì)押合同
- 2025版綠色建筑項(xiàng)目募集資金三方監(jiān)管與支持合同4篇
- 2025版信息安全管理體系委托管理合同范本3篇
- 2025版衛(wèi)生間裝修材料環(huán)保認(rèn)證協(xié)議書3篇
- 2025版農(nóng)業(yè)設(shè)施設(shè)計(jì)顧問服務(wù)協(xié)議3篇
- 醫(yī)院三基考核試題(康復(fù)理療科)
- 2024-2030年中國招標(biāo)代理行業(yè)深度分析及發(fā)展前景與發(fā)展戰(zhàn)略研究報(bào)告
- 醫(yī)師定期考核 (公共衛(wèi)生)試題庫500題(含答案)
- 基因突變和基因重組(第1課時(shí))高一下學(xué)期生物人教版(2019)必修2
- 內(nèi)科學(xué)(醫(yī)學(xué)高級(jí)):風(fēng)濕性疾病試題及答案(強(qiáng)化練習(xí))
- 音樂劇好看智慧樹知到期末考試答案2024年
- 辦公設(shè)備(電腦、一體機(jī)、投影機(jī)等)采購 投標(biāo)方案(技術(shù)方案)
- 案卷評(píng)查培訓(xùn)課件模板
- 2024年江蘇省樣卷五年級(jí)數(shù)學(xué)上冊期末試卷及答案
- 人教版初中英語七八九全部單詞(打印版)
- 波浪理論要點(diǎn)圖解完美版
評(píng)論
0/150
提交評(píng)論