先来先服务FCFS和短作业优先SJF进程调度(C语言代码)
文章目录1.先来先服务FCFS1.1内容概括1.2实验及代码2.短作业优先SJF2.1内容概括2.2实验及代码1.先来先服务FCFS1.1内容概括1.2实验及代码代码实现#include<stdio.h>#include<stdlib.h>struct fcfs //ID{char name[20];float startime;float...
·
1.先来先服务FCFS
1.1内容概括

1.2实验及代码

代码实现
#include<stdio.h>
#include<stdlib.h>
struct fcfs //ID
{
char name[20];
float startime;
float arrivetime;
float servicetime;
float finishtime;
float zztime; //周转时间
float dqzztime; // 平均周转时间
};
void input(fcfs *p,int N)//输入进程相关信
{
printf("请输入进程的名字 到达时间 服务时间:(比如:进程1 0 10)\n");
for(int i=1;i<=N;i++)
{
printf("请输入进程%d的信息:\n", i);//i的初始值设为1,这样方便表示
printf("Process ID: ");
scanf("%s",p[i-1].name);
printf("Arrival Time: ");
scanf("%f",&p[i-1].arrivetime);
printf("Service Time: ");
scanf("%f",&p[i-1].servicetime);
printf("\n");
}
}
void sort(fcfs *p,int N){
int i,j;
for(i=0;i<N-1;i++)
{
for(j=0;j<N-i-1;j++)
{
if(p[j].arrivetime>p[j+1].arrivetime)
{
fcfs temp;
temp=p[j];
p[j]=p[j+1];
p[j+1]=temp;
}
}
}
}
void run(fcfs *p,int N){
int i;
for(i=0;i<N;i++)
{
if(i==0){
p[i].startime=p[i].arrivetime;
p[i].finishtime=p[i].arrivetime+p[i].servicetime;
//周转时间=要求服务时间+等待时间
p[i].zztime=p[i].servicetime;
//其他进程:p[i].zztime=p[i].finishtime-p[i].arrivetime;
p[i].dqzztime=p[i].zztime/p[i].servicetime;
}else{
p[i].startime=p[i-1].finishtime;
p[i].finishtime=p[i].startime+p[i].servicetime;
p[i].zztime=p[i].finishtime-p[i].arrivetime;
p[i].dqzztime=p[i].zztime/p[i].servicetime;
}
}
}
void show(fcfs *p,int N) {
int i;
printf("调用先来先服务算法后进程的运行顺序为:\n");
for(i=0;i<N;i++){
printf("%s",p[i].name);
printf("---->");
}
printf("\n");
printf("具体的进程调度信息为\n");
printf("进程 到达时间 服务时间 周转时间 ....\n");
for(i=0;i<N;i++){
printf("%3s",p[i].name);
printf("%8.3f",p[i].arrivetime);
printf("%8.3f",p[i].servicetime);
printf("%8.3f",p[i].zztime);
printf("\n");
}
}
int main()
{
fcfs a[100]; //创建100个结构体
int N; //进程数量
printf("请输入进程数目");
scanf("%d",&N);
input(a,N);
sort(a,N);
run(a,N);
show(a,N);
int i;
float average_zztime=0;
float average_dqzztime=0;
for(i=0;i<N;i++){
average_zztime+=a[i].zztime;
average_dqzztime+=a[i].dqzztime;
}
average_zztime/=N;
average_dqzztime/=N;
printf("采用FCFS算法算得平均周转时间为:%f",average_zztime);
printf("采用FCFS算法算得平均带权周转时间为:%f",average_dqzztime);
return 0;
printf("实验一:FCFS算法");
}

2.短作业优先SJF
2.1内容概括

2.2实验及代码

代码实现
#include<stdio.h>
#include<stdlib.h>
struct sjf //ID
{
char name[20];
float startime;//进程开始时间
float arrivetime;//进程到达时间
float servicetime;//进程执行时间
float finishtime;//进程完成时间
float zztime; //周转时间
float dqzztime; // 平均周转时间
};
void input(sjf *p,int N)//输入进程相关信
{
printf("请输入进程的名字 到达时间 服务时间:(比如:进程1 0 10)\n");
for(int i=1;i<=N;i++)
{
printf("请输入进程%d的信息:\n", i);//i的初始值设为1,这样方便表示
printf("Process ID: ");
scanf("%s",p[i-1].name);
printf("Arrival Time: ");
scanf("%f",&p[i-1].arrivetime);
printf("Service Time: ");
scanf("%f",&p[i-1].servicetime);
printf("\n");
}
}
void sort_arrivetime(sjf *p,int N){//对所有进程按照到达时间进行排序
int i,j;
sjf temp;
for(i=0;i<N-1;i++)
{
for(j=0;j<N-i-1;j++)
{
if(p[j].arrivetime>p[j+1].arrivetime)
{
temp=p[j];
p[j]=p[j+1];
p[j+1]=temp;
}
}
}
}
void sort_servicetime(sjf *p,int N)//对start到i之间的进程进行排序
{
sjf temp;//创建一个零时进程,便于后期排序时进行交换
int k=0;
float end=0.0;//保存cpu已经运行的时间
for(int i=0;i<N;i++){
k=i;//保存当前i的下表
while(p[i].arrivetime<=end&&i<N)//对从第i个之后的所有进程进行搜索
i++;//找到最后一个等待进程的下标(其实就是当前在等待的最后一个进程)
for (int t=k; t<i; t++)//对当前正在等待执行的进程按照服务时间排序
{
for (int j = k+1; j<i; j++)
{
if(p[t].servicetime < p[j].servicetime)
continue;
else
{
temp = p[t];
p[t] = p[j];
p[j] = temp;
}
}
}
i=k; //将i的下标还原
end+=p[i].servicetime;
}
}
void run(sjf *p,int N){
int i;
for(i=0;i<N;i++)
{
if(i==0){
p[i].startime=p[i].arrivetime;
p[i].finishtime=p[i].arrivetime+p[i].servicetime;
//周转时间=要求服务时间+等待时间
p[i].zztime=p[i].servicetime;
//其他进程:p[i].zztime=p[i].finishtime-p[i].arrivetime;
p[i].dqzztime=p[i].zztime/p[i].servicetime;
}else{
p[i].startime=p[i-1].finishtime;
p[i].finishtime=p[i].startime+p[i].servicetime;
p[i].zztime=p[i].finishtime-p[i].arrivetime;
p[i].dqzztime=p[i].zztime/p[i].servicetime;
}
}
}
void show(sjf *p,int N) {
int i;
printf("调用先来先服务算法后进程的运行顺序为:\n");
for(i=0;i<N;i++){
printf("%s",p[i].name);
printf("---->");
}
printf("\n");
printf("具体的进程调度信息为\n");
printf("进程 到达时间 服务时间 周转时间 ....\n");
for(i=0;i<N;i++){
printf("%3s",p[i].name);
printf("%8.3f",p[i].arrivetime);
printf("%8.3f",p[i].servicetime);
printf("%8.3f",p[i].zztime);
printf("\n");
}
}
int main()
{
sjf a[100]; //创建100个结构体
int N; //进程数量
printf("请输入进程数目");
scanf("%d",&N);
input(a,N);//输入每个进程的信息
sort_arrivetime(a,N);//对所有进程按到达时间排序
sort_servicetime(a,N);//对当前的等待进程按照服务时间排序
run(a,N);//排好顺序之后,开学运行,计算结果
show(a,N);//展示结果
int i;
float average_zztime=0;
float average_dqzztime=0;
for(i=0;i<N;i++){
average_zztime+=a[i].zztime;
average_dqzztime+=a[i].dqzztime;
}
average_zztime/=N;
average_dqzztime/=N;
printf("采用FCFS算法算得平均周转时间为:%f",average_zztime);
printf("采用FCFS算法算得平均带权周转时间为:%f",average_dqzztime);
return 0;
printf("实验一:SJF算法");
}
SJF算法的代码是在FCFS代码的基础上实现的,增加了一个方法,将等待状态的进程按照服务时间进行排序。这样就可以保证下一个运行的是服务时间最短的等待进程
更多推荐
所有评论(0)