版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
《振作系統(tǒng)》賣臉報告
題目:作業(yè)調(diào)度算法
班級:網(wǎng)絡(luò)工程
姓名:朱錦濤
學(xué)號:E31314037
一、實(shí)驗?zāi)康?/p>
用代碼實(shí)現(xiàn)頁面調(diào)度算法,即先來先服務(wù)(FCFS調(diào)度算法
、短作業(yè)優(yōu)先算法、高響應(yīng)比優(yōu)先調(diào)度算法。通過代碼的具體實(shí)現(xiàn),
加深對算法的核心的理解。
二、實(shí)驗原理
1.先來先服務(wù)(FCFS調(diào)度算法
FCFS是最簡單的調(diào)度算法,該算法既可用于作業(yè)調(diào)度,也可用于進(jìn)
程調(diào)度。當(dāng)在作業(yè)調(diào)度中采用該算法時,系統(tǒng)將按照作業(yè)到達(dá)的先后
次序來進(jìn)行調(diào)度,或者說它是優(yōu)先考慮在系統(tǒng)中等待時間最長的作業(yè),
而不管該作業(yè)所需執(zhí)行的時間的長短,從后備作業(yè)隊列中選擇幾個最
先進(jìn)入該隊列的作業(yè),將它們調(diào)入內(nèi)存,為它們分配資源和創(chuàng)建進(jìn)程。
然后把它放入就緒隊列。
2.短作業(yè)優(yōu)先算法
SJF算法是以作業(yè)的長短來計算優(yōu)先級,作業(yè)越短,其優(yōu)先級越高。
作業(yè)的長短是以作業(yè)所要求的運(yùn)行時間來衡量的。SJF算法可以分別
用于作業(yè)和進(jìn)程調(diào)度。在把短作業(yè)優(yōu)先調(diào)度算法用于作業(yè)調(diào)度時,它
將從外存的作業(yè)后備隊列中選擇若干個估計運(yùn)行時間最短的作業(yè),優(yōu)
先將它們調(diào)入內(nèi)存。
3、高響應(yīng)比優(yōu)先調(diào)度算法
高響應(yīng)比優(yōu)先調(diào)度算法則是既考慮了作業(yè)的等待時間,又考慮了作業(yè)
的運(yùn)行時間的算法,因此既照顧了短作業(yè),又不致使長作業(yè)等待的時
間過長,從而改善了處理機(jī)調(diào)度的性能。
如果我們引入一個動態(tài)優(yōu)先級,即優(yōu)先級是可以改變的令它隨等待的
時間的延長而增加,這將使長作業(yè)的優(yōu)先級在等待期間不斷地增加,
等到足夠的時間后,必然有機(jī)會獲得處理機(jī)。該優(yōu)先級的變化規(guī)律可
以描述為:
優(yōu)先權(quán)=(等待時間+要求服務(wù)時間/要求服務(wù)時間
三、實(shí)驗內(nèi)容
源程序:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
structwork
(
intid;
intarrive_time;
intwork_time;
intwait;
floatpriority;
);
typedefstructsjf_work
(
structworks_work;〃數(shù)據(jù)域
structsjf_work*pNext;〃指針域
}NODE,*PNODE;
voidFCFSO;
voidSJFO;
voidshowmenuO;
boolIs_empty<PN0DEpHead>;
intcnt_work<PNODEpHead>;
PNODEdo_work<PNODEpHead,int*w_finish_time,inti>;
voidshow<int*w_finish_time,inti,PNODEq,int
*w_rel_time>;
voidHRRNO;
PNODEpriorit<PNODEpHead>;
voiddo_work_l<PN0DEpHead,int*w_finish_time,inti>;
intmainO
(
intchoice;〃設(shè)置選擇數(shù)
showmenuO;〃顯示菜單
scanf<n%d",&choice>;
while<choice!=0>〃選擇算法
switch<choice>
case1:
printf<"您選擇的是先來先服務(wù)算法:\n">;
FCFSO;
break;
case2:
printf<"您選擇的是短作業(yè)優(yōu)先算法:\n">;
SJFO;
break;
case3:
printf<"您選擇的是高響應(yīng)比優(yōu)先調(diào)度算法\n">;
HRRNO;
break;
default:
printf〈"請重新選擇!">;
break;
)
printf<M\n">;
printf<"下面是菜單,請繼續(xù),或者按‘0'退出">;
showmenuO;
scanf<"%d”,&choice>;
}
printf〈"感謝您使用本系統(tǒng),再見!">;
return0;
)
voidFCFSO
(
intj,k;
intw_rel_time[5];
intw_finish_time[5];
floatrel_time=0;
structworktemp;
inti;
structworkw[5];
srand<time<0?;
for<i=0;i<5;i++>
(
w[i].id=rand<>%10;
w[i].arrive_time=rand<>%10;
w[i].work_time=rand<>%10+l;
)
for<j=0;j<5;j++>
(
printf<"第%d個作業(yè)的編號是:%d\t",j+l,w[j].id>;
printf<"第%d個作業(yè)到達(dá)時
問:%d\t",j+l,w[j].arrive_time>;
printf〈”第%d個作業(yè)服務(wù)時
間:%d\t",j+l,w[j].work_time>;
printf<',\nn>;
)
for<j=l;j<5;j++>
for<k=0;k<5-j;k++>
(
if<w[k].arrive_time>wEk+1].arrive_time>
{
temp=wEk];
w[k]=w[k+l];
w[k+l]=temp;
)
)
printf<"\n">;
w_finish_time[O]=wEO].arrive_time+
w[0Lwork_time;
for<j=0;j<5;j++>
if<w_finish_time[j]<w[j+l].arrive_time>
w_finish_time[j+l]=w[j+l].arrive_time+
w[j+l].work_time;
)
else
w_finish_time[j+l]=w_finish_time[j]+
w[j+l].work_time;
}
for<j=0;j<5;j++>
w_rel_time[j]=w_finish_time[j]-
w[j].arrive_time;
for<j=0;j<5;j++>
(
rel_time+=w_rel_time[j];
)
for<j=0;j<5;j++>
(
printf<"第%d個系統(tǒng)執(zhí)行的作業(yè)到達(dá)時間:%d
j+l,w[j].arrive_time>;
printf〈"編號是:%dn,w[j].id>;
printf〈"服務(wù)時間是:%dn,w[jLwork_time>;
printf<"完成時間是:%d",w_finish_time[j]>;
printf〈"周轉(zhuǎn)時間是:%dn,w_rel_time[j]>;
printf<n\n">;
}
printf<"平均周轉(zhuǎn)時間:%f\n",rel_time/5>;
)
voidSJFO
(
intw_rel_time[10];
intw_finish_time[10];
floatrel_time=0;
srand<time<0?;
inti;
intj=0;
PNODEpHead=<PN0DE>malloc<sizeof<N0DE?;
if<NULL==pHead>
printf<"分配失敗,程序終止!\n">;
exit<-l>;
)
PNODEpTail=pHead;
pTail->pNext=NULL;〃定義該鏈表有頭結(jié)點(diǎn),且第一個節(jié)點(diǎn)
初始化為空
for<i=0;i<10;i++>
(
PNODEpNew=<PNODE>malloc<sizeof<NODE?;
if<NULL==pNew>
(
printf〈"分配失敗,程序終止!\n">;
exit<-l>;
)
pNew->s_work.id=rand<>%100;
pNew->s_work.arrive_time=rand<>%10;
pNew->s_work.work_time=rand<>%10+l;
pTail->pNext=pNew;
pNew->pNext=NULL;
pTail=pNew;
}
PNODEp=pHead->pNext;〃p指向第一個節(jié)點(diǎn)
while<NULL!=p>
(
printf<"第%d個作業(yè)的編號是:%d\t",j+1,p->s_work.id>;
printf<"第%d個作業(yè)到達(dá)時
間:%d\tn,j+1,p->s_work.arrive_time>;
printf<"第%d個作業(yè)服務(wù)時
間:%d\t",j+1,p->s_work.work_time>;
printf<l,\nn>;
p=p->pNext;
printf<',\nff>;
j++;
p=pHead->pNext;
PNODEq=p;〃p,q都指向第一個節(jié)點(diǎn)
p=p->pNext;
while<p!=NULL>
(
if<p->s_work.arrive_time<q->s_work.arrive_time>
q=P;
p=p->pNext;
)
PNODEr=pHead->pNext;〃r也指向第一個節(jié)點(diǎn)
intent=0;〃記錄所有節(jié)點(diǎn)數(shù)據(jù)域中到達(dá)時間最短且相等的
個數(shù)
while<r!=NULL>
if<r->s_work.arrive_time==q->s_work.arrive_time>
cnt++;
r=r->pNext;
)
p=pHead->pNext;
while<p!=NULL>〃在相等到達(dá)時間的作業(yè)中找服務(wù)時間最
短的作業(yè)
(
if<cnt>1>
{
if<p->s_work.arrive_time==
q->s_work.arrive_time>
if<p->s_work.work_time<q->s_work.work_time>
q=p;
p=p->pNext;
}
else
p=NULL;
}〃確定q所指作業(yè)最先到達(dá)且服務(wù)時間最短
w_finish_timeEO]=q->s_work.arrive_time+
q->s_work.work_time;
w_rel_time[O]=w_finish_time[01-
q->s_work.arrive_time;
printf<"第1個系統(tǒng)執(zhí)行的作業(yè)到達(dá)時間:%d
n,q->s_work.arrive_time>;
printf<"編號是:%dn,q->s_work.id>;
printf<"服務(wù)時間是:%d\nn,q->s_work.work_time>;
printf<"完成時間是:%d",w_finish_time[0]>;
printf〈"周轉(zhuǎn)時間是:%d\n",w_rel_time[0]>;
p=pHead;〃尋找q的前一個節(jié)點(diǎn),方便刪掉q節(jié)點(diǎn)
while<p->pNext!=q>
(
p=p->pNext;
)
p->pNext=q->pNext;
free<q>;
q=NULL;
for<i=0;i<9&&!Is_empty<pHead>;i++>
(
printf<"現(xiàn)在系統(tǒng)還剩%(1個作業(yè)!\n",cnt_work<pHead>>;
q=do_work<pHead,w_finish_time,i>;
show<w_finish_time,i,q,w_rel_time>;
p=pHead;〃尋找q的前一個節(jié)點(diǎn),方便刪掉q節(jié)點(diǎn)
while<p->pNext!=q>
(
p=p->pNext;
}
p->pNext=q->pNext;
free<q>;
q=NULL;
)
for<j=0;j<10;j++>
rel_time+=w_rel_time[j];
)
printf<"平均周轉(zhuǎn)時間:%f\n'*,rel_time/10>;
)
boolIs_empty<PN0DEpHead>〃判斷作業(yè)是否做完
(
PNODEp;
p=pHead->pNext;
intlen=0;
while<p!=NULL>
(
len++;
p=p->pNext;
)
if<len==0>
returntrue;〃當(dāng)沒有作業(yè)時,返回為真
else
returnfalse;
)
intcnt_work<PNODEpHead>〃計算當(dāng)前還剩多少作業(yè)
(
PNODEp;
p=pHead->pNext;
intlen=0;
while<p!=NULL>
(
len++;
p=p->pNext;
)
returnlen;
)
PNODEdo_work<PNODEpHead,int*w_finish_time,inti>
PNODEp,q;
intent=0;〃計數(shù)器清0,計算當(dāng)前作業(yè)完成時,系統(tǒng)中有
多少個作業(yè)已經(jīng)到達(dá)
p=pHead->pNext;
Q=P;
while<p!=NULL>
(
if<p->s_work.arrive_time<=w_finish_time[i]>
,{
ent++;
q=P;
p=p->pNext;
)
else
p=p->pNext;
}
}//q指向當(dāng)前到達(dá)時間小于剛剛完成的作業(yè),但不一定是
服務(wù)時間最短的<如果有的話》
printf<"系統(tǒng)中有%d個作業(yè)在當(dāng)前作業(yè)完成時已經(jīng)到達(dá)!
\n",cnt>;
p=pHead->pNext;
while<p!=NULL>
(
if<cnt>l>〃執(zhí)行此次判斷后,q現(xiàn)在指向所有條件都滿足
的作業(yè)(如果有的話
(
if<p->s_work.arrive_time<=w_finish_time[i]>
(
if<p->s_work.work_time<q->s_work.work_time>
(
q=p;
p=p->pNext;
)
else
p=p->pNext;
)
else
p=p->pNext;
}
else〃當(dāng)前作業(yè)完成時,沒有作業(yè)到達(dá)的情況
p=p->pNext;〃用q來接收最先到達(dá)的,用p來遍歷
while<p!=NULL>
(
if<p->s_work.arrive_time<
q->s_work.arrive_time>
q=P;
p=p->pNext;
)
w_finish_time[i+l]=q->s_work.arrive_time+
q->s_work.work_time;
)
w_finish_time[i+l]=w_finish_time[i]+
q->s_work.work_time;
returnq;
)
voidshow<int*w_finish_time,inti,PNODEq,int
*w_rel_time>
(
w_finish_timeEi+l]=w_finish_time[i]+
q->s_work.work_time;
w_rel_time[i+l]=w_finish_time[i+l]-
q->s_work.arrive_time;
printf〈"第%(1個系統(tǒng)執(zhí)行的作業(yè)到達(dá)時間:%d
”,i+2,q->s_work.arrive_time>;
printf〈"編號是:%d°,q->s_work.id>;
printf〈”服務(wù)時間是:%d\nn,q->s_work.work_time>;
printf〈”完成時間是:%dn,w_finish_time[i+l]>;
printf〈"周轉(zhuǎn)時間是:%d\n",w_rel_time[i+l]>;
)
voidshowmenuO
(
printf<***********************************\n*>;
printf<"請選擇你要執(zhí)行的命令1\n">;
printf<"l:先來先服務(wù)算法\n">;
printf<n2:短作業(yè)優(yōu)先算法\n">;
printf<"3:高響應(yīng)比優(yōu)先算法\n">;
printf<"0:退出菜單\n">;
printf<***********************************\n”>;
)
voidHRRNO
(
intw_rel_time[10];
intw_finish_time[10];
floatreltime=0:
floatpriority;〃計算優(yōu)先權(quán)
srand<time<0?;
inti;
intj=0;
PNODEpHead=<PNODE>malloc<sizeof<NODE?;
if<NULL==pHead>
(
printf<"分配失敗,程序終止!\n">;
exit<-l>;
)
PNODEpTail=pHead;
pTail->pNext=NULL;〃定義該鏈表有頭結(jié)點(diǎn),且第一個節(jié)點(diǎn)
初始化為空
for<i=0;i<10;i++>〃定義了十個進(jìn)程
{
PNODEpNew=<PNODE>malloc<sizeof<NODE?;
if<NULL==pNew>
printf<"分配失敗,程序終止!\n">;
exit<-l>;
)
pNew->s_work.id=rand<>%100;
pNew->s_work.arrive_time=rand<>%10;
pNew->s_work.work_time=rand<>%10+l;
pTail->pNext=pNew;
pNew->pNext=NULL;
pTail=pNew;
)
PNODEp=pHead->pNext;〃p指向第一個節(jié)點(diǎn)
while<NULL!=p>
(
printf〈"第%d個作業(yè)的編號是:%d\tn,j+1,p->s_work.id>;
printf<"第%d個作業(yè)到達(dá)時
間:%d\t",j+1,p->s_work.arrive_time>;
printf〈"第刎個作業(yè)服務(wù)時
間:%d\t",j+l,p->s_work.work_time>;
printf<',\nn>;
p=p->pNext;
printf<w\n">;
j++;
)
p=pHead->pNext;
PNODEq=p;〃p,q都指向第一個節(jié)點(diǎn)
p=p->pNext;
while<p!=NULL>
(
if<p->s_work.arrive_time<q->s_work.arrive_time>
q=P;
p=p->pNext;
)
PNODEr=pHead->pNext;〃r也指向第一個節(jié)點(diǎn)
intent=0;〃記錄所有節(jié)點(diǎn)數(shù)據(jù)域中到達(dá)時間最短且相等的
個數(shù)
while<r!=NULL>
(
if<r->s_work.arrive_time==q->s_work.arrive_time>
cnt++;
r=r->pNext;
)
p=pHead->pNext;
while<p!=NULL>〃在相等到達(dá)時間的作業(yè)中找服務(wù)時間最
短的作業(yè)
(
if<cnt>1>
(
if<p->s_work.arrive_time=-
q->s_work.arrive_time>
if<p->s_work.work_time<q->s_work.work_time>
q=P;
p=p->pNext;
)
else
p=NULL;
}〃確定q所指作業(yè)最先到達(dá)且服務(wù)時間最短
w_finish_time[0]=q->s_work.arrive_time+
q->s_work.work_time;
w_rel_time[O]=w_finish_time[01-
q->s_work.arrive_time;
printf〈"第1個系統(tǒng)執(zhí)行的作業(yè)到達(dá)時間:%d
",q->s_work.arrive_time>;
printf<"編號是:%dn,q->s_work.id>;
printf<"服務(wù)時間是:%d\n",q->s_work.work_time>;
printf〈”完成時間是:%dn,w_finish_time[0]>;
printf<"周轉(zhuǎn)時間是:%d\n",w_rel_time[0]>;
p=pHead;〃尋找q的前一個節(jié)點(diǎn),方便刪掉q節(jié)點(diǎn)
while<p->pNext!=q>
p=p->pNext;
p->pNext=q->pNext;
free<q>;
q=NULL;〃已經(jīng)找到并執(zhí)行第一個進(jìn)程,執(zhí)行完之后又將其
刪除了
for<i=0;i<9&&!Is_empty<pHead>;i++>
(
printf<"現(xiàn)在系統(tǒng)還剩%(1個作業(yè)!\n",cnt_work<pHead>>;
do_work_l<pHead,w_finish_time,i>;
q=priorit<pHead>;
show<w_finish_time,i,q,w_rel_time>;
p=pHead;〃尋找q的前一個節(jié)點(diǎn),方便刪掉q節(jié)點(diǎn)
while<p->pNext!=q>
p=p->pNext;
p->pNext=q->pNext;
free<q>;
q=NULL;
)
for<j=0;j<10;j++>
(
rel_time+=w_rel_time[j];
)
printf<"平均周轉(zhuǎn)時間:%f\n",rel_time/10>;
)
voiddo_work_l<PN0DEpHead,int*w_finish_time,inti>
(
PNODEp,q;
intent=0;〃計數(shù)器清0,計算當(dāng)前作業(yè)完成時,系統(tǒng)中有
多少個作業(yè)已經(jīng)到達(dá)
p=pHead->pNext;
q=P;
while<p!=NULL>
if<p->s_work.arrive_time<=w_finish_time[i]>
(
ent++;
q=P;
p=p->pNext;
)
else
(
p=p->pNext;
)
}〃q指向當(dāng)前到達(dá)時間小于剛剛完成的作業(yè),但有可能有
另外幾個進(jìn)程也已經(jīng)到達(dá)了,所以要進(jìn)行下面的判斷
printf<"系統(tǒng)中有%d個作業(yè)在當(dāng)前作業(yè)完成時已經(jīng)到達(dá)!
\nB,cnt>;
p=pHead->pNext;
while<p!=NULL>
if<cnt>l>〃說明此時有好幾個都已經(jīng)到達(dá)了
(
if<p->s_work.arrive_time<=w_finish_time[i]>
{
p->s_work.wait=w_finish_time[i]-
p->s_work.arrive_time;
p=p->pNext;
)
else
(
p->s_work.wait=0;
p=p->pNext;
)
)
else〃當(dāng)前作業(yè)完成時,沒有作業(yè)到達(dá)的情況
p=p->pNext;〃此時p指向第一個節(jié)點(diǎn),q
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年舞蹈教師教學(xué)能力提升考試題目
- 2026年電氣自動化控制考試題庫解析
- 2026年高校專業(yè)入學(xué)面試預(yù)測模擬問題集
- 2026年電氣工程師專業(yè)認(rèn)證題庫試題
- 2026年AI倫理道德挑戰(zhàn)題目
- 2026年求職的法律實(shí)務(wù)基礎(chǔ)題集
- 2026年AI在災(zāi)害預(yù)警與應(yīng)急管理中的應(yīng)用測試題
- 2026年鋼琴演奏技能考核題
- 2026年外語專業(yè)八級日語詞匯及語法題集
- 2026年社會調(diào)查與研究方法專業(yè)知識題目
- 尋脈山河:中國主要河流與湖泊的空間認(rèn)知與生態(tài)理解-八年級地理教學(xué)設(shè)計
- 達(dá)人精準(zhǔn)運(yùn)營方案
- 四川省涼山州2025-2026學(xué)年上學(xué)期期末考試七年級數(shù)學(xué)試題(含答案)
- 語文試題-汕頭市2025-2026學(xué)年度普通高中畢業(yè)班教學(xué)質(zhì)量監(jiān)測(含解析)
- 水利水電工程單元工程施工質(zhì)量驗收標(biāo)準(zhǔn)(2025版)解讀課件
- 水利工程項目設(shè)計審批流程與管理要點(diǎn)
- 湖北省2026屆高三上學(xué)期元月調(diào)考政治+答案
- 2026年浙江高考英語考試真題及答案
- 垃圾填埋場排水施工方案
- 辦公室頸椎保養(yǎng)課件
- (16)普通高中體育與健康課程標(biāo)準(zhǔn)日常修訂版(2017年版2025年修訂)
評論
0/150
提交評論