FCFS算法和SJF算法(非抢占式)
此处主要说一下SJF算法,FCFS算法仅仅按到达时间选择或者排序即可
SJF算法设计思路:
我看了看大多数人写的SJF算法,有些用的是排序算法,虽然能做出来,但是在CPU调用期间,CPU并不知道接下来一段时间,要运行进程的数量,并且如果选用排序算法,我们不能衡量CPU资源是否是空闲的,换句话说,此处的排序算法是一种静态算法,本设计思路没有用排序算法,而是选用缓冲区,所以我在此处设置一个缓冲区,如果缓冲区中没有进程,那么CPU资源就是空闲的,说明没有进程调用,如果缓冲区有进程,那么选择其中服务时间最小的一个,在执行完毕后清除该进程在缓冲区的信息,同时观察在该进程结束时,有没有新的进程来临,如果有,进入缓冲区,继续调用,直至缓冲区中没有数据以及所有进程调用完毕。
执行流程:
①在CPU资源空闲时,扫描所有,选取arrivaltime最小的进程,如果有两或者两以上个相同的arrivaltime最小,那么取其中servertime最小的一个,即是第一个调用的进程,与其相同的到达时间的进程将进入缓冲区,将进入缓冲区的进程的Isfinisntime_SIF置为1。
②该进程执行完毕后,清除其在缓冲区的进程信息,并进行检索,在调用的进程的starttime+servertime=finishtime完成时间内,如果有新来的进程也会进入缓冲区,也就是新来的进程的arrivaltime<被调用进程的finishtime,将进入缓冲区的进程的Isfinisntime_SIF置为1。
③之后选择缓冲区所有进程服务时间最小的的一个,将其调用执行,之后,重复步骤②,直至缓冲区没有进程信息,但是此处并不代表算法的结束,毕竟,有的进程可能来临时间极慢(例如表中C,D的到达时间为20,在B执行完后,CPU资源是空闲的,所以结束的标志是缓冲区没有信息并且所有进程的Isfinisntime_SIF=1)那么判断结束标志,如果满足,算法结束;如果不满足,重复调用①②③,直至满足算法结束条件。
PS:数据结构用的顺序表,懒的写了,直接套用之前的,注释写的可能乱
下面是代码:
#include <iostream> //冗余???
#include <stdio.h>
#include <stdlib.h>
#include <queue> //直接调已封装的队列
using namespace std;
#define OK 1
#define ERROR -1
#define MaxNum 100 //即是最大允许100个进程,编号最大也为100
#define OVERFLOW -3
typedef struct
{
int ProcessId ;//进程id
int ArrivalTime; //到达时间
int ServiceTime; //服务时间
int FinishTime; //完成时间
int WholeTime; //周转时间
int StratTime;//开始执行时间
int Buffer_Location;
double WeightWholeTime; //带权周转时间
bool isFinished_FCFS;//标志位,是否已经完成
bool isFinished_SJF;//标志位,是否已经完成
}PCB;
typedef struct
{
PCB *elem;
int n;//进程数目,也是顺序表的长度
}Sqlist; //顺序表数据
typedef struct //缓冲池存有部分进程的数据
{
int buffer_server;//该进程的服务时间
int buffer_location;//该进程在L表中的位置
}Buffer;//
int waiting=0;//等待时间
int count=0;//计数,由此查看缓冲区是否为空
double AveWholeTime=0; //平均周转时间=作业周转时间/作业个数
double AveWeightWholeTime=0; //平均带权周转时间=带权周转总时间/作业个数
Buffer B[MaxNum];
int flag_count=0;
int k=0;
void SJF_Buffer(Sqlist &L);//缓冲区函数
void Elect(Sqlist &L);
void Display(Sqlist &L);
void SJF(Sqlist &L);//短作业优先算法
void FCFS(Sqlist &L);//先来先服务算法
int InitList_sq(Sqlist &L) //初始化顺序表
{
L.elem=new PCB[MaxNum];//分配内存,数组指针
if(!L.elem) //首地址为空时,l.elem=0,!0=1.即执行
{
printf("allocation failed");
exit(OVERFLOW);//失败时函数结束
}
L.n=0;
return ERROR;
}
void Create_Sq(Sqlist &L) //依次从键盘读入数据,建立顺序表;
{
cout<<" Please enter the number of processes:"<<endl;
cin>>L.n;
cout<<"Please enter the arrivaltime of each process separately:"<<endl;
for (int i =0; i <L.n; i++)
{
L.elem[i].ProcessId=i+1;
cin>>L.elem[i].ArrivalTime;
L.elem[i].isFinished_FCFS=0;
L.elem[i].isFinished_SJF=0;
}
cout<<"Please input the servicetime of each process separately"<<endl;
for (int i =0; i <L.n; i++)
{
cin>>L.