代码绝大多数都是从网上拷下来再自己改了一点。本来想附上参考链接,但时间有点久,找不到主要参考的那个连接。
[声明]本文为转载是因为代码大多数都是网上copy的,然后自己也只是微调加实现过,个人认为不可以当原创。代码全部都贴上来了,txt文档的格式也贴了,也实现过,如果期间遇到困难,希望你们再去找其他的资料,问我的话我未必能答上来。
操作系统系列文章:
1.进程调度算法FCFS和RR
2.作业调度算法SJF和HRRN
3.动态分区分配算法的FirstFit和BestFit
4.银行家算法
主要的数据结构
//定义一个结构体
struct jcb{
char name[10]; //作业名
float arrivetime; //到达时间
float servicetime;//服务时间
float starttime; //开始时间
float finishtime;//完成时间
float rtime;//周转时间
float drtime;//带权周转
float Rp;//响应比
}*b;
static int N;//作业个数
//定义一个结构体数组
jcb a[100];
用到的函数
void input(jcb *a);//向文档读入数据的函数
void display(jcb *a);//显示输入的数据
void Print(jcb *a,int N);//定义一个输出函数
void sort(jcb *a,int N);//按到达时间排序
void deal(jcb *a,int N);//运行阶段
void hrrn(jcb *a,int N);
void sjff(jcb *a,int N);
核心算法
短作业优先
void sjff(jcb *p,int N)
{
display(p);
float arrivetime=0,servicetime=0,starttime=0,finishtime=0,rtime=0,drtime=0;
sort(p,N);//调用sort函数
for(int m=0;m=p[m].arrivetime )
{
p[m].starttime=p[m-1].finishtime;
}
else
{
p[m].starttime =p[m].arrivetime;
}
p[m].finishtime=p[m].starttime+p[m].servicetime;
}
int i=0;
for(int n=m+1;n
高响应比
void hrrn(jcb *p,int N)
{
display(p);
float arrivetime=0,servicetime=0,starttime=0,finishtime=0,rtime=0,drtime=0,Rp=0;
int num=1;
sort(p,N);
for(int m=0;m=p[m].arrivetime )
{
p[m].starttime=p[m-1].finishtime;
}
else
{
p[m].starttime =p[m].arrivetime;
}
p[m].finishtime=p[m].starttime+p[m].servicetime;
}
int i=0;
for(int n=m+1;nmax)
{
max=p[k+1].Rp;
next=k+1;
}
}
jcb temp;
temp=p[m+1];
p[m+1]=p[next];
p[next]=temp;
}
deal(p,N);
Print(p,N);
}
//运行阶段
void deal(jcb *p,int N)
{
int k;
for(k=0;k=p[k].arrivetime)
{
p[k].starttime=p[k-1].finishtime;}
else
{
p[k].starttime =p[k].arrivetime;}
p[k].finishtime=p[k].starttime+p[k].servicetime;
}
}
for(k=0;k
//按到达时间排序
void sort(jcb *p,int N)
{
for(int i=0;i
主函数
int main()
{
int aa;
printf("作业调度算法:1.SJF 2.HRRN 3.quit\n");
scanf("%d",&aa);
while(aa!=3){
switch(aa){
case 1:
input(a);
b=a;
sjff(a,N);//调用sjff函数
break;
case 2:
input(a);
b=a;
hrrn(a,N);
break;
default:
break;
}
printf("作业调度算法:1.SJF 2.HRRN 3.quit\n");
scanf("%d",&aa);
}
printf("end.\n");
return 0;
}
测试数据的输入
源代码
#include
#include
#include
//定义一个结构体
struct jcb{
char name[10]; //作业名
float arrivetime; //到达时间
float servicetime;//服务时间
float starttime; //开始时间
float finishtime;//完成时间
float rtime;//周转时间
float drtime;//带权周转
float Rp;//响应比
}*b;
static int N;//作业个数
//定义一个结构体数组
jcb a[100];
void input(jcb *a);//向文档读入数据的函数
void display(jcb *a);//显示输入的数据
void Print(jcb *a,int N);//定义一个输出函数
void sort(jcb *a,int N);//按到达时间排序
void deal(jcb *a,int N);//运行阶段
void hrrn(jcb *a,int N);
void sjff(jcb *a,int N);
//向文档读入数据的函数
void input(jcb *a)
{
int i;
FILE *fp;
fp=fopen("作业调度算法输入数据.txt","r");
if(fp==NULL){
exit(EXIT_FAILURE);
}
fscanf(fp,"%d",&N);
for(i=0;i%s",p[k].name);
}
printf("\n-----------结果------------\n");
printf("\n====================================================================================\n");
printf("进程名 到达时间 服务时间 开始时间 完成时间 周转时间 带权周转时间\n");
for(k=0;k<=N-1;k++)
{
printf("%4s %8.2f %9.2f %7.2f %9.2f %9.2f %12.2f\n",p[k].name,p[k].arrivetime,p[k].servicetime,p[k].starttime,p[k].finishtime,p[k].rtime,p[k].drtime);
}
}
//按到达时间排序
void sort(jcb *p,int N)
{
for(int i=0;i=p[k].arrivetime)
{
p[k].starttime=p[k-1].finishtime;}
else
{
p[k].starttime =p[k].arrivetime;}
p[k].finishtime=p[k].starttime+p[k].servicetime;
}
}
for(k=0;k=p[m].arrivetime )
{
p[m].starttime=p[m-1].finishtime;
}
else
{
p[m].starttime =p[m].arrivetime;
}
p[m].finishtime=p[m].starttime+p[m].servicetime;
}
int i=0;
for(int n=m+1;nmax)
{
max=p[k+1].Rp;
next=k+1;
}
}
jcb temp;
temp=p[m+1];
p[m+1]=p[next];
p[next]=temp;
}
deal(p,N);
Print(p,N);
}
//短作业优先调度算法
void sjff(jcb *p,int N)
{
display(p);
float arrivetime=0,servicetime=0,starttime=0,finishtime=0,rtime=0,drtime=0;
sort(p,N);//调用sort函数
for(int m=0;m=p[m].arrivetime )
{
p[m].starttime=p[m-1].finishtime;
}
else
{
p[m].starttime =p[m].arrivetime;
}
p[m].finishtime=p[m].starttime+p[m].servicetime;
}
int i=0;
for(int n=m+1;n
实验截图
短作业优先实验结果
高响应比实验结果