操作系统高响应比调度算法
培养学生结构化程序、模块化程序设计的方法和能力。
提高学生调试程序的技巧和软件设计的能力。
提高学生分析问题、解决问题以及综合利用C语言进行程序设计的能力。
设计内容
设计并实现一个采用高响应比算法的进程调度演示程序
设计
1.每一个进程有一个PCB,其内容可以根据具体情况设定。
2.进程数、进入内存时间、要求服务时间、优先级等均可以在界面上设定
printf("%s正在运行\n",p[m].name);
for(n=m+1;n<=N-1;n++)
{
if(p[n].arrivetime<=p[m].finishtime)
{
printf("%s进程已到达\n",p[n].name);
i++;
}
else
printf("%s进程未到达\n",p[n].name);
操作系统
采用高响应比算法
课程设计
学 号:
姓 名:
专 业:
班 级:
指导老师:
实验
采用高响应比算法的进程调度程序
课程设计的目的
操作系统课程设计是计算机专业重要的教学环节,它为学生提供了一个既动手又动脑,将课本上的理论知识和实际有机的结合一起,独立分析和解决实际问题的机会。
进一步巩固和复习操作系统的基础知识。
7.具有一定的数据容错性
五、流程图
Hale Waihona Puke 一、由于是随机分配资源、需求等等的矩阵,所以先输入资源数为3,进程数为5。更容易得到合适的矩阵。经过几次输出得到合适的矩阵。
输入第一次请求的进程P2,请求资源为2 0 0输出全部安全矩阵
由于安全序列过多,只截图出一部分的安全序列。
然后再次请求进程P0,资源1,0,2。
p[k].finishtime=p[k-1].finishtime+p[k].servicetime;
}
}
for(k=0;k<=N-1;k++)
{
p[k].zztime=p[k].finishtime-p[k].arrivetime;
p[k].dqzztime=p[k].zztime/p[k].servicetime;
printf("名称到达时间服务时间开始时间结束时间周转时间带权周转时间\n");
for(k=0;k<=N-1;k++)
{
printf("%s\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t\n",p[k].name,p[k].arrivetime,p[k].servicetime,p[k].starttime,p[k].finishtime,p[k].zztime,p[k].dqzztime);
}
}
void Grade(P *p,int N)
{
float arrivetime=0,servicetime=0,starttime=0,finishtime=0,zztime=0,dqzztime=0;
sort(p,N);
for(int m=0;m<N-1;m++)
{
if(m==0)
{
p[m].finishtime=p[m].arrivetime+p[m].servicetime;
scanf("%d",&N);
input(a,N);
Grade(a,N);
}
void input(P *p,int N)
{
int i;
for(i=0;i<=N-1;i++)
{
printf("请输入第%d个进程的名字,到达时间,要求服务的时间:\n",i+1);
scanf("%s%f%f",&p[i].name,&p[i].arrivetime,&p[i].servicetime);
printf("在第%-.0f时刻进程信息\n",p[m].arrivetime);
}
else
{
p[m].finishtime=p[m-1].finishtime+p[m].servicetime;
printf("在第%-.0f时刻进程信息\n",p[m-1].finishtime);
}
int i=0,n;
最后请求进程P3请求向量2,3,1
得到所有安全序列。
根据上面的一些数据测试,可以证明该程序已经完整地实现银行家算法。
程序运行结果
1进入操作界面如下
2输入进程的信息
3显示短作业优先法的运行过程
4运行顺序
5进程信息
实验体会
通过本次实验对用高响应比算法的优先调度算法有了更深入的理解和掌握,进一步巩固和复习操作系统的基础知识,更进一步的了解了结构化模块化程序设计的方法,提高了调试程序的技巧。
{
if(max<=(p[m].finishtime-p[k+1].arrivetime)/p[k+1].servicetime)
{
max=(p[m].finishtime-p[k+1].arrivetime)/p[k+1].servicetime;
follow=k+1;
}
}
P temp;
temp=p[m+1];
}
}
void sort(P *p,int N)
{
for(int i=0;i<N-1;i++)
for(int j=i+1;j<N;j++)
if(p[i].arrivetime>p[j].arrivetime)
{
P temp;
temp=p[i];
p[i]=p[j];
p[j]=temp;
}
}
void run(P *p,int N)
}
}
void Traverse(P *p,int N)
{
int k;
printf("进程运行的顺序:");
printf("%s",p[0].name);
for(k=1;k<N;k++)
{
printf("->%s",p[k].name);
}
printf("\n");
printf("进程运行的详细信息如下:\n");
{
int k;
for(k=0;k<=N-1;k++)
{
if(k==0)
{
p[k].starttime=p[k].arrivetime;
p[k].finishtime=p[k].arrivetime+p[k].servicetime;
}
else
{
p[k].starttime=p[k-1].finishtime;
3.可读取样例数据(要求存放在外部文件中)进行进程数、进入内存时间、时间片长度、
进程优先级的初始化
4.可以在运行中显示各进程的状态:就绪、执行(由于不要求设置互斥资源与进程间的
同步关系,故只有两种状态)
5.采用可视化界面,可在进程调度过程中随时暂停调度,查看当前进程的状态以及相应的
阻塞队列
6.有性能比较功能,可比较同一组数据在不同调度算法下的平均周转时间
源程序
#include <stdio.h>
struct P
{
char name[10];
float arrivetime;
float servicetime;
float starttime;
float finishtime;
float zztime;
float dqzztime;
};
P a[100];
void input(P *,int);
void Traverse(P *,int);
void sort(P *,int);
void Grade(P *,int);
void main()
{
int N;
printf("\t下面进入高响应比调度算法模拟界面\n");
printf("模拟开始:\n");
printf("请输入进程的个数:\n");
p[m+1]=p[follow];
p[follow]=temp;
}
run(p,N);
Traverse(p,N);
}
}
for(int l=0;l<m;l++)
{
printf("%s进程已完成\n",p[l].name);
}
float max=(p[m].finishtime-p[m+1].arrivetime)/p[m+1].servicetime;
int follow=m+1;
for(int k=m+1;k<m+i;k++)