進程調(diào)度先來先服務時間片輪轉(zhuǎn)法優(yōu)先服務調(diào)_第1頁
進程調(diào)度先來先服務時間片輪轉(zhuǎn)法優(yōu)先服務調(diào)_第2頁
進程調(diào)度先來先服務時間片輪轉(zhuǎn)法優(yōu)先服務調(diào)_第3頁
進程調(diào)度先來先服務時間片輪轉(zhuǎn)法優(yōu)先服務調(diào)_第4頁
進程調(diào)度先來先服務時間片輪轉(zhuǎn)法優(yōu)先服務調(diào)_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、進程調(diào)度先來先效勞時間片輪轉(zhuǎn)法優(yōu)先效勞調(diào)度處理器調(diào)度免費下載C或C+/*標題:設計一:進程調(diào)度設計目的:進程治理是操作系統(tǒng)中的重要功能,用來創(chuàng)立進程、撤消進程、實現(xiàn)進程狀態(tài)轉(zhuǎn)換,它提供了在可運行的進程之間復用CPU的方法.在進程治理中,進程調(diào)度是核心,由于在采用多道程序設計的系統(tǒng)中,往往有假設干個進程同時處于就緒狀態(tài),當就緒進程個數(shù)大于處理器數(shù)目時,就必須依照某種策略決定哪些進程優(yōu)先占用處理器.本實驗模擬在單處理器情況下的進程調(diào)度,目的是加深對進程調(diào)度工作的理解,掌握不同調(diào)度算法的優(yōu)缺點.設計題目:設計一個按先來先效勞,算法時間片輪轉(zhuǎn)法,優(yōu)先數(shù)調(diào)度算法實現(xiàn)處理器調(diào)度的程序.*/*親愛的同學們,

2、大家好.歡送訪問我的百度空間,在此我向大家提供免費的資料,這是我們實習要做的.主要是由于我看到很多下載都要金幣,而我自己沒有金幣,不爽.現(xiàn)在我提供免費下載,做個好人.復制到VC+寸可能有些格式問題,稍微修改一下就OK了,程序本身不存在問題的.大三第一個學期實習的哦*/*先來先效勞:是一種最簡單的調(diào)度算法,每次調(diào)度都從后備作業(yè)或者進程當中選擇一個或者多個最先進入該隊列的作業(yè)或進程,將它們調(diào)入內(nèi)存,為它們分配資源、創(chuàng)立進程,然后放入就緒隊列.當調(diào)用FCFSB法時,系統(tǒng)為它們分配處理機,讓它們運行.該算法的優(yōu)點是比擬利于長作業(yè)進程,而缺點是不利于短作業(yè)進程.算法時間片輪轉(zhuǎn)法:系統(tǒng)將所有的就緒進程根據(jù)

3、先來先效勞的原那么排成一個隊列,每次調(diào)度時,把CPU分配給隊首進程,并令其執(zhí)行一個時間片.當執(zhí)行完時間片時,計時器就會發(fā)出中斷請求,調(diào)度程序就會停止該進程的執(zhí)行,并把它送往就緒隊列的末尾;然后再把處理機分配給就緒隊列中新的隊首進程,同時也分配時間片給它.這樣保證就緒隊列中的所有進程在一個給定的時間片當中都能夠獲得一個時間片的處理機執(zhí)行時間.而時間片的大小最好取適中的,即略大于一次典型的交互所需時間.優(yōu)先數(shù)調(diào)度算法:該方法又分成兩種算法分支,分別是非搶占式優(yōu)先權(quán)算法和搶占式優(yōu)先權(quán)調(diào)度算法.該算法被調(diào)度時,系統(tǒng)將后備隊列中選擇假設干個優(yōu)先權(quán)最高的作業(yè)裝入內(nèi)存,開始調(diào)度時,處理機就會分配給就緒隊列中

4、優(yōu)先權(quán)最高的進程.非搶占式優(yōu)先權(quán)算法中,處理機一旦把處理機分配給就緒隊列中優(yōu)先權(quán)最高的進程后,該進程就會一直執(zhí)行下去,直至完成;除非某事件發(fā)生而使該進程放棄處理機,系統(tǒng)才將處理機分配給另一個優(yōu)先權(quán)最高的進程.而搶占式優(yōu)先權(quán)算法,當系統(tǒng)把處理機分配給優(yōu)先權(quán)最高的進程時,讓它執(zhí)行,而在執(zhí)行期間,只要又出現(xiàn)另一個優(yōu)先權(quán)更高的進程,那么進程調(diào)度就會立即停止當前進程的執(zhí)行,重新將處理機分配給優(yōu)先權(quán)最高的進程.先來先效勞是使用數(shù)組,算法時間片使用指針,優(yōu)先數(shù)調(diào)度使用數(shù)組.*/*進程調(diào)度的C/C+項法實現(xiàn)*/#include<stdio.h>#include<str

5、ing.h>#include<stdlib.h>/*這是先來先效勞的程序*/structfcfs/定義先來先效勞結(jié)構(gòu)體、參數(shù)charname10;floatdaodatime;/到達時間floatfuwutime;/效勞時間floatkaishitime;/開始時間floatwanchengtime;/完成時間floatzhouztime;/周轉(zhuǎn)時間floatdaiquantime;/帶權(quán)周轉(zhuǎn)時間;fcfsa100;voidinput(fcfs*p,intN)/構(gòu)造一個輸入進程的信息的函數(shù),定義結(jié)構(gòu)體指針inti;for(i=0;i<=N

6、-1;i+)printf("輸入第個進程的名字、到達時間、效勞時間:n",i+1);scanf("%s%f%f",&,&pi.daodatime,&pi.fuwutime);/把輸入的信息保存到結(jié)構(gòu)體指針所對應的內(nèi)存中/構(gòu)造一個輸出函數(shù)voidPrint(fcfs*p,floatdaodatime,floatfuwutime,floatkaishitime,floatwanchengtime,floatzhouztime,floatdaiquantime,int

7、N)intk;printf("執(zhí)行順序:n");printf("%s",);for(k=1;k<N;k+)printf("->%s",);printf("n進程的相關信息如下:n");printf("n名字t到達t效勞t開始t完成t周轉(zhuǎn)t帶權(quán)周轉(zhuǎn)n");for(k=0;k<=N-1;k+)(printf("%st%-.2ft%-.

8、2ft%-.2ft%-.2ft%-.2ft%-.2ftn",,pk.daodatime,pk.fuwutime,pk.kaishitime,pk.wanchengtime,pk.zhouztime,pk.daiquantime);/題目中參加-.2是保存雙精度的兩位.一般f默認保存六位小數(shù)的.voidsort(fcfs*p,intN)/進程根據(jù)到達時間進行排序(for(inti=0;i<=N-1;i+)for(intj=0;j<=i;j+)if(pi.daodatime<pj.daodatime)/如果i的時間到達時間小

9、于j的到達時間,就交換(fcfstemp;/在結(jié)構(gòu)體中定義第三個變量進行交換temp=pi;pi=pj;pj=temp;核心的運行階段voiddeal(fcfs*p,floatdaodatime,floatfuwutime,floatkaishitime,floatwanchengtime,floatzhouztime,floatdaiquantime,intN)intk;for(k=0;k<=N-1;k+)if(k=0)/K=0,表示第一個進程到達pk.kaishitime=pk.daodatime;/那么開始時間=到達時間pk.wanchengtime=pk.daodatim

10、e+pk.fuwutime;/完成時間=到達時間+效勞時間elsepk.kaishitime=pk-1.wanchengtime;/下一個進程的開始時間=上一個進程的完成時間pk.wanchengtime=pk-1.wanchengtime+pk.fuwutime;/完成時間=上一個進程的完成時間+效勞時間for(k=0;k<=N-1;k+)計算周轉(zhuǎn)時間和帶權(quán)周轉(zhuǎn)時間pk.zhouztime=pk.wanchengtime-pk.daodatime;/周轉(zhuǎn)時間=完成時間-至U達時間pk.daiquantime=pk.zhouztime/pk.fuwutime;/帶權(quán)周轉(zhuǎn)時間=周轉(zhuǎn)

11、時間/效勞時間voidFCFS(fcfs*p,intN)/定義先來先效勞函數(shù)floatdaodatime=0,fuwutime=0,kaishitime=0,wanchengtime=0,zhouztime=0,daiquantime=0;/初始化變量為0sort(p,N);/聲明排序函數(shù)deal(p,daodatime,fuwutime,kaishitime,wanchengtime,zhouztime,daiquantime,N);/聲明運行函數(shù)Print(p,daodatime,fuwutime,kaishitime,wanchengtime,zhouztime,daiquantime,

12、N);/聲明輸出函數(shù)/*這是算法時間片輪轉(zhuǎn)法的代碼*/*structshijian/定義時間片的結(jié)構(gòu)體charname;/定義進程名intdaodatime;/到達時間intfuwutime;/效勞時間intshengyutime;/乘f余時間char*state;/所處狀態(tài)structshijian*next;structshijian*time()inta,i;structshijian*head,*rear,*p,*q,*t;/定義隊首、隊尾、P是隊尾指針、Q是隊首指針和執(zhí)行時間head=rear=NULL;/初始化隊首和隊尾為空printf("請輸入進程數(shù)目:&

13、;quot;);scanf("%d",&a);for(i=0;i<a;i+)p=(structshijian*)malloc(sizeof(structshijian);/初始化一個空間給進程進入printf("輸入第個進程的名字、到達時間、效勞時間:n",i+1);scanf("%s%d%d",&p->name,&p->daodatime,&p->fuwutime);

14、p->shengyutime=p->fuwutime;p->state="就緒"if(rear=NULL)當輸入結(jié)束時,把P的數(shù)據(jù)放到隊首,以便執(zhí)行下一步head=p;p->next=NULL;rear=p;else否那么執(zhí)行時間就為空,隊首變成Qt=NULL;q=head;while(q&&q->daodatime<p->daodatime)/當Q和Q的到達時間小于P的到達時間時,把執(zhí)行時間給Qt=q;q=q->n

15、ext;if(q=head)而當Q是隊首時,那么下一個隊首變成P,以便每個進程都能夠得到時間片p->next=head;head=p;elseif(t=rear)/當執(zhí)行時間片到達隊尾時(執(zhí)行完時),返回給隊首Prear->next=p;p->next=NULL;rear=p;else否那么給隊首P占用執(zhí)行時間,P執(zhí)行完后到Qt->next=p;p->next=q;returnhead;/返回隊首voidoutput(structshijian*head)定義輸出函數(shù)structshijian*p,*t,*r;intnum;

16、printf("請輸入時間片:");scanf("%d",&num);while(head!=NULL)當隊首不為空時,把P給隊首r=p=head;while(p!=NULL)/把執(zhí)行時間給隊首t=head;p->shengyutime=p->shengyutime-num;P的乘U余時間=乘!|余時間-時間片p->state="運行"/狀態(tài)變成運行態(tài)if(p->shengyutime<0)/當P運行完

17、,即剩余時間小于0時,仍然把它當做0處理p->shengyutime=0;printf("n*程序開始運行*n");printf("進程到達時間效勞時間剩余時間當前狀態(tài)n");while(t!=NULL)時間不為空時,輸出當前進程的信息,并把時間片交給下一個進程printf("%2c%8d%8d%14d%10sn",t->name,t->daodatime,t->fuwutime,t->shengyutime,t-&a

18、mp;gt;state);t=t->next;getchar();/按住回車鍵觀看if(p->shengyutime=0)/當隊首的剩余時間為0時,先把隊首改成P的下一個,然后釋放內(nèi)存,刪除隊首節(jié)點if(p=head)head=p->next;free(p);p=head;else否那么返回執(zhí)行,把隊尾的下一個指針變成P的下一個指針,隊尾的位置移動到隊首r->next=p->next;p=r->next;r=p;else否那么把隊首的位置給隊尾,把隊首的狀態(tài)顯示為“就緒狀態(tài)(r=p;p->stat

19、e="就緒"p=p->next;)這是優(yōu)先效勞調(diào)度算法的代碼/*/typedefstructPCB2(charname10;/進程名intruntime;/要求運行時間intfrist;/定義優(yōu)先數(shù)charzhuangtai;/定義狀態(tài),R為就緒,F為完成);structPCB2PCBcontrol4;/定義進程限制塊數(shù)組voidyouxian()/構(gòu)造優(yōu)先函數(shù)(inti,n;printf("請輸入進程的個數(shù):n");scanf("%d",&n);print

20、f("請輸入進程的名字、優(yōu)先權(quán)、運行時間n");printf("n");for(i=0;i<n;i+)(printf("請輸入第個進程的信息:n",i+1);scanf("%s%d%d",&PCB,&PCBcontroli.frist,&PCBcontroli.runtime);PCBcontroli.zhuangtai='R'進程初

21、始狀態(tài)均為就緒getchar();/等待回車進入下一次運行)intmax_frist_process()/確定最大優(yōu)先級進程子程序(intmax=-10;/max為最大優(yōu)先數(shù),初始化為-10inti,key;for(i=0;i<3;i+)(if(PCBcontroli.zhuangtai='r')/r表示正在運行return-1;/返回-1elseif(max<PCBcontroli.frist&&PCBcontroli.zhuangtai='R')/從就緒進程中選取優(yōu)先

22、數(shù)最大的進程(max=PCBcontroli.frist;/max存放每次循環(huán)中的最大優(yōu)先數(shù)key=i;/將進程號賦給keyif(PCBcontrolkey.zhuangtai='F')/具有最大優(yōu)先數(shù)的進程假設已運行完畢return-1;/那么返回-1elsereturnkey;/將key作為返回值返回voidshow()/顯示函數(shù)(inti;printf("n進程名優(yōu)先級運行時間當前狀態(tài)n");printf("*printf("%st%dt%dt%stn",&a

23、mp;PCB,PCBcontroli.frist,PCBcontroli.runtime,&PCBcontroli.zhuangtai);*n");for(i=0;i<3;i+)/依次顯示每個進程的名、優(yōu)先數(shù)、要求運行時間和狀態(tài)printf("n請按回車鍵進行查看");voidrun()/進程運行子程序(inti,j;intt=0;/t為運行次數(shù)for(j=0;j<3;j+)(t+=PCBcontrolj.runtime;/運行次數(shù)即為各個進程運行時間之和printf(&

24、amp;quot;n進程沒運行前,當前的狀態(tài)是:n");show();/調(diào)用show()子程序顯示運行前PCB的情況getchar();/等待回車進入下一次運行for(j=0;j<t;j+)(while(max_frist_process()!=-1)/具有最大優(yōu)先數(shù)的進程沒有運行完,讓其運行(表示其正在運PCBcontrolmax_frist_process().zhuangtai='r'/將其狀態(tài)置為r,行for(i=0;i<3;i+)(if(PCBcontroli.zhuangtai='r&am

25、p;#39;)(PCBcontroli.frist-=1;/將當前運行進程的優(yōu)先數(shù)減1PCBcontroli.runtime-;/要求運行時間減1(if(PCBcontroli.runtime=0)PCBcontroli.zhuangtai='F'/運行完那么將該進程狀態(tài)置為結(jié)束elsePCBcontroli.zhuangtai='R'/未運行完將其狀態(tài)置為就緒show();/顯示每次運行后各PCB的情況getchar();/等待回車進入下一次運行voidmain()(intN;intnumber;charTishikuang;/提示框doprintf("*n");printf("*桂林出版社版權(quán)所有歡送下載*n");printf("n");printf("*【進程調(diào)度*n");printf("*n");printf("*輸入1一先來先效勞*n");printf("*n");printf("*n");printf(&a

溫馨提示

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

評論

0/150

提交評論