操作系统:FCFS调度算法简单实现
- 由于本人(小白一个)一直以来想要写博客,加上最近学习操作系统,为了巩固自己的学习成果以及加深印象,现在决定开始写博客,可以说这是我的第一篇博客。
- 这篇文章主要描述的计算机操作系统的FCFS(先来先服务)的调度算法,可以用在进程调度和作业调度中。它的基本思想是按进程或作业到达的时间先后顺序进行调度。
- 下面就详细讲下本小白实现此简单算法的基本功能,过程以及思想。
基本功能:
1、输出每个进程的调度时间表
2、上一个进程结束前,下一个进程还没有到达,程序计算周转时间仍然正确
3、进程可以不按到达时间大小排列输入,输出的调度时间表依然正确
首先我们得知道进程是怎么构造的,在这篇文章中我是以结构体数组的形式来构造多个进程,结构体里的各个成分分别表示进程的基本信息,数组的大小为常数 5。
以下是我的进程具体构造:
struct PCB
{
char name[8]; //进程名称
int arrive_time; //到达时间
int run_time; //运行时间
int finish_time; //完成时间
int zhouzhuan_time; //周转时间
float daiquan_time; // 带权周转时间
};
#define N 5
struct PCB pcb[N],temp;
输入进程功能:自定义一个输入函数,设置for循环语句,循环输入,很容易实现
void input()
{
int i;
cout<<"--------------------------------------"<<endl;
cout<<" FCFS调度算法 "<<endl;
cout<<"--------------------------------------"<<endl;
cout<<" 输入五个进程信息:"<<endl;
for ( i=0;i<N;i++)
{
printf("请输入进程名:\n" );
scanf("%s",pcb[i].name);
printf("请输入到达时间:");
scanf("%d",&pcb[i].arrive_time);
printf("请输入要运行时间:");
scanf("%d",&pcb[i].run_time);
}
cout<<"各进程:"<<endl;
for( i=0;i<N;i++)
{ printf("%s ",pcb[i].name);
printf("%d ",pcb[i].arrive_time);
printf("%d \n",pcb[i].run_time);
}
}
要实现进程无需按到达时间先后输入,则需要将输入的进程按照到达时间先后进行排序,然后计算各个进程的各个时间。这里我设置了一个排序自定义函数。
void sort()//按照到达时间对进程进行排序
{
for(int i=0;i<N-1;i++)
{
for(int j=i+1;j<N;j++)
{
if(pcb[i].arrive_time>pcb[j].arrive_time)
{
temp=pcb[i];
pcb[i]=pcb[j];
pcb[j]=temp;
}
}
}
}
输出调度时间顺序时间表则设置一个进程输出函数,具体实现如下:
void output()
{
int i;
cout<<"FCFS调度算法:"<<endl;
pcb[0].finish_time=pcb[0].arrive_time+pcb[0].run_time;
pcb[0].zhouzhuan_time=pcb[0].finish_time-pcb[0].arrive_time;
pcb[0].daiquan_time=(float)pcb[0].zhouzhuan_time/pcb[0].run_time;
for(i=1;i<N;i++)
{
if(pcb[i].arrive_time>pcb[i-1].finish_time) //如果下一个进程在上一个进程完成后到达,则用以下算法计算调度时间
{
pcb[i].finish_time=pcb[i].arrive_time+pcb[i].run_time;
pcb[i].zhouzhuan_time=pcb[i].run_time;
pcb[i].daiquan_time=(float)pcb[i].zhouzhuan_time/pcb[i].run_time;
}
else //下一个进程在上一个进程结束前就已经到达
{
pcb[i].finish_time=pcb[i-1].finish_time+pcb[i].run_time;
pcb[i].zhouzhuan_time=pcb[i].finish_time-pcb[i].arrive_time;
pcb[i].daiquan_time=(float)pcb[i].zhouzhuan_time/pcb[i].run_time;
}
}
for(i=0;i<N;i++)
{
sumzhouzhuantime+=pcb[i].zhouzhuan_time;
sumdaiquanzhouzhuantime+=pcb[i].daiquan_time;
}
printf("----------------------------------------------------------------\n");
printf("进程名 到达时间 运行时间 完成时间 周转时间 带权周转时间 \n");
printf("----------------------------------------------------------------\n");
for(i=0;i<N;i++)
{
printf(" %s %d %d %d %d %.2f\n",pcb[i].name,pcb[i].arrive_time,pcb[i].run_time,pcb[i].finish_time,pcb[i].zhouzhuan_time,pcb[i].daiquan_time);
}
cout<<"平均周转时间:"<<sumzhouzhuantime/N<<endl; //定义一个全局变量(总的进程的周转时间)/进程数
cout<<"平均带权周转时间:"<<sumdaiquanzhouzhuantime/N<<endl; //总的进程的带权周转时间/进程数
printf("----------------------------------------------------------------\n");
}
到这就大功告成了,在主函数中执行这些函数就行了。
下面是总的代码(方便大家学习):
#include<iostream>
using namespace std;
#define N 5
struct PCB
{
char name[8];
int arrive_time;
int run_time;
int finish_time;
int zhouzhuan_time;
float daiquan_time;
};
float sumzhouzhuantime,sumdaiquanzhouzhuantime;
struct PCB pcb[N],temp;
void input(); //输入进程
void sort(); //对输入的进程按到达时间进行排序执行
void output(); //输出算法调度时间表
void main()
{
input();
sort( );
output();
}
void input()
{
int i;
cout<<"--------------------------------------"<<endl;
cout<<" FCFS调度算法 "<<endl;
cout<<"--------------------------------------"<<endl;
cout<<" 输入五个进程信息:"<<endl;
for ( i=0;i<N;i++)
{
printf("请输入进程名:\n" );
scanf("%s",pcb[i].name);
printf("请输入到达时间:");
scanf("%d",&pcb[i].arrive_time);
printf("请输入要运行时间:");
scanf("%d",&pcb[i].run_time);
}
cout<<"各进程:"<<endl;
for( i=0;i<N;i++)
{ printf("%s ",pcb[i].name);
printf("%d ",pcb[i].arrive_time);
printf("%d \n",pcb[i].run_time);
}
}
void sort()//按照到达时间对进程进行排序
{
for(int i=0;i<N-1;i++)
{
for(int j=i+1;j<N;j++)
{
if(pcb[i].arrive_time>pcb[j].arrive_time)
{
temp=pcb[i];
pcb[i]=pcb[j];
pcb[j]=temp;
}
}
}
}
void output()
{
int i;
cout<<"FCFS调度算法:"<<endl;
pcb[0].finish_time=pcb[0].arrive_time+pcb[0].run_time;
pcb[0].zhouzhuan_time=pcb[0].finish_time-pcb[0].arrive_time;
pcb[0].daiquan_time=(float)pcb[0].zhouzhuan_time/pcb[0].run_time;
for(i=1;i<N;i++)
{
if(pcb[i].arrive_time>pcb[i-1].finish_time)
{
pcb[i].finish_time=pcb[i].arrive_time+pcb[i].run_time;
pcb[i].zhouzhuan_time=pcb[i].run_time;
pcb[i].daiquan_time=(float)pcb[i].zhouzhuan_time/pcb[i].run_time;
}
else
{
pcb[i].finish_time=pcb[i-1].finish_time+pcb[i].run_time;
pcb[i].zhouzhuan_time=pcb[i].finish_time-pcb[i].arrive_time;
pcb[i].daiquan_time=(float)pcb[i].zhouzhuan_time/pcb[i].run_time;
}
}
for(i=0;i<N;i++)
{
sumzhouzhuantime+=pcb[i].zhouzhuan_time;
sumdaiquanzhouzhuantime+=pcb[i].daiquan_time;
}
printf("----------------------------------------------------------------\n");
printf("进程名 到达时间 运行时间 完成时间 周转时间 带权周转时间 \n");
printf("----------------------------------------------------------------\n");
for(i=0;i<N;i++)
{
printf(" %s %d %d %d %d %.2f\n",pcb[i].name,pcb[i].arrive_time,pcb[i].run_time,pcb[i].finish_time,pcb[i].zhouzhuan_time,pcb[i].daiquan_time);
}
cout<<"平均周转时间:"<<sumzhouzhuantime/N<<endl;
cout<<"平均带权周转时间:"<<sumdaiquanzhouzhuantime/N<<endl;
printf("----------------------------------------------------------------\n");
}
运行结果如下:
这段程序有个问题不能实现任意数量进程的输入,不就我就会更新。
小白还在学习阶段,有很多问题,希望大家能够指出,谢谢大家,一起加油!