今天陆秋老师检查我们的实验,我是我们这组第一个检查的,所以老师问到挺多源代码和每个算法具体实现的步骤和方法,我刚刚开始有点紧张,但是代码基本是自己写的,屏住压力,还是很好地解决了老师所提出的问题,操作系统的实习作用很大,在有限时间内,完成老师布置的任务,还有也提高了自己编程的能力和思维,收获很大。想了想,未来的道路很长,既然选择了这条道路就应该走下去。
下面附上实验三个设计的源代码:第一个是短作业和最高优先算法;第二个是磁盘调度,第三个是哲学家就餐设计算法
#include<stdio.h>
struct sjf {
int yxj;
char name[10]; //进程名
float arrivetime; //到达时间
float servicetime;//服务时间
float starttime; //开始时间
float finishtime;//完成时间
float zztime;//周转时间
float dqzztime;//带权周转
};
sjf p[100]; //定义一个全局指针
void Sinput(sjf *p, int N) //输入函数
{
int i;
for (i = 0; i<N; i++)
{
printf("输入第%d进程的名称,到达时间,服务时间:", i+1);
scanf("%s%f%f", &p[i].name, &p[i].arrivetime, &p[i].servicetime); //循环输入名字,到达时间,服务时间
}
}
void Ssinput(sjf *p, int N) //输入函数
{
int i;
for (i = 0; i<N; i++)
{
printf("输入第%d进程的名称,到达时间,服务时间:,优先级", i+1);
scanf("%s%f%f%d", &p[i].name, &p[i].arrivetime, &p[i].servicetime,&p[i].yxj); //循环输入名字,到达时间,服务时间
}
}
void Sprint(sjf *p, int N) //输出函数
{ int k;
printf("run order:");
printf("%s",p[0].name);
for(k=1;k<N;k++)
{
printf("-->%s",p[k].name); //输出的顺序
}
printf("\nname\tarrive\tservice\tstart\tfinish\tzztime\tdqzztime\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].finishtime-p[k].arrivetime),
((p[k].finishtime-p[k].arrivetime)/p[k].servicetime));
//周转时间等于结束时间减去到达时间,带权周转时间等于周转时间除服务时间
}
}
void Ssort(sjf *p, int N) //排序算法
{
for (int i = 1; i < N; i++) { //按冒泡算法排序
for (int j = 1; j <= i; j++)
{
if((p[i].arrivetime<=p[j].arrivetime)) //先排序到达时间,如果到达时间小于或等于下一个则看服务时间
{
if(p[i].servicetime<p[j].servicetime) //如果前一个的服务时间小于后一个则交换
{
sjf temp; //定义一个临时的指针方便交换
temp = p[i];
p[i] = p[j];
p[j] = temp;
}
}
}
}
}
void Sssort(sjf *p, int N) //排序算法
{
int qq;
for (int i = 1; i < N; i++)
{ //按冒泡算法排序
for (int j = 1; j <= i; j++)
{
if((p[i].arrivetime<=p[j].arrivetime)) //先排序到达时间,如果到达时间小于或等于下一个则看服务时间
{
if(p[i].yxj<p[j].yxj) //如果前一个的服务时间小于后一个则交换
{
sjf temp; //定义一个临时的指针方便交换
temp = p[i];
p[i] = p[j];
p[j] = temp;
}
}
}
}
qq=p[N].yxj;
}
void Sdeal(sjf *p,int N,float arrivetime,float servicetime,float finishtime) //处理运行函数
{
int k;
for(k=0;k<=N;k++)
{
if(k==0){
p[k].starttime=p[k].arrivetime;
p[k].finishtime=p[k].arrivetime+p[k].servicetime;} //将第一个数据写入
else{
if (p[k-1].finishtime<p[k].arrivetime) //如果结束时候下一个还没有到达
{
p[k].starttime=p[k].arrivetime; //则开始时间等于下一个到达时间
p[k].finishtime=p[k].starttime+p[k].servicetime;//结束时间等于开始时间加服务时间
}
else
{
p[k].starttime=p[k-1].finishtime; //开始时间等于结束时间
p[k].finishtime=p[k-1].finishtime+p[k].servicetime;//结束时间等于服务时间加结束时间
}
} //结束时间等于前一个的完成时间(这个的开始时间)加服务时间
}
}
void SJF(sjf *p, int N) //函数调用函数
{
float arrivetime=0,servicetime=0,finishtime=0; //初始化定义
Ssort(p, N);
Sdeal(p,N,arrivetime,servicetime,fi