可搶占調(diào)度算法(在V下編譯通過)_第1頁
可搶占調(diào)度算法(在V下編譯通過)_第2頁
可搶占調(diào)度算法(在V下編譯通過)_第3頁
可搶占調(diào)度算法(在V下編譯通過)_第4頁
可搶占調(diào)度算法(在V下編譯通過)_第5頁
已閱讀5頁,還剩30頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、可搶占調(diào)度算法(在VC下編譯通過)#include #include #include #include #include #include const int FINISH=0;/完成狀態(tài)const int RUNNING=1;/運行狀態(tài)const int READY=2;/就緒狀態(tài)const int PCBNUM=3;/進程個數(shù)typedef struct long pid;char pname10;int pstate;int pneedtime;int ptime;int priority;pcbs;/pcb結構class pcbnode;/隊列結點class pcbnodepubli

2、c:pcbs *pcb;pcbnode *link;pcbnode();pcbnode();int run();/運行操作int runend();/運行結束?int insertnode(pcbnode *p,pcbnode *q);/在q后插入結點pint deletenode(pcbnode *p,pcbnode *q);/刪除p結點,q為p的前驅int addnode(pcbnode *p);/增加結點;pcbnode:pcbnode()pcb=0;link=0;pcbnode:pcbnode()if(link)delete link;if(pcb)pcb-pstate=FINISH;

3、int pcbnode:run()pcb-pstate=RUNNING;+(pcb-ptime);pcb-priority-;/優(yōu)先級降低return 0;int pcbnode:runend()return (pcb-pneedtimeptime);int pcbnode:addnode(pcbnode *p)pcbnode *q;q=this;p-pcb-pstate=READY;while(q-link)q=q-link;q-link=p;return 0;int pcbnode:insertnode(pcbnode *p,pcbnode *q)p-link=q-link;q-link=

4、p;return 0;int pcbnode:deletenode(pcbnode *p,pcbnode *q)q-link=p-link;p-link=0;return 0;int randInt( int seed)/隨機函數(shù):產(chǎn)生不大于seed的正整數(shù)int r;r=rand();while(rseed|rpid=order;strcpy(pcb-pname, proc);_itoa(order,buf,10);strcat(pcb-pname,buf);pcb-pneedtime=randInt(5);/進程需要時間pcb-ptime=0;pcb-priority=randInt(10

5、);/優(yōu)先度void pprint(pcbs *pcb, int count)/打印進程狀態(tài)ofstream ofs(result.txt, ios:out|ios:app);coutidtnametstattneedtruntimetpriendl;ofsidtnametstattneedtruntimetpriendl;for(int i=0;icount;i+)coutpcbi.pidt pcbi.pnamet;ofs pcbi.pidt pcbi.pnamet;switch(pcbi.pstate) case RUNNING:coutRU;ofsRU;break;case READY:

6、coutRE;ofsRE;break;case FINISH:coutFI;ofsFI;break;couttpcbi.pneedtime;ofstpcbi.pneedtime;couttpcbi.ptime;ofstpcbi.ptime;couttpcbi.priority;ofstpcbi.priority;coutendl;ofsendl;void priority(pcbs *pcb, int pcbsnum)/可搶占的優(yōu)先調(diào)度/* 從就緒隊列中取出最優(yōu)先的進程送到運行隊列* 每運行一次,正在運行的進程優(yōu)先數(shù)減1,等待的進程優(yōu)先數(shù)加1* 如果就緒隊列中的最大優(yōu)先數(shù)進程的優(yōu)先數(shù)大于正在運

7、行的優(yōu)先數(shù),* 則運行的進程讓出cpu,排到就緒隊列的尾部,將最大優(yōu)先數(shù)的進程送進* 運行隊列。*/pcbnode running,ready,blocked;pcbnode *p,*f,*front;pcbnode *q;/*將進程表中的進程加到就緒隊列中*/for(int i=0;ipcb=pcb+i;ready.addnode(p);while(ready.link|running.link)/判斷將運行隊列中的進程是否結束if(running.link)if(running.link-runend() /運行結束?p=running.link;p-pcb-priority=0;runn

8、ing.link=0;delete p;/尋找最大的一個優(yōu)先級p=ready.link;q=p;f=&ready;front=f;if(p)int maxpri=p-pcb-priority;while(p)if(p-pcb-prioritymaxpri)maxpri=p-pcb-priority;front=f;q=p;f=p;p=p-link;/如果最大優(yōu)先級大于正在運行的優(yōu)先級則強占cpu/p=running.link;if(q)if(p)if(p-pcb-prioritypcb-priority)ready.addnode(p);running.deletenode(p, &runni

9、ng);p-pcb-pstate=READY;running.addnode(q);ready.deletenode(q,front);q-pcb-pstate=RUNNING;elserunning.addnode(q);ready.deletenode(q,front);q-pcb-pstate=RUNNING;/* * 運行進程 */p=running.link;q=&running;if(p)int r;r=p-run();/運行進程 /動態(tài)計算就緒隊列優(yōu)先級p=ready.link;while(p)(p-pcb-priority)+;p=p-link;/print proc stat

10、epprint(pcb,pcbsnum);void main(int argc, char* argv)pcbs *pcblist;/進程表remove(result.txt);pcblist=new pcbsPCBNUM;/為進程表分配空間for(int i=0; iPCBNUM; i+)newpcb(pcblist+i),i);/產(chǎn)生進程pprint(pcblist,PCBNUM);/打印進程priority(pcblist,PCBNUM);/可強占優(yōu)先法delete pcblist;/釋放進程空間用C語言編寫如下:實驗(一)一, 實驗內(nèi)容: 三,實驗內(nèi)容(任選一個)1、按優(yōu)先權調(diào)度算法實

11、現(xiàn)處理機調(diào)度的程序; PCB內(nèi)容:要求進程名/PID;要求運行時間(單位時間);優(yōu)先權;l例如:5狀態(tài):登記進程當前狀態(tài)(就緒、執(zhí)行、阻塞)PCB指針;指向本進程隊列中下個進程的PCB1、可隨時輸入若干進程,并按優(yōu)先權排序;2、從就緒隊首選進程運行:優(yōu)先權-1,要求運行時間-1,要求運行時間=0時,撤銷該進程3、重新排序,進行下輪調(diào)度;4、每次調(diào)度后,顯示各進程狀態(tài)。七,源程序清單:#include #include #include #include #define NULL 0#define FINISH 1#define RUNNING 2#define READY 3struct pc

12、bsint pid;int pstate;int pneedtime;int ptime;int priority;struct pcbs *link;pcbs;struct pcbs *running,*ready;struct pcbs *pcblist;int PCBNUM;FILE *fp;void run(struct pcbs *p)p-pstate=RUNNING;p-ptime=p-ptime+1;if(PCBNUM!=1)p-priority=p-priority-1;int runend(struct pcbs *p)if(p-ptime=p-pneedtime)p-pst

13、ate=FINISH;p-priority=NULL;return 1;elsereturn NULL;struct pcbs *deletenode(struct pcbs *p,struct pcbs *q)struct pcbs *f,*g;f=p;g=q;if(p=q)f=f-link;if(p-link) p-link=NULL;return f;else while(f-link!=g) f=f-link; f-link=g-link; if(g-link) g-link=NULL; return p;struct pcbs *addnode(struct pcbs *q,stru

14、ct pcbs *p)struct pcbs *g,*f,*d;f=q;d=p;if(f=NULL)f=d;d-pstate=READY;return f;elseg=q;while(q-link) q=q-link;d-pstate=READY;q-link=d;return g;int randInt(int seed)int r;r=rand();while(rseed|rpid); fprintf(fp,%dt,f-pid); switch(f-pstate) case RUNNING: printf(RUt); fprintf(fp,%st,RU); break; case READ

15、Y: printf(REt); fprintf(fp,%st,RE); break; case FINISH: fprintf(fp,%st,FI); printf(FIt); break; default: printf( t); fprintf(fp,%st, ); printf(%dt,f-pneedtime); fprintf(fp,%dt,f-pneedtime); printf(%dt,f-ptime); fprintf(fp,%dt,f-ptime); printf(%dn,f-priority); fprintf(fp,%dn,f-priority); printf(n); f

16、=f-link; i+;if(i=PCBNUM|i=1)fprintf(fp,%sn,=);void priority()struct pcbs *addnode();void pprint();void run();struct pcbs *deletenode();int runend();int i=0;int maxpri;struct pcbs *p,*q;struct pcbs *f;if(PCBNUM=1) running=pcblist; while(!runend(running) run(running); pprint(running); pprint(pcblist);

17、else while(ipriority=0; ready=addnode(ready,f); f-pstate=FINISH; running=deletenode(running,f); i+; q=ready; p=ready; maxpri=p-priority; while(p) if(p-priority)maxpri) maxpri=p-priority; f=p; q=p; p=p-link; p=running; if(p&q&(p-priority)priority) p-pstate=READY; q-pstate=RUNNING; ready=addnode(ready

18、,p); running=deletenode(running,p); running=addnode(running,q); ready=deletenode(ready,q); else if(!runend(q)&running=NULL) q-pstate=RUNNING; running=addnode(running,q); ready=deletenode(ready,q); p=ready; while(p) if(p-pstate!=FINISH)&(p-pstate!=RUNNING)(p-priority)+; p=p-link; if(running|ready) if

19、(ready) pprint(ready); if(running)run(running);pprint(running);p=ready; main( )int i,j=0;struct pcbs *p=NULL,*q=NULL;void priority();void pprint();struct pcbs *addnode();int randInt();if(fp=fopen(result1.txt,a)=NULL)printf(cannot open file!n);exit(1);printf(nenter pcbnum(ensure pcbnum0):);scanf(%d,&

20、PCBNUM);while(PCBNUM0) /*可隨時加入進程*/for(i=0;ilink=NULL; p-pid=i+j; p-pneedtime=randInt(10); p-ptime=0; p-priority=randInt(10); if (q=NULL) pcblist=q=p; p=NULL; else q-link=p;q=q-link;p=NULL;running=NULL;pprint(pcblist);q=pcblist;while(q) ready=addnode(ready,q); /*將進程加入后備隊列*/ q=deletenode(q,q);pprint(r

21、eady);priority();for(i=0;ilink; free(p); j=j+PCBNUM;printf(nenter pcbnum:);scanf(%d,&PCBNUM);fclose(fp); 實驗(二) 一, 實驗內(nèi)容:實現(xiàn)主存儲器的分配和回收。二, 實驗題目:在可變分區(qū)管理方式下,用最先適應算法實現(xiàn)主存空間的分配和回收。注:提示及要求: 1、自行假設主存空間大小,預設操作系統(tǒng)所占大小并構造未分分區(qū)表; 表目內(nèi)容:起址、長度、狀態(tài)(未分/空表目)2、結合實驗一,PCB增加為: PID,要求運行時間,優(yōu)先權,狀態(tài),所需主存大小,主存起始位置,PCB指針3、采用最先適應算法分配主

22、存空間;4、進程完成后,回收主存,并與相鄰空閑分區(qū)合并。三, 實驗原理:目前的內(nèi)存分區(qū)管理辦法分為兩種類型:連續(xù)分配方式和離散分配方式,其中連續(xù)分配方式又存在兩種形式:靜態(tài)分區(qū)分配和動態(tài)分區(qū)分配。這次實驗采用的是連續(xù)分配算法中的動態(tài)分區(qū)分配算法中的最佳適應算法:其原理如下:每次為作業(yè)分配內(nèi)存時,總是把能滿足要求,又是最小的空閑分區(qū)分配給作業(yè),實現(xiàn)對分配空間的合理利用。三、 程序清單:#include #include #include #include #define NULL 0#define FINISH 1#define RUNNING 2#define READY 3#define N

23、UM 50struct pcbsint pid;int pstate;int pneedtime;int ptime;int priority;int needsize;int startaddress;struct pcbs *link;pcbs;struct pcbs *running,*ready;struct pcbs *pcblist;int PCBNUM;FILE *fp;struct wordint flag;int size;int address;struct word *next,*llink;struct pcbs *space;word;void run(struct

24、pcbs *p) /*運行進程*/p-pstate=RUNNING;p-ptime=p-ptime+1;if(PCBNUM!=1)p-priority=p-priority-1;int runend(struct pcbs *p) /*判斷進程是否運行完畢*/if(p-ptime=p-pneedtime)p-pstate=FINISH;p-priority=NULL;return 1;elsereturn NULL;struct pcbs *deletenode(struct pcbs *p,struct pcbs *q) /*刪除節(jié)點*/struct pcbs *f,*g;f=p;g=q;i

25、f(p=q) /*要刪除節(jié)點是頭節(jié)點*/f=f-link;if(p-link) p-link=NULL;return f;else /*要刪除節(jié)點不是頭節(jié)點*/ while(f-link!=g) f=f-link; f-link=g-link; if(g-link) g-link=NULL; return p;struct pcbs *addnode(struct pcbs *q,struct pcbs *p) /*增加節(jié)點*/struct pcbs *g,*f,*d;f=q;d=p;if(f=NULL) /*把節(jié)點增加到隊列的隊首*/f=d;d-pstate=READY;return f;e

26、lseg=q;while(q-link) q=q-link;d-pstate=READY;q-link=d;return g;int randInt(int seed) /*產(chǎn)生不大于seed的隨機數(shù)*/int r;r=rand();while(rseed|rpid); fprintf(fp,%dt,f-pid); switch(f-pstate) case RUNNING: printf(RUt); fprintf(fp,%st,RU); break; case READY: printf(REt); fprintf(fp,%st,RE); break; case FINISH: fprin

27、tf(fp,%st,FI); printf(FIt); break; default: printf( t); fprintf(fp,%st, ); printf(%dt,f-pneedtime); fprintf(fp,%dt,f-pneedtime); printf(%dt,f-ptime); fprintf(fp,%dt,f-ptime); printf(%dt,f-priority); fprintf(fp,%dt,f-priority); printf(%dtt,f-needsize); fprintf(fp,%dtt,f-needsize); printf(%dn,f-starta

28、ddress); fprintf(fp,%dn,f-startaddress); fprintf(fp,n); printf(n); f=f-link; i+;if(i=PCBNUM|(i=1&p!=ready)fprintf(fp,%sn,-);printf(-);void priority() /*可搶占優(yōu)先調(diào)度算法*/struct pcbs *addnode();void pprint();void run();struct pcbs *deletenode();int runend();int i=0;int maxpri;struct pcbs *p,*q;struct pcbs *

29、f;if(PCBNUM=1) running=pcblist; while(!runend(running) run(running); pprint(running); pprint(pcblist);else while(ipriority=0; ready=addnode(ready,f); f-pstate=FINISH; running=deletenode(running,f); i+; q=ready; p=ready; maxpri=p-priority; while(p) /*動態(tài)尋找最大的一個優(yōu)先級*/ if(p-priority)maxpri&p-pstate!=FINI

30、SH) maxpri=p-priority; f=p; q=p; p=p-link; p=running; if(p&q&(p-priority)priority) /*如果最大優(yōu)先級大于正在運行的優(yōu)先級則強占cpu*/ p-pstate=READY; q-pstate=RUNNING; ready=addnode(ready,p); running=deletenode(running,p); running=addnode(running,q); ready=deletenode(ready,q); else if(!runend(q)&running=NULL) q-pstate=RUN

31、NING; running=addnode(running,q); ready=deletenode(ready,q); p=ready; while(p) if(p-pstate!=FINISH)&(p-pstate!=RUNNING)(p-priority)+; p=p-link; if(running|ready) if(ready) pprint(ready); if(running)run(running); /*運行進程*/pprint(running);p=ready; main( )int i,j,sum=0,k=0;struct pcbs *p=NULL,*q=NULL;st

32、ruct word *pav=NULL,*s=NULL,*f=NULL;void priority();void pprint();struct pcbs *addnode();int randInt();if(fp=fopen(result.txt,w)=NULL)printf(cannot open file!n);exit(1);printf(nenter pcbnum(ensure pcbnum0):);scanf(%d,&PCBNUM);fprintf(fp,nthe pcb number is:%dnn,PCBNUM);for(i=0;ispace=(struct pcbs *)malloc(NUM); /*請求內(nèi)存*/ if(pav-spa

溫馨提示

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

最新文檔

評論

0/150

提交評論