当前位置:文档之家› 集美大学操作系统_实验五

集美大学操作系统_实验五

集美大学计算机操作系统教程课程实验报告
一、实验目的
1、加深对进程概念及进程管理各部分内容的理解。

2、熟悉进程管理中主要数据结构的设计和进程调度算法实施。

二、实验内容
调试并运行一个允许n 个进程并发运行的进程调度模拟系统。

(可在HRN和HPF中选择一个实现。

由于本实验是模拟运行,所选中进程并不实际启动运行,可以使用简单的输出来模拟进程的一次运行)。

三、实验要求
(1)给出程序中使用的数据结构及符号说明。

(2)给出程序流程图和源程序,源程序中要有详细的注释。

(3)设置合理的参数以满足进程调度算法需求。

(4)可根据输入的内容填写PCB。

并根据选中算法安排进程调度。

(5)能打印程序运行时的初值和调度运行结果,要求如下
a)每个进程用一个PCB 表示可显示各进程控制块的初始状态;
b)输入各进程相关参数,输入完成后可显示各进程控制块的初始状态;
c)输出调度结果:能较直观地显示各进程执行顺序,占用时间等
d)计算每个作业的周转时间,带权周转时间及均值。

四、实验步骤
用HRN(最高响应比优先)实现进程调度
代码如下:
#include<stdio.h>
#include<stdlib.h>
int n;
float T1=0,T2=0;
int times=0;
struct jcb //作业控制块
{
char name[10]; //作业名
int reachtime; //作业到达时间
int starttime; //作业开始时间
int needtime; //作业需要运行的时间
float super; //作业的响应比
int finishtime; //作业完成时间
float cycletime; //作业周转时间
float cltime; //作业带权周转时间
char state; //作业状态
struct jcb *next; //结构体指针
}*ready=NULL,*p,*q;
typedef struct jcb JCB;
void inital() //建立作业控制块队列,先将其排成先来先服务的模式队列{
int i;
printf("\n输入作业数:");
scanf("%d",&n);
for(i=0;i<n;i++)
{
p=(JCB*)malloc(sizeof(JCB));
printf("\n输入作业名:");
scanf("%s",p->name);
p->reachtime=i;
printf("作业默认到达时间:%d",i);
printf("\n输入作业要运行的时间:");
scanf("%d",&p->needtime);
p->state='W';
p->next=NULL;
if(ready==NULL)
ready=q=p;
else{
q->next=p;
q=p;
}
}
}
void disp(JCB* q) //显示作业运行后的周转时间及带权周转时间等{
printf("\n作业%s正在运行,估计其运行情况:\n",q->name);
printf("开始运行时刻:%d\n",q->starttime);
printf("完成时刻:%d\n",q->finishtime);
printf("周转时间:%f\n",q->cycletime);
printf("带权周转时间:%f\n",q->cltime);
printf("响应比:%f\n",q->super);
}
void running(JCB *p) //运行作业
{
if(p==ready) //先将要运行的作业从队列中分离出来
{
ready=p->next;
p->next=NULL;
}
else
{
q=ready;
while(q->next!=p)
q=q->next;
q->next=p->next;
}
p->starttime=times; //计算作业运行后的完成时间,周转时间等等p->state='R';
p->finishtime=p->starttime+p->needtime;
p->cycletime=(float)(p->finishtime-p->reachtime);
p->cltime=(float)(p->cycletime/p->needtime);
T1+=p->cycletime;
T2+=p->cltime;
disp(p); //调用disp()函数,显示作业运行情况
times+=p->needtime;
p->state='F';
printf("\n%s has been finished!\n",p->name);
free(p); //释放运行后的作业
}
void super() //计算队列中作业的高响应比
{
JCB *padv;
padv=ready;
do{
if(padv->state=='W'&&padv->reachtime<=times)
padv->super=(float)(times-padv->reachtime+padv->needtime)/padv->needtime;
padv=padv->next;
}while(padv!=NULL);
}
void final() //最后打印作业的平均周转时间,平均带权周转时间
{
float s,t;
t=T1/n;
s=T2/n;
printf("\n\n作业已经全部完成!");
printf("\n%d个作业的平均周转时间是:%f",n,t);
printf("\n%d个作业的平均带权周转时间是%f:\n\n\n",n,s); }
void hrn() //高响应比算法
{
JCB *min;
int i,iden;
inital();
for(i=0;i<n;i++)
{
p=min=ready;iden=1;
super();
do{
if(p->state=='W'&&p->reachtime<=times)
if(iden)
{
min=p;
iden=0;
}
else if(p->super>min->super)
min=p;
p=p->next;
}while(p!=NULL);
if(iden)
{
i--;times++;
//printf("\ntime=%d:\tno JCB submib...wait...",time); if(times>1000)
{
printf("\nruntime is too long...error...");
}
}
else
{
running(min); //调用running()函数
}
}
final(); //调用final()函数
}
void main() //主函数
{
hrn();
}
运行结果如下:
五、实验总结
通过本实验对于最高响应比优先算法和进程调度的功能及进程调度算法有了深入理解。

在实验开始之前我对于最高响应比优先理解并不深,导致了响应比的计算错误,从而加大了完成代码的时间量。

对于这个问题,使我更明白了基础知识的重要性。

相关主题