#include<stdio.h>
#include<
string.h>
struct job{
char name[
10];
int starttime;
//作业到达系统时间
int needtime;
//作业运行时间
int runtime;
//作业周转时间
int endtime;
//作业结束时间
double dqzztime;
//带权周转时间
double xiangyingbi;
};
void fcfs(
struct job jobs[
50],
int n);
void sjf(
struct job jobs[
50],
int n);
void hrrf(
struct job jobs[
50],
int n);
void result(
struct job jobs[
50],
int n);
void main()
{
struct job jobs[
50];
int n,i;
//n个作业
printf("输入作业个数:",n);
scanf("%d",&
n);
printf("输入每个作业的作业名,到达时间,运行时间:\n");
for(i=
0;i<n;i++
)
{
scanf("%s",jobs[i].name);
scanf("%d",&
jobs[i].starttime);
scanf("%d",&
jobs[i].needtime);
}
printf("\n");
printf("作业名\t到达系统时间\t运行时间\n");
for(i=
0;i<n;i++
)
{
printf("%s\t %d\t %d\n",jobs[i].name,jobs[i].starttime,jobs[i].needtime);
}
fcfs(jobs,n);
printf("先来先服务算法运行结果:\n");
result(jobs,n);
sjf(jobs,n);
printf("最短作业优先算法运行结果:\n");
// hrrf(jobs,n);
// printf("最高响应比优先算法运行结果:\n");
result(jobs,n);
}
void fcfs(
struct job jobs[
50],
int n)
{
int i;
for(i=
0;i<n;i++
)
{
if(i==
0) {
//第一个进程
jobs[i].runtime=
jobs[i].needtime;
jobs[i].endtime=jobs[i].starttime+
jobs[i].needtime;
}
else if(jobs[i].starttime>jobs[i-
1].endtime){
//第i个进程到达系统时,第i-1个进程已运行完毕
jobs[i].runtime=
jobs[i].needtime;
jobs[i].endtime=jobs[i].starttime+
jobs[i].needtime;
}
else{
//第i个进程到达系统时,第i-1个进程未运行完毕
jobs[i].runtime=jobs[i].needtime+jobs[i-
1].endtime-
jobs[i].starttime;
jobs[i].endtime=jobs[i].starttime+
jobs[i].runtime;
}
jobs[i].dqzztime=jobs[i].runtime*
1.0/
jobs[i].needtime;
}
}
void result(
struct job jobs[
50],
int n)
{
int i;
double averruntime;
double averdqzztime;
int sum_runtime=
0;
double sum_dqzztime=
0.00;
printf("作业名\t到达系统时间\t运行时间\t完成时间\t周转时间 带权周转时间\n");
for(i=
0;i<n;i++
)
{
printf("%s\t %d\t %d\t %d\t %d %.2f\n",jobs[i].name,jobs[i].starttime,jobs[i].needtime,jobs[i].endtime,jobs[i].runtime,jobs[i].dqzztime);
sum_runtime=sum_runtime+
jobs[i].runtime;
sum_dqzztime=sum_dqzztime+
jobs[i].dqzztime;
}
averruntime=sum_runtime*
1.0/
n;
averdqzztime=sum_dqzztime*
1.000/
n;
printf("平均周转时间:%.2f \n",averruntime);
printf("平均带权周转时间:%.3f \n",averdqzztime);
printf("\n");
}
void sjf(
struct job jobs[
50],
int n)
{
int i=
0,b=
0;
char temp[
10];
int min;
for(i=
0;i<n-
1;i++
)
{
if(jobs[i].starttime>jobs[i+
1].starttime)
{
min=
jobs[i].starttime;
jobs[i].starttime=jobs[i+
1].starttime;
jobs[i+
1].starttime=
min;
min=
jobs[i].needtime;
jobs[i].needtime=jobs[i+
1].needtime;
jobs[i+
1].needtime=
min;
strcpy(temp,jobs[i].name);
strcpy(jobs[i].name,jobs[i+
1].name);
strcpy(jobs[i+
1].name,temp);
}
} //按作业到达系统时间进行排序,最早到达的排在最前面
jobs[0].endtime=jobs[
0].starttime+jobs[
0].needtime;
jobs[0].runtime=jobs[
0].needtime;
jobs[0].dqzztime=jobs[
0].runtime*
1.0/jobs[
0].needtime;
for(i=
1;i<n;i++
)
{
if(jobs[i].starttime>jobs[
0].endtime) ;
else b=b+
1;
//作业到达系统时,第0个作业还在运行 用b统计需等待作业0运行的作业个数
}
for(i=
1;i<=b-
1;i++
)
{
if(jobs[i].needtime>jobs[i+
1].needtime)
{
min=
jobs[i].starttime;
jobs[i].starttime=jobs[i+
1].starttime;
jobs[i+
1].starttime=
min;
min=
jobs[i].needtime;
jobs[i].needtime=jobs[i+
1].needtime;
jobs[i+
1].needtime=
min;
strcpy(temp,jobs[i].name); //将第二个参数的值复制给第一个参数,返回第一个参数
strcpy(jobs[i].name,jobs[i+
1].name);
strcpy(jobs[i+
1].name,temp);
} //按最短运行时间排序
}
for(i=
1;i<n;i++
)
{
if(jobs[i].starttime>jobs[i-
1].endtime)
{ //第i个进程到达系统时,第i-1个进程已运行完毕
jobs[i].endtime=jobs[i].starttime+
jobs[i].needtime;
jobs[i].runtime=
jobs[i].needtime;
}
else
{
jobs[i].endtime=jobs[i-
1].endtime+
jobs[i].needtime;
jobs[i].runtime=jobs[i].endtime-
jobs[i].starttime;
}
jobs[i].dqzztime=jobs[i].runtime*
1.0/
jobs[i].needtime;
}
}
这是FCFS SJF 算法代码和运行结果,HRRF算法还在完成中。
心得:对算法的思路是清晰的,可是写起代码来就不会表达,归根到底还是基础差,对C语言的掌握不深。在参考网上的代码后进行理解,并查阅相关书籍后终于实现FCFS算法和SJF算法。对HRRF算法,因为每调度一次进程都要计算其它进程的响应比,而响应比的计算中等待时间会因所调度的进程的结束时间有关,所以感觉很吃力,没有能实现HRRF算法。
实验过程的难点问题及其解决的方法:不会用冒泡法对进程到达时间进行排序。解决:把第i个作业的到达时间看作是最先到达的作业时间(数值最小),依次比较剩余作业的到达时间,当遇到第i+1个作业的到达时间(数值更小),则利用一个临时变量min交换两个作业的到达时间。
转载于:https://www.cnblogs.com/family6/p/4484228.html
相关资源:操作系统实验报告 C++实现进程调度算法,短进程优先SJF与先来先服务FCFS算法