FCFS算法和SJF算法

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.
  • 3
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值