《廣東工業(yè)大學(xué)操作系統(tǒng)-實驗報告-4份全.doc》由會員分享,可在線閱讀,更多相關(guān)《廣東工業(yè)大學(xué)操作系統(tǒng)-實驗報告-4份全.doc(41頁珍藏版)》請在裝配圖網(wǎng)上搜索。
操作系統(tǒng)實驗報告
學(xué)生學(xué)院____ 計算機(jī)學(xué)院______
專業(yè)班級_10級計算機(jī)科學(xué)與技術(shù)5班
學(xué) 號__3210006071__________
學(xué)生姓名___陳丹飛_____________
指導(dǎo)教師________孫為軍_______
2013年 1 月 10 日
目錄
1 實驗一 進(jìn)程調(diào)度………………………………………………………………1
2 實驗二 作業(yè)調(diào)度………………………………………………………………
3 實驗三 可變式分區(qū)分配………………………………………………………
4 實驗四 簡單文件系統(tǒng)…………………………………………………………
試驗一 進(jìn)程調(diào)度
一、實驗?zāi)康?
編寫和調(diào)試一個進(jìn)程調(diào)度程序,以加深對進(jìn)程的概念及進(jìn)程調(diào)度算法的理解。
二、實驗內(nèi)容:以兩種典型算法為例說明實現(xiàn)的算法
(一)、最高優(yōu)先數(shù)優(yōu)先的調(diào)度算法
1、實驗原理
進(jìn)程調(diào)度算法:采用最高優(yōu)先數(shù)優(yōu)先的調(diào)度算法(即把處理機(jī)分配給優(yōu)先數(shù)最高的進(jìn)程)和先來先服務(wù)算法。
每個進(jìn)程有一個進(jìn)程控制塊(PCB)表示。進(jìn)程控制塊可以包含如下信息:進(jìn)程名、優(yōu)先數(shù)、到達(dá)時間、需要運(yùn)行時間、已用CPU時間、進(jìn)程狀態(tài)等等。
進(jìn)程的優(yōu)先數(shù)及需要的運(yùn)行時間可以事先人為地指定(也可以由隨機(jī)數(shù)產(chǎn)生)。進(jìn)程的到達(dá)時間為進(jìn)程輸入的時間。
進(jìn)程的運(yùn)行時間以時間片為單位進(jìn)行計算。
每個進(jìn)程的狀態(tài)可以是就緒 W(Wait)、運(yùn)行R(Run)、或完成F(Finish)三種狀態(tài)之一。
就緒進(jìn)程獲得CPU后都只能運(yùn)行一個時間片。用已占用CPU時間加1來表示。
如果運(yùn)行一個時間片后,進(jìn)程的已占用 CPU時間已達(dá)到所需要的運(yùn)行時間,則撤消該進(jìn)程,如果運(yùn)行一個時間片后進(jìn)程的已占用CPU時間還未達(dá)所需要的運(yùn)行時間,也就是進(jìn)程還需要繼續(xù)運(yùn)行,此時應(yīng)將進(jìn)程的優(yōu)先數(shù)減1(即降低一級),然后把它插入就緒隊列等待CPU。
每進(jìn)行一次調(diào)度程序都打印一次運(yùn)行進(jìn)程、就緒隊列、以及各個進(jìn)程的 PCB,以便進(jìn)行檢查。
重復(fù)以上過程,直到所有進(jìn)程都完成為止。
2、源代碼:
#include "stdio.h"
#include
#include
#define getpch(type) (type*)malloc(sizeof(type))
#define NULL 0
struct pcb { /* 定義進(jìn)程控制塊PCB */
char name[10]; /*定義進(jìn)程名稱*/
char state; /*進(jìn)程狀態(tài)*/
int super; /*優(yōu)先數(shù)*/
int ntime; /*需要運(yùn)行的時間*/
int rtime; /*已占用的CPU時間*/
struct pcb* link;
}*ready=NULL,*p;
typedef struct pcb PCB; /*pcb表*/
sort() /* 建立對進(jìn)程進(jìn)行優(yōu)先級排列函數(shù)*/
{ PCB *first, *second;
int insert=0;
if((ready==NULL)||((p->super)>(ready->super))) /*優(yōu)先級最大者,插入隊首*/
{ p->link=ready;
ready=p;
}
else /* 進(jìn)程比較優(yōu)先級,插入適當(dāng)?shù)奈恢弥?/
{ first=ready;
second=first->link;
while(second!=NULL)
{ if((p->super)>(second->super)) /*若插入進(jìn)程比當(dāng)前進(jìn)程優(yōu)先數(shù)大,*/
{ /*插入到當(dāng)前進(jìn)程前面*/
p->link=second;
first->link=p;
second=NULL;
insert=1;
}
else /* 插入進(jìn)程優(yōu)先數(shù)最低,則插入到隊尾*/
{ first=first->link;
second=second->link;
}
}
if(insert==0) first->link=p;
}
}
input() /* 建立進(jìn)程控制塊函數(shù)*/
{ int i,num;
clrscr(); /*清屏*/
printf("\n 請輸入進(jìn)程號?");
scanf("%d",&num);
for(i=0;iname);
printf("\n 輸入進(jìn)程優(yōu)先數(shù):");
scanf("%d",&p->super);
printf("\n 輸入進(jìn)程運(yùn)行時間:");
scanf("%d",&p->ntime);
printf("\n");
p->rtime=0;p->state=w;
p->link=NULL;
sort(); /* 調(diào)用sort函數(shù)*/
}
}
int space()
{ int l=0; PCB* pr=ready;
while(pr!=NULL)
{ l++;
pr=pr->link;
}
return(l);
}
disp(PCB * pr) /*建立進(jìn)程顯示函數(shù),用于顯示當(dāng)前進(jìn)程*/
{ printf("\n qname \t state \t super \t ndtime \t runtime \n");
printf("|%s\t",pr->name);
printf("|%c\t",pr->state);
printf("|%d\t",pr->super);
printf("|%d\t",pr->ntime);
printf("|%d\t",pr->rtime);
printf("\n");
}
check() /* 建立進(jìn)程查看函數(shù),檢查等待隊列的進(jìn)程是否進(jìn)入就緒隊列*/
{ PCB* pr;
printf("\n **** 當(dāng)前正在運(yùn)行的進(jìn)程是:%s",p->name); /*顯示當(dāng)前運(yùn)行進(jìn)程*/
disp(p);
pr=ready;
printf("\n ****當(dāng)前就緒隊列狀態(tài)為:\n"); /*顯示就緒隊列狀態(tài)*/
while(pr!=NULL)
{ disp(pr);
pr=pr->link;
}
}
destroy() /*建立進(jìn)程撤消函數(shù)(進(jìn)程運(yùn)行結(jié)束,撤消進(jìn)程)*/
{ printf("\n 進(jìn)程 [%s] 已完成.\n",p->name);
free(p);
}
running() /* 建立進(jìn)程就緒函數(shù)(進(jìn)程運(yùn)行時間到,置就緒狀態(tài)*/
{ (p->rtime)++;
if(p->rtime==p->ntime)
destroy(); /* 調(diào)用destroy函數(shù)*/
else
{ (p->super)--;
p->state=w;
sort(); /*調(diào)用sort函數(shù)*/
}
}
main() /*主函數(shù)*/
{ int len, h=0;
char ch;
input();
len=space();
while((len!=0)&&(ready!=NULL))
{ ch=getchar();
h++;
printf("\n The execute number:%d \n",h);
p=ready;
ready=p->link;
p->link=NULL;
p->state=R;
check();
running();
printf("\n 按任一鍵繼續(xù)......");
ch=getchar();
}
printf("\n\n 進(jìn)程已經(jīng)完成.\n");
ch=getchar();
}
3、運(yùn)行結(jié)果:
請輸入進(jìn)程號?5
進(jìn)程號No.0:
輸入進(jìn)程名:A
輸入進(jìn)程優(yōu)先數(shù):2
輸入進(jìn)程運(yùn)行時間:1
進(jìn)程號No.1:
輸入進(jìn)程名:B
輸入進(jìn)程優(yōu)先數(shù):3
輸入進(jìn)程運(yùn)行時間:1
進(jìn)程號No.2:
輸入進(jìn)程名:C
輸入進(jìn)程優(yōu)先數(shù):1
輸入進(jìn)程運(yùn)行時間:1
進(jìn)程號No.3:
輸入進(jìn)程名:D
輸入進(jìn)程優(yōu)先數(shù):4
輸入進(jìn)程運(yùn)行時間:1
進(jìn)程號No.4:
輸入進(jìn)程名:E
輸入進(jìn)程優(yōu)先數(shù):5
輸入進(jìn)程運(yùn)行時間:1
The execute number:1
****當(dāng)前正在運(yùn)行的進(jìn)程是:E
Qname state super ndtime runtime
E R 5 1 0
****當(dāng)前就緒隊列狀態(tài)為:
Qname state super ndtime runtime
D w 4 1 0
B w 3 1 0
A w 2 1 0
C w 1 1 0
進(jìn)程[E]已完成
按任一鍵繼續(xù)……
The execute number:2
****當(dāng)前正在運(yùn)行的進(jìn)程是:D
Qname state super ndtime runtime
D R 4 1 0
****當(dāng)前就緒隊列狀態(tài)為:
Qname state super ndtime runtime
B w 3 1 0
A w 2 1 0
C w 1 1 0
進(jìn)程[D]已完成
按任一鍵繼續(xù)……
The execute number:3
****當(dāng)前正在運(yùn)行的進(jìn)程是:B
Qname state super ndtime runtime
B R 3 1 0
****當(dāng)前就緒隊列狀態(tài)為:
Qname state super ndtime runtime
A w 2 1 0
C w 1 1 0
進(jìn)程[B]已完成
按任一鍵繼續(xù)……
The execute number:4
****當(dāng)前正在運(yùn)行的進(jìn)程是:A
Qname state super ndtime runtime
A R 2 1 0
****當(dāng)前就緒隊列狀態(tài)為:
Qname state super ndtime runtime
C w 1 1 0
進(jìn)程[A]已完成
按任一鍵繼續(xù)……
The execute number:5
****當(dāng)前正在運(yùn)行的進(jìn)程是:c
Qname state super ndtime runtime
c R 1 1 0
****當(dāng)前就緒隊列狀態(tài)為:
進(jìn)程[C]已完成
按任一鍵繼續(xù)……
進(jìn)程已經(jīng)完成
(二)、簡單輪轉(zhuǎn)法
1、實驗原理
在分時系統(tǒng)中,都毫無例外采用時間片輪轉(zhuǎn)法。在一種簡單的輪轉(zhuǎn)法中,系統(tǒng)將所有就緒進(jìn)程按FIFO規(guī)則排成一個隊列,把CPU分配給隊首進(jìn)程,并規(guī)定它執(zhí)行一給定的時間如100ms,稱此時間間隔為時間片。當(dāng)時間片完成時,系統(tǒng)產(chǎn)生一個時鐘中斷,剝奪該進(jìn)程的執(zhí)行,將它送至就緒隊列的末尾,并把處理機(jī)分配給就緒隊列的新隊首進(jìn)程,同樣也讓它執(zhí)行一個時間片。這樣,就緒隊列中的所有進(jìn)程均可獲得一個時間片的處理機(jī)而運(yùn)行。就緒隊列中的進(jìn)程在依次執(zhí)行時,可能發(fā)生以下三種情況:(1)進(jìn)程未用完一個時間片就結(jié)束,這時系統(tǒng)應(yīng)提前調(diào)度;(2)進(jìn)程在執(zhí)行過程中提出I/O請求而阻塞,系統(tǒng)應(yīng)將它放入相應(yīng)的阻塞隊列并引起調(diào)度;(3)進(jìn)程完成一個時間片后尚未完成,系統(tǒng)應(yīng)將它重新放到就緒隊列的末尾,等待下次執(zhí)行。由于在分時系統(tǒng)中,鍵盤命令的執(zhí)行時間較短,大多能在一個時間片內(nèi)執(zhí)行完畢,因此分時系統(tǒng)的實際響應(yīng)時間將比Nq(N是同時性用戶數(shù),q是時間片大小)小。
2、源代碼:
#include
/*定義一個pcb的結(jié)構(gòu)體*/
struct pcb
{ char name; /*進(jìn)程名*/
int time; /*進(jìn)程執(zhí)行時間*/
};
void main()
{ int n,i,j,flag=1;
struct pcb a[100]; /*最多可以有100個進(jìn)程*/
printf("輸入進(jìn)程 個數(shù):");
scanf("%d",&n);
getchar();/*接收回車*/
for(i=0;i0) /*若進(jìn)程數(shù)為空,結(jié)束程序*/
{ if(a[i].time!=0) /*就緒隊列是否為空*/
{ printf("%c",a[i].name); /*進(jìn)程執(zhí)行一次,打印出該進(jìn)程*/
a[i].time--; /*使該進(jìn)程占用的時間片減1*/
}
for(j=0;jname,&p->ts,&p->ntime);
p->state=W;
p->link=NULL;
if(head==NULL) head=q=p;
else{
q->link=p;
q=p;
} }}
void print(JCB *pr,int m){
JCB *p;
printf("\ntime=%d",time);
if(m==3){ printf("\n作業(yè)名\t狀態(tài)\t到達(dá)時間\t服務(wù)時間\t優(yōu)先權(quán)\t\t完成時間\t周轉(zhuǎn)時間\t帶權(quán)周轉(zhuǎn)時間\n");
printf("%s\t%c\t%d\t%d\t%4.2f\t%d\t%4.2f\t%4.2f\n",
pr->name,pr->state,pr->ts,pr->ntime,pr->super,pr->tc,pr->ti,pr->wi);
}
else { printf("\n作業(yè)名 狀態(tài) 到達(dá)時間 服務(wù)時間 完成時間 周轉(zhuǎn)時間 帶權(quán)周轉(zhuǎn)時間\n");
printf("%s\t%c\t%d\t%d\t%d\t%4.2f\t%4.2f\n",
pr->name,pr->state,pr->ts,pr->ntime,pr->tc,pr->ti,pr->wi);
}
p=head;
do{ if(p->state==W)
if(m==3){ printf("%s\t%c\t%d\t%d\t%4.2f\n",
p->name,p->state,p->ts,p->ntime,p->super);
}
else{ printf("%s\t%c\t%d\t%d\n",
p->name,p->state,p->ts,p->ntime);
}
p=p->link;
}while(p!=NULL);
p=head;
do{ if(p->state==F)
if(m==3){
printf("%s\t%c\t%d\t%d\t%4.2f\t%d\t%4.2f\t%4.2f\n",
p->name,p->state,p->ts,p->ntime,p->super,p->tc,p->ti,p->wi);
}
else{printf("%s\t%c\t%d\t%d\t%d\t%4.2f\t%4.2f\n",
p->name,p->state,p->ts,p->ntime,p->tc,p->ti,p->wi);
}
p=p->link;
}while(p!=NULL);
}
void last(){eti/=n;ewi/=n;
printf("\n平均周轉(zhuǎn)時間=%7.3f\n平均帶權(quán)周轉(zhuǎn)時間=%7.3f\n",eti,ewi);
}
super(){JCB *padv;
padv=head;
do{ if(padv->state==W&&padv->ts<=time)
padv->super=(float)(time-padv->ts+padv->ntime)/padv->ntime;
padv=padv->link;
}while(padv!=NULL);
}
void hrn(m){JCB *min;
int i,iden;
for(i=0;istate==W&&p->ts<=time)
if(iden){ min=p;iden=0;}
else if(p->super>min->super) min=p;
p=p->link;
}while(p!=NULL);
if(iden) {i--;time++;printf("\ntime=%d",time);
if(time>1000){printf("\nruntime is too long...error...");getch();}
}
else{ running(min,m); }
}}
void sjf(int m){
JCB *min;
int i,iden;
for(i=0;istate==W&&p->ts<=time)
if(iden){ min=p;iden=0; }
else if(p->ntimentime) min=p;
p=p->link;
}while(p!=NULL) ;
if(iden) {i--;printf("\ntime=%d",time);time++;
if(time>100){printf("\nruntime is too long...error");getch();}
}
else{running(min,m);}
}}
fcfs(int m){ int i,iden;
for(i=0;istate==W&&p->ts<=time) iden=0;
if(iden)p=p->link;
}while(p!=NULL&&iden) ;
if(iden) { i--;printf("\ntime=%d",time);time++;
if(time>100){printf("\nruntime is too long...error");getch();}
}
else{ running(p,m); }
}}
running(JCB *p,int m){
p->tb=time;p->state=R;
p->tc=p->tb+p->ntime;
p->ti=(float)(p->tc-p->ts);
p->wi=(float)(p->ti/p->ntime);
eti+=p->ti;
ewi+=p->wi;
print(p,m);
time+=p->ntime;
p->state=F;
printf("\n作業(yè)%s已經(jīng)完成!\npress any key to continue...\n",p->name);
getch();
}
void runjcb(int m){ printf("\n\n作業(yè)開始運(yùn)行");
switch(m){case 1:fcfs(m);break;
case 2:sjf(m);break;
case 3:hrn(m);break;
default:printf("\n運(yùn)行錯誤!\n");exit();
}}
start(){ int m;
char str[100]="\n選擇調(diào)度算法:\n1.先來先服務(wù)FCFS\n2.最短作業(yè)優(yōu)先SJF\n3.響應(yīng)比高者優(yōu)先HRN\n" ;
printf("%s",str);
m=getch()-48;
inital();
if(1<=m&&m<=3) runjcb(m);
else { printf("\n選擇錯誤,請重新選擇!\n");
start();
}
last();
}
main(){start();
printf("\n所有作業(yè)完成!");
getch();
}
運(yùn)行結(jié)果:
1、選擇先來先服務(wù)FCFS
選擇調(diào)度算法:
1.先來先服務(wù)FCFS
2.最短作業(yè)優(yōu)先SJF
3.響應(yīng)比高者優(yōu)先HRN
輸入作業(yè)數(shù):
5
輸入:
作業(yè)名 到達(dá)時間 服務(wù)時間
A 0 4
B 1 3
C 2 5
D 3 2
E 4 4
作業(yè)開始運(yùn)行
Time=0
作業(yè)名 狀態(tài) 到達(dá)時間 服務(wù)時間 完成時間 周轉(zhuǎn)時間 帶權(quán)周轉(zhuǎn)時間
A R 0 4 4 4.00 1.00
B W 1 3
C W 2 5
D W 3 2
E W 4 4
作業(yè)A已經(jīng)完成
Press any key to continue…
Time=4
作業(yè)名 狀態(tài) 到達(dá)時間 服務(wù)時間 完成時間 周轉(zhuǎn)時間 帶權(quán)周轉(zhuǎn)時間
B R 1 3 7 6.00 2.00
C W 2 5
D W 3 2
E W 4 4
A F 0 4 4 4.00 1.00
作業(yè)B已經(jīng)完成
Press any key to continue…
Time=7
作業(yè)名 狀態(tài) 到達(dá)時間 服務(wù)時間 完成時間 周轉(zhuǎn)時間 帶權(quán)周轉(zhuǎn)時間
C R 2 5 12 10.00 2.00
D W 3 2
E W 4 4
A F 0 4 4 4.00 1.00
B F 1 3 7 6.00 2.00
作業(yè)C已經(jīng)完成
Press any key to continue…
Time=12
作業(yè)名 狀態(tài) 到達(dá)時間 服務(wù)時間 完成時間 周轉(zhuǎn)時間 帶權(quán)周轉(zhuǎn)時間
D R 3 2 14 11.00 5.50
E W 4 4
A F 0 4 4 4.00 1.00
B F 1 3 7 6.00 2.00
C F 2 5 12 10.00 2.00
作業(yè)D已經(jīng)完成
Press any key to continue…
Time=14
作業(yè)名 狀態(tài) 到達(dá)時間 服務(wù)時間 完成時間 周轉(zhuǎn)時間 帶權(quán)周轉(zhuǎn)時間
E R 4 4 18 14.00 3.50
A F 0 4 4 4.00 1.00
B F 1 3 7 6.00 2.00
C F 2 5 12 10.00 2.00
D F 3 2 14 11.00 5.50
作業(yè)E已經(jīng)完成
Press any key to continue…
平均周轉(zhuǎn)時間=9.000
平均帶權(quán)周轉(zhuǎn)時間=2.800
所有作業(yè)完成!
2、選擇最短作業(yè)優(yōu)先SJF(簡要過程)
… …
作業(yè)開始運(yùn)行
Time=0
作業(yè)名 狀態(tài) 到達(dá)時間 服務(wù)時間 完成時間 周轉(zhuǎn)時間 帶權(quán)周轉(zhuǎn)時間
A R 0 4 4 4.00 1.00
B W 1 3
C W 2 5
D W 3 2
E W 4 4
作業(yè)A已經(jīng)完成
Press any key to continue…
Time=4
作業(yè)名 狀態(tài) 到達(dá)時間 服務(wù)時間 完成時間 周轉(zhuǎn)時間 帶權(quán)周轉(zhuǎn)時間
D R 3 2 6 3.00 1.50
B W 1 3
C W 2 5
E W 4 4
A F 0 4 4 4.00 1.00
作業(yè)D已經(jīng)完成
Press any key to continue…
Time=6
作業(yè)名 狀態(tài) 到達(dá)時間 服務(wù)時間 完成時間 周轉(zhuǎn)時間 帶權(quán)周轉(zhuǎn)時間
B r 1 3 9 8.00 2.67
C W 2 5
E W 4 4
A F 0 4 4 4.00 1.00
D F 3 2 6 3.00 1.50
作業(yè)B已經(jīng)完成
Press any key to continue…
Time=9
作業(yè)名 狀態(tài) 到達(dá)時間 服務(wù)時間 完成時間 周轉(zhuǎn)時間 帶權(quán)周轉(zhuǎn)時間
E R 4 4 13 9.00 2.25
C W 2 5
A F 0 4 4 4.00 1.00
B F 1 3 9 8.00 2.67
D F 3 2 6 3.00 1.50
作業(yè)E已經(jīng)完成
Press any key to continue…
Time=13
作業(yè)名 狀態(tài) 到達(dá)時間 服務(wù)時間 完成時間 周轉(zhuǎn)時間 帶權(quán)周轉(zhuǎn)時間
C R 2 5 18 16.00 3.20
A F 0 4 4 4.00 1.00
B F 1 3 9 8.00 2.67
D F 3 2 6 3.00 1.50
E F 4 4 13 9.00 2.25
作業(yè)C已經(jīng)完成
Press any key to continue…
平均周轉(zhuǎn)時間=8.000
平均帶權(quán)周轉(zhuǎn)時間=2.123
所有作業(yè)完成!
3、響應(yīng)比高者優(yōu)先HRN(簡要過程)
… …
作業(yè)開始運(yùn)行
Time=0
作業(yè)名 狀態(tài) 到達(dá)時間 服務(wù)時間 優(yōu)先權(quán) 完成時間 周轉(zhuǎn)時間 帶權(quán)周轉(zhuǎn)時間
A R 0 4 1.00 4 4.00 1.00
B W 1 3 -0.00
C W 2 5
D W 3 2
E W 4 4
作業(yè)A已經(jīng)完成
Press any key to continue…
Time=4
作業(yè)名 狀態(tài) 到達(dá)時間 服務(wù)時間 優(yōu)先權(quán) 完成時間 周轉(zhuǎn)時間 帶權(quán)周轉(zhuǎn)時間
B R 1 3 2.00 7 6.00 2.00
C W 2 5
D W 3 2
E W 4 4
A F 0 4 1.00 4 4.00 1.00
作業(yè)B已經(jīng)完成
Press any key to continue…
Time=7
作業(yè)名 狀態(tài) 到達(dá)時間 服務(wù)時間 優(yōu)先權(quán) 完成時間 周轉(zhuǎn)時間 帶權(quán)周轉(zhuǎn)時間
D R 3 2 3.00 9 6.00 3.00
C W 2 5
E W 4 4
A F 0 4 1.00 4 4.00 1.00
B F 1 3 2.00 7 6.00 2.00
作業(yè)D已經(jīng)完成
Press any key to continue…
Time=9
作業(yè)名 狀態(tài) 到達(dá)時間 服務(wù)時間 優(yōu)先權(quán) 完成時間 周轉(zhuǎn)時間 帶權(quán)周轉(zhuǎn)時間
C R 2 5 2.40 14 12.00 2.40
E W 4 4 2.25
A F 0 4 1.00 4 4.00 1.00
B F 1 3 2.00 7 6.00 2.00
D F 3 2 3.00 9 6.00 3.00
作業(yè)C已經(jīng)完成
Press any key to continue…
Time=14
作業(yè)名 狀態(tài) 到達(dá)時間 服務(wù)時間 優(yōu)先權(quán) 完成時間 周轉(zhuǎn)時間 帶權(quán)周轉(zhuǎn)時間
E R 4 4 3.25 18 14.00 3.50
A F 0 4 1.00 4 4.00 1.00
B F 1 3 2.00 7 6.00 2.00
C F 2 5 2.40 14 12.00 2.40
D F 3 2 3.00 9 6.00 3.00
作業(yè)E已經(jīng)完成
Press any key to continue…
平均周轉(zhuǎn)時間=8.400
平均帶權(quán)周轉(zhuǎn)時間=2.380
所有作業(yè)完成!
(二)、編寫并調(diào)度一個多道程序系統(tǒng)的作業(yè)調(diào)度模擬程序。
作業(yè)調(diào)度算法:采用基于先來先服務(wù)的調(diào)度算法??梢詤⒖颊n本中的方法進(jìn)行設(shè)計。
對于多道程序系統(tǒng),要假定系統(tǒng)中具有的各種資源及數(shù)量、調(diào)度作業(yè)時必須考慮到每個作業(yè)的資源要求。
在單道批處理系統(tǒng)中,作業(yè)一投入運(yùn)行,它就占有計算機(jī)的一切資源直到作業(yè)完成為止,因此調(diào)度作業(yè)時不必考慮它所需要的資源是否得到滿足,它所占用的CPU時限等因素。
而在多道批處理系統(tǒng)中,作業(yè)首先存放在外存,當(dāng)系統(tǒng)擁有的資源足夠分配給一個作業(yè),就將資源分配給此作業(yè),并將此作業(yè)調(diào)進(jìn)內(nèi)存。當(dāng)系統(tǒng)資源不足以分配給一個作業(yè)時,則等待已經(jīng)分配資源的作業(yè)運(yùn)行完成后釋放資源增加系統(tǒng)資源。
程序及運(yùn)行結(jié)果如下:
#include
#include
#define getb(type) (type *)malloc(sizeof(type))
#define NULL 0
typedef struct JCB{//定義作業(yè)控制塊JCB
char name[10];//作業(yè)名
int stime;//開始運(yùn)行時刻
int rtime;//需要運(yùn)行時間,即提供服務(wù)的時間
char state;//作業(yè)狀態(tài)
JCB *next;//鏈指針
}JCB;
JCB *ready=NULL,*p;
int T;//時間量
int ttime;//總周轉(zhuǎn)時間
float trtime;//總的帶權(quán)周轉(zhuǎn)時間
void sort()//構(gòu)造鏈表存放作業(yè)
{JCB *fir,*sec;
if(ready==NULL){ready=p;}
else{
fir=ready->next;
if(fir==NULL){sec=ready;}
else{
while(fir!=NULL){
sec=fir;fir=fir->next;
} }
sec->next=p;
}}
void init()//輸入作業(yè)參數(shù)
{int i,num;
printf("輸入作業(yè)數(shù):");
scanf("%d",&num);//輸入作業(yè)數(shù)
for(i=0;iname);
printf("開始運(yùn)行時刻:");
scanf("%d",&p->stime);
printf("需要運(yùn)行時間:");
scanf("%d",&p->rtime);
p->state=w;//每個作業(yè)的初始狀態(tài)總是等待W
p->next=NULL;
sort();
}
T=0;//時間量
ttime=0;//總周轉(zhuǎn)時間
trtime=0;//總的帶權(quán)周轉(zhuǎn)時間
getchar();//接收字符
}
int length()//鏈表長
{int i=0;
JCB *q;
q=ready;
while(q!=NULL){i++;q=q->next;}
return i;
}
void destroy(int end)//完成作業(yè)
{ int i=end;
float W;
printf("\n作業(yè)完成時間:%d",i);
printf("\n周轉(zhuǎn)時間:%d",i-(p->stime));
W=(float)(i-(p->stime))/(float)(p->rtime);//帶權(quán)周轉(zhuǎn)時間=周轉(zhuǎn)時間/提供服務(wù)的時間
printf("\n帶權(quán)周轉(zhuǎn)時間:%2.2f",W);
}
void run()//運(yùn)行作業(yè)
{ int start,end;
start=T;//初始值為0
end=(p->rtime)+start;//作業(yè)完成時間=運(yùn)行時間+開始運(yùn)行時刻
ttime+=end-p->stime;//總周轉(zhuǎn)時間=完成時間-開始運(yùn)行時刻
trtime+=(float)(end-(p->stime))/(float)(p->rtime);//總的帶權(quán)周轉(zhuǎn)時間
T+=p->rtime;
destroy(end);
}
void main()//主函數(shù)
{ int len,count;
count=0;
printf("\t\tcopyright:林慶達(dá) 計算機(jī)03(7)班");
printf("\n\t ******作業(yè)調(diào)度算法:先來先服務(wù)(FCFS)******\n");
init();//初始化數(shù)據(jù)
len=length();//就緒作業(yè)的長度
printf("\npress any key to continue ...");
getchar();
while((len!=0)&&(ready!=NULL)){//若就緒隊列不為空
count++;
p=ready;
printf("\n正在執(zhí)行的作業(yè)是: %s.",p->name);
ready=ready->next;
p->next=NULL;
p->state=r;
run();
printf("\npress any key to continue ...");
getchar();
}
printf("\n所有作業(yè)全部完成運(yùn)行!\n");
printf("平均周轉(zhuǎn)時間為:%3.2f\n",(float)ttime/(float)count);//總周轉(zhuǎn)時間/作業(yè)數(shù)
printf("平均帶權(quán)周轉(zhuǎn)時間為:%3.2f\n",trtime/(float)count);//總的帶權(quán)周轉(zhuǎn)時間/作業(yè)數(shù)
getchar();
}
運(yùn)行結(jié)果: Copyright:林慶達(dá) 計算機(jī)03(7)班
******作業(yè)調(diào)度算法:先來先服務(wù)(FCFS)******
輸入作業(yè)數(shù):5
輸入第1個作業(yè)的信息:
作業(yè)名:A
開始運(yùn)行時刻:0
需要運(yùn)行時間:4
輸入第2個作業(yè)的信息:
作業(yè)名:B
開始運(yùn)行時刻:1
需要運(yùn)行時間:3
輸入第3個作業(yè)的信息:
作業(yè)名:C
開始運(yùn)行時刻:2
需要運(yùn)行時間:5
輸入第4個作業(yè)的信息:
作業(yè)名:D
開始運(yùn)行時刻:3
需要運(yùn)行時間:2
輸入第5個作業(yè)的信息:
作業(yè)名:E
開始運(yùn)行時刻:4
需要運(yùn)行時間:4
Press any key to continue……
正在執(zhí)行的作業(yè)是:A
作業(yè)完成時間:4
周轉(zhuǎn)時間:4
帶權(quán)周轉(zhuǎn)時間:1.00
Press any key to continue……
正在執(zhí)行的作業(yè)是:B
作業(yè)完成時間:7
周轉(zhuǎn)時間:6
帶權(quán)周轉(zhuǎn)時間:2.00
Press any key to continue……
正在執(zhí)行的作業(yè)是:C
作業(yè)完成時間:12
周轉(zhuǎn)時間:10
帶權(quán)周轉(zhuǎn)時間:2.00
Press any key to continue……
正在執(zhí)行的作業(yè)是:D
作業(yè)完成時間:14
周轉(zhuǎn)時間:11
帶權(quán)周轉(zhuǎn)時間:5.50
Press any key to continue……
正在執(zhí)行的作業(yè)是:E
作業(yè)完成時間:18
周轉(zhuǎn)時間:14
帶權(quán)周轉(zhuǎn)時間:3.50
Press any key to continue……
所有作業(yè)全部完成運(yùn)行!
平均周轉(zhuǎn)時間為:9.00
平均帶權(quán)周轉(zhuǎn)時間:2.80
Press any key to continue……
五、心得體會:
通過實驗和課程設(shè)計,還進(jìn)一步鍛煉了自己的編程能力,增強(qiáng)了實踐和動手能力,使自己的編程能力和邏輯思考能力有了較大的進(jìn)步。
實驗三 存儲管理
一.實驗?zāi)康模?
存儲管理的主要功能之一是合理分配空間,請求頁式管理是一種常用的虛擬存儲管理技術(shù)。本實驗的目的是通過請求頁式管理中的頁面置換算法設(shè)計,了解虛擬存儲技術(shù)的特點,掌握請求頁式管理的頁面置換算法。
二.實驗內(nèi)容:
1、分區(qū)管理的原理:將存儲器劃分成若干段大小固定的區(qū)域,一個區(qū)域里只能運(yùn)行一個程序,程序只能在其自身所在的分區(qū)中活動。
2、固定式分區(qū)管理的原理:區(qū)域大小及起始地址是固定的。一個分區(qū)只能存放一個程序。需要設(shè)置一個分區(qū)說明表來標(biāo)明內(nèi)存的使用狀態(tài)。根據(jù)分區(qū)說明表來給程序分配相應(yīng)的區(qū)域。由于程序不可能剛剛占有一個分區(qū)的大小 ,這樣就會在一個分區(qū)之中留下零頭,造成了極大的浪費。
3、可變式分區(qū)管理的原理:區(qū)域的大小及起始地址是可變的,根據(jù)程序裝入時的大小動態(tài)地分配一個區(qū)域。保證每個區(qū)域之中剛好放一個程序。這樣可以充分地利用存儲空間,提高內(nèi)存的使用效率。如果一個程序運(yùn)行完畢,就要釋放出它所占
鏈接地址:http://www.3dchina-expo.com/p-6498830.html