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