進(jìn)程調(diào)度算法實(shí)驗(yàn)報(bào)告_第1頁
進(jìn)程調(diào)度算法實(shí)驗(yàn)報(bào)告_第2頁
進(jìn)程調(diào)度算法實(shí)驗(yàn)報(bào)告_第3頁
進(jìn)程調(diào)度算法實(shí)驗(yàn)報(bào)告_第4頁
進(jìn)程調(diào)度算法實(shí)驗(yàn)報(bào)告_第5頁
已閱讀5頁,還剩12頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、實(shí)驗(yàn)報(bào)告實(shí)驗(yàn)一:進(jìn)程調(diào)度算法一、實(shí)驗(yàn)?zāi)康?利用高級(jí)語言實(shí)現(xiàn)三種不同及進(jìn)程調(diào)度算法:短作業(yè)優(yōu)先算法、時(shí)間片輪轉(zhuǎn)調(diào)度算法和優(yōu)先級(jí)調(diào)度算法。2通過實(shí)驗(yàn)理解有關(guān)進(jìn)程控制塊,進(jìn)程隊(duì)列等的概念。二、實(shí)驗(yàn)原理各調(diào)度算法思想:1. 先來先服務(wù)算法(fcfs):按照進(jìn)程進(jìn)入就緒隊(duì)列的先后次序來分配cpu,一旦一個(gè)進(jìn)程占有cpu,就一直運(yùn)行下去,知道該進(jìn)程完成工作,才釋放cpu。2. 時(shí)間片輪轉(zhuǎn)算法:系統(tǒng)將所有就緒進(jìn)程按到達(dá)時(shí)間的先后次序排成一個(gè)隊(duì)列,進(jìn)程調(diào)度程序總是選擇隊(duì)列中的第一個(gè)進(jìn)程執(zhí)行,且僅能執(zhí)行一個(gè)時(shí)間片,在使用完一個(gè)時(shí)間片后,即使進(jìn)程并未完成其運(yùn)行,也必須將cpu交給下一個(gè)進(jìn)程;如果一個(gè)時(shí)間片未使用完

2、就完成了該進(jìn)程,則剩下的時(shí)間分配給下一個(gè)進(jìn)程。3. 優(yōu)先權(quán)調(diào)度算法;在創(chuàng)建進(jìn)程時(shí)就確定優(yōu)先權(quán),確定之后在整個(gè)程序運(yùn)行期間不再改變,根據(jù)優(yōu)先級(jí)排列,系統(tǒng)會(huì)把cpu分配給優(yōu)先權(quán)最高的進(jìn)程。三、 實(shí)驗(yàn)步驟、數(shù)據(jù)記錄及處理1、 算法流程抽象數(shù)據(jù)類型的定義:pcb塊結(jié)構(gòu)體類型struct pcbint name;int arrivetime; /到達(dá)時(shí)間int servicetime; /服務(wù)時(shí)間/int starttimemax; /開始時(shí)間 int finishtime; /完成/結(jié)束時(shí)間 int turntime; /周轉(zhuǎn)時(shí)間 int average_turntime; /帶權(quán)周轉(zhuǎn)時(shí)間int si

3、gn; /標(biāo)志進(jìn)程是否完成int remain_time; /剩余時(shí)間int priority; /優(yōu)先級(jí)pcbmax;主程序的流程以及各程序模塊之間的層次(調(diào)用)關(guān)系:主程序中從鍵盤得到進(jìn)程的數(shù)量,創(chuàng)建pcb,調(diào)用layout()函數(shù)顯示選擇界面。layout()函數(shù)中選擇相應(yīng)的算法并調(diào)用相關(guān)函數(shù)如:fcfs()、time_segment();、priority(),這三個(gè)函數(shù)分別實(shí)現(xiàn)先來先服務(wù)算法,時(shí)間片輪轉(zhuǎn)算法和優(yōu)先級(jí)算法,最后分別打印。程序流程圖:2、運(yùn)行結(jié)果分析:先來先服務(wù)算法:時(shí)間片輪轉(zhuǎn)算法:優(yōu)先級(jí)算法: 西安工業(yè)大學(xué)實(shí)驗(yàn)報(bào)告 四、總結(jié)與體會(huì)經(jīng)過此次實(shí)驗(yàn),我覺得具體寫代碼就是對(duì)解題

4、步驟的一個(gè)細(xì)化,也發(fā)現(xiàn)了已往課程中學(xué)習(xí)的不足,以便日后改正。附錄:源代碼#include<stdio.h>#include<malloc.h>#define max 50struct pcbint name;int arrivetime; /到達(dá)時(shí)間int servicetime; /服務(wù)時(shí)間/int starttimemax; /開始時(shí)間 int finishtime; /完成/結(jié)束時(shí)間 int turntime; /周轉(zhuǎn)時(shí)間 int average_turntime; /帶權(quán)周轉(zhuǎn)時(shí)間int sign; /標(biāo)志進(jìn)程是否完成int remain_time; /剩余時(shí)間i

5、nt priority; /優(yōu)先級(jí)pcbmax;void init(int n) /初始化for(int i=0;i<n;i+)pcbi.arrivetime=0; pcbi.servicetime=0; /pcbi.starttime=0; pcbi.finishtime=0; pcbi.turntime=0; pcbi.average_turntime=0;pcbi.remain_time=0;pcbi.sign=0;pcbi.priority=0;void creat(int n) /創(chuàng)建pcbint i;for(i=1;i<=n;i+)printf("n%d:n請(qǐng)

6、依次輸入進(jìn)程的信息n請(qǐng)輸入進(jìn)程名:",i);scanf("%d",&);printf("請(qǐng)輸入到達(dá)時(shí)間:");scanf("%d",&pcbi.arrivetime);printf("請(qǐng)輸入服務(wù)時(shí)間:");scanf("%d",&pcbi.servicetime);printf("請(qǐng)輸入優(yōu)先級(jí):");scanf("%d",&pcbi.priority);pcbi.remain_time=pcbi.

7、servicetime; /初始化剩余時(shí)間為服務(wù)時(shí)間void fcfs(int n) /先來先服務(wù)int starttime;printf("請(qǐng)輸入開始執(zhí)行時(shí)間:n");scanf("%d",&starttime);if(starttime>=pcb0.arrivetime)pcb0.finishtime=pcb0.servicetime+starttime;elsepcb0.finishtime=pcb0.finishtime+pcb0.servicetime;for(int i=1;i<n;i+)if(pcbi-1.finisht

8、ime>pcbi.arrivetime)pcbi.finishtime=pcbi-1.finishtime+pcbi.servicetime;elsepcbi.finishtime=pcbi.arrivetime+pcbi.servicetime;pcbi.turntime=pcbi.finishtime-pcbi.arrivetime;pcbi.average_turntime=pcbi.turntime/pcbi.servicetime;void print_fcfs(int n)/printf("進(jìn)程名,到達(dá)時(shí)間t服務(wù)時(shí)間t完成時(shí)間t周轉(zhuǎn)時(shí)間t周轉(zhuǎn)時(shí)間:,%st%dt%d

9、t%dt%dt%dt");printf("進(jìn)程名 到達(dá)時(shí)間 服務(wù)時(shí)間 完成時(shí)間 周轉(zhuǎn)時(shí)間 帶權(quán)周轉(zhuǎn)時(shí)間:n");for(int i=0;i<n;i+)printf("%d ,%d ,%d ,%d ,%d ,%d ", ,pcbi.arrivetime ,pcbi.servicetime ,pcbi.finishtime ,pcbi.turntime ,pcbi.average_turntime);printf("n");void time_segment(int n) /時(shí)間片輪轉(zhuǎn)int i,j;in

10、t t; /時(shí)間片int flag=1; /就緒隊(duì)列中是否還有進(jìn)程/int time=pcb0.arrivetime; /當(dāng)前的時(shí)間int time=0;int sum=0; /已經(jīng)完成的進(jìn)程數(shù)/按各進(jìn)程的arrivetime進(jìn)行升序排列for(i=1;i<=n;i+)for(j=i+1;j<=n;j+) if(pcbj.arrivetime<pcbi.arrivetime)pcb0=pcbj;pcbj=pcbi;pcbi=pcb0; /printf("輸出排序結(jié)果:n");/for(i=1;i<=n;i+) /檢查排序是否正確 /printf(&q

11、uot;%dt",);printf("輸入時(shí)間片:n");scanf("%d",&t);/printf("n運(yùn)行的進(jìn)程名 開始運(yùn)行時(shí)間 運(yùn)行時(shí)間 剩余服務(wù)時(shí)間 結(jié)束時(shí)間n");while(sum<n) flag=0; /當(dāng)前就緒隊(duì)列中沒有進(jìn)程for(i=1;i<=n;i+)if(pcbi.sign=1) continue; /表示該進(jìn)程已完成else /沒有完成的進(jìn)程需要的時(shí)間大于一個(gè)時(shí)間片if(pcbi.remain_time > t)flag=1;time=time+t;pcb

12、i.remain_time=pcbi.remain_time-t;/printf("%10d%16d%12d%12d%12dn",,time-t,t,pcbi.remain_time,time);/沒有完成的進(jìn)程需要的時(shí)間小于或等于一個(gè)時(shí)間片else if(pcbi.remain_time <= t)flag=1; /加入就緒隊(duì)列time=time+pcbi.remain_time;pcbi.finishtime=time; pcbi.sign=1;/printf("%10d%16d%12d%12d%12dn",

13、,time-pcbi.remain_time,pcbi.servicetime,0,time); pcbi.remain_time=0;if(pcbi.sign=1) sum+;/forif(flag=0&&sum<n) / 還有沒執(zhí)行的進(jìn)程,且沒進(jìn)入就就緒隊(duì)列 for(i=1;i<=n;i+)if(pcbi.sign=0) time=pcbi.arrivetime;break;/whilevoid print_time(int n)for(int i=0;i<n;i+)printf("n進(jìn)程名 服務(wù)時(shí)間 完成時(shí)間n");printf(&q

14、uot;%6d%10d%10d",pcbi+1.name,pcbi.servicetime,pcbi.finishtime);printf("n");void priority(int n)int i,j;int time = pcb1.arrivetime;/按各進(jìn)程的arrivetime進(jìn)行升序排列,最早到達(dá)的進(jìn)程先執(zhí)行for(i=1;i<=n;i+)for(j=i+1;j<=n;j+) if(pcbj.arrivetime < pcbi.arrivetime)pcb0=pcbj;pcbj=pcbi;pcbi=pcb0; /printf(&q

15、uot;輸出排序結(jié)果:n"); /for(i=1;i<=n;i+) /檢查排序是否正確 /printf("%dt",);printf("n進(jìn)程名 服務(wù)時(shí)間 優(yōu)先級(jí) 完成時(shí)間n");/先到達(dá)的進(jìn)程第一個(gè)執(zhí)行if(i=1)pcbi.finishtime=pcbi.arrivetime + pcbi.servicetime;time =pcbi.arrivetime + pcbi.servicetime;printf("%6d%10d%10d%10d",,pcbi.servicetime,

16、pcbi.priority,pcbi.finishtime);printf("n");/測(cè)試第一個(gè)進(jìn)程輸出正確/*printf("輸出第一個(gè)程序的:n");printf("名稱 到達(dá)時(shí)間 完成時(shí)間n");printf("%4d%8d%8d",,pcbi.arrivetime,pcbi.finishtime);printf("n"); */i+;/按各進(jìn)程的priority進(jìn)行降序排列,優(yōu)先級(jí)最高的進(jìn)程先執(zhí)行for(i=2;i<=n;i+)for(j=i+1;j<=n

17、;j+) if(pcbj.priority > pcbi.priority)pcb0=pcbj;pcbj=pcbi;pcbi=pcb0;for(i=2;i<=n;i+)time = time + pcbi.servicetime;pcbi.finishtime = time;printf("%6d%10d%10d%10d",,pcbi.servicetime,pcbi.priority,pcbi.finishtime);printf("n");/for/voidvoid layout(int n)int ch=0;printf("tt*調(diào)度算法*n");printf("tt1.先來先服務(wù)n");printf("tt2.時(shí)間片輪轉(zhuǎn)n");printf("tt3.優(yōu)先級(jí)n");printf(" 選擇算法:n");scanf("%10d",&ch);switch(ch)case 1: fcfs(n); print_fcfs(n); break;case 2: time_segment(n); print_time(n); break;cas

溫馨提示

  • 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)論