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.elem[i].ServiceTime;  /* code */}
}int main(){       Sqlist L;InitList_sq(L);Create_Sq(L);Display(L); Elect(L); system("pause");return 0 ;}void Elect(Sqlist &L){int choice,flag=1;cout<<"Please select the algorithm: 1-FCFS     2-SJF"<<endl;cin>>choice;while(flag){if(choice==1){FCFS(L);//先来先服务算法flag=0;  }else if(choice==2){SJF(L);//短作业优先算法  flag=0;  }elsecout<<"Your choice input error, please re-enter!"<<endl; /* code */                  }}     void Display(Sqlist &L){cout<<"********************************************"<<endl;cout<<"The number of processes input by user  is n="<<L.n<<endl;cout<<"The arrivaltime entered by the user is as follows:"<<endl;for (int i =0; i <L.n; i++){          cout<<L.elem[i].ArrivalTime<<" ";}cout<<endl;cout<<"The servicetime of the user is as follows:"<<endl;for (int i =0; i <L.n; i++){cout<<L.elem[i].ServiceTime<<" ";  /* code */} cout<<endl;cout<<"********************************************"<<endl;}void FCFS(Sqlist &L)//先来先服务算法 {//排序算法+选择算法实现FCFSint arr[L.n]={0};for(int i = 0; i < L.n; i++ ){arr[i]=L.elem[i].ArrivalTime;}for (int i = 0; i <L.n; i++)//冒泡排序{for (int j = 0; j <L.n -  i - 1; j++){if (arr[j] > arr[j + 1]){int temp;temp = arr[j + 1];arr[j + 1] = arr[j];arr[j] = temp;}}}cout<<" process informantion :"<<endl;cout<<"ProcessID"<<"\t" <<"arrivaltime"<<"\t"<<"servertime "<<"\t" <<"FinishTime"<<"\t" <<"WholeTime"<<"\t" <<"WeightWholeTime"<<endl;int  j=0,temp=10;for(int i = 0; i < L.n; i++)          {for (j = 0; i <  L.n; j++)//取出最小的达到时间,即是最先{if(arr[i]==L.elem[j].ArrivalTime&&L.elem[j].isFinished_FCFS!=1)break;}if(L.elem[j].ArrivalTime<temp&&i!=0)//判断此进程到达时cpu资源是否空闲L.elem[j].StratTime=temp;elseL.elem[j].StratTime= L.elem[j].ArrivalTime;//说明不空闲,立即执行L.elem[j].isFinished_FCFS=1;//该进程已经访问完成         L.elem[j].FinishTime=L.elem[j].StratTime+L.elem[j].ServiceTime;L.elem[j].WholeTime=L.elem[j].StratTime+L.elem[j].ServiceTime-L.elem[j].ArrivalTime;L.elem[j].WeightWholeTime=(L.elem[j].StratTime+L.elem[j].ServiceTime-L.elem[j].ArrivalTime)*1.0/L.elem[j].ServiceTime;temp=L.elem[j].StratTime+L.elem[j].ServiceTime;//临时存放进程的完成时间,作为下一个进程的开始时间  }for( j = 0; j < L.n; j++){cout<<L.elem[j].ProcessId<<"\t\t" <<L.elem[j].ArrivalTime<<"\t\t"<<L.elem[j].ServiceTime<<"\t\t" << L.elem[j].FinishTime<<"\t\t" << L.elem[j].FinishTime-L.elem[j].ArrivalTime<<"\t\t" <<(L.elem[j].FinishTime-L.elem[j].ArrivalTime)*1.0/L.elem[j].ServiceTime<<endl; AveWholeTime=L.elem[j].WholeTime+AveWholeTime;AveWeightWholeTime=L.elem[j].WeightWholeTime+AveWeightWholeTime;} cout<<" The AverageWholeTime is "<<AveWholeTime*1.0/L.n<<endl;cout<<" The AverageWeightWholeTime is "<<AveWeightWholeTime*1.0/L.n<<endl;}void SJF(Sqlist &L)//短作业优先算法{         int i,j,s;for ( i = 0; i < L.n; i++)//初始化缓冲区{B[i].buffer_location=MaxNum;B[i].buffer_server=MaxNum;} int flag_ar=0;int minat=MaxNum,location=MaxNum,minser=MaxNum;while(flag_count!=L.n){flag_count=0;for ( i = 0; i < L.n; i++){if (B[i].buffer_server== MaxNum)//说明缓冲区此时没有数据,CPU资源空闲,{count=1+count;}}if(count==L.n) //说明缓冲区此时没有数据,CPU资源空闲,{for ( i = 0; i < L.n; i++){if(L.elem[i].ArrivalTime<minat && L.elem[i].isFinished_SJF!=1){minat=L.elem[i].ArrivalTime;location=i;minser=L.elem[i].ServiceTime;}}//找到最小的到达时间L.elem[location].isFinished_SJF=1;L.elem[location].Buffer_Location=k;B[k].buffer_location=location;B[k].buffer_server=minser;k=k+1;//找到最小的到达时间,并让其进入缓冲区for ( j = 0; j < L.n; j++){if(L.elem[j].ArrivalTime==minat && L.elem[j].isFinished_SJF!=1) {flag_ar=1;//标志位为1,说明另一个进程也有相同的到达时间minat=L.elem[j].ArrivalTime;location=j;minser=L.elem[j].ServiceTime;L.elem[location].isFinished_SJF=1;B[k].buffer_location=location;B[k].buffer_server=minser;L.elem[j].Buffer_Location=k;k=k+1;//说明另一个进程也有相同的到达时间,并让其进入缓冲区}}//说明另一个进程也有相同的到达时间count=0; minat=MaxNum,location=MaxNum,minser=MaxNum;}else{        location=MaxNum,minser=MaxNum;//说明缓冲区此时有数据,CPU资源不空闲,for ( i = 0; i < k; i++){if(B[i].buffer_server<minser){location=B[i].buffer_location;minser=B[i].buffer_server;}}//找到最小的服务时间service并进行调用if(L.elem[location].ArrivalTime>=waiting)L.elem[location].StratTime=L.elem[location].ArrivalTime;// 进程的开始时间????elseL.elem[location].StratTime=waiting;            L.elem[location].FinishTime=L.elem[location].StratTime+L.elem[location].ServiceTime;L.elem[location].WholeTime=L.elem[location].FinishTime-L.elem[location].ArrivalTime;L.elem[location].WeightWholeTime=L.elem[location].WholeTime/L.elem[location].ServiceTime;                B[L.elem[location].Buffer_Location].buffer_server=MaxNum;//退出缓冲区,清除其在缓冲区的数据waiting=L.elem[location].FinishTime;//更新等待时间for ( j = 0; j < L.n; j++){if(L.elem[j].ArrivalTime<=waiting && L.elem[j].isFinished_SJF!=1){L.elem[j].isFinished_SJF=1;B[k].buffer_location=j;B[k].buffer_server=L.elem[j].ServiceTime;L.elem[j].Buffer_Location=k;k=k+1;}}//在此进程的完成时间内,有没有新的进程进入,有的话进入缓冲区 count=0;                                 }//此对应elsefor (int h = 0; h < L.n; h++){if (L.elem[h].isFinished_SJF==1 && B[h].buffer_server==MaxNum){flag_count=flag_count+1;}               }              } cout<<" process informantion :"<<endl;cout<<"ProcessID"<<"\t" <<"arrivaltime"<<"\t"<<"servertime "<<"\t" <<"FinishTime"<<"\t" <<"WholeTime"<<"\t" <<"WeightWholeTime"<<endl;for( j = 0; j < L.n; j++){cout<<L.elem[j].ProcessId<<"\t\t" <<L.elem[j].ArrivalTime<<"\t\t"<<L.elem[j].ServiceTime<<"\t\t" << L.elem[j].FinishTime<<"\t\t" << L.elem[j].FinishTime-L.elem[j].ArrivalTime<<"\t\t" <<(L.elem[j].FinishTime-L.elem[j].ArrivalTime)*1.0/L.elem[j].ServiceTime<<endl; AveWholeTime=L.elem[j].WholeTime+AveWholeTime;AveWeightWholeTime=L.elem[j].WeightWholeTime+AveWeightWholeTime;}cout<<" The AverageWholeTime is "<<AveWholeTime*1.0/L.n<<endl;cout<<" The AverageWeightWholeTime is "<<AveWeightWholeTime*1.0/L.n<<endl; }

运行截图:

FCFS算法和SJF算法相关推荐

  1. BF算法和KMP算法

    给定两个字符串S和T,在主串S中查找子串T的过程称为串匹配(string matching,也称模式匹配),T称为模式.这里将介绍处理串匹配问题的两种算法,BF算法和KMP算法. BF算法 (暴力匹配 ...

  2. Algorithm:C++语言实现之字符串相关算法(字符串的循环左移、字符串的全排列、带有同个字符的全排列、串匹配问题的BF算法和KMP算法)

    Algorithm:C++语言实现之字符串相关算法(字符串的循环左移.字符串的全排列.带有同个字符的全排列.串匹配问题的BF算法和KMP算法) 目录 一.字符串的算法 1.字符串的循环左移 2.字符串 ...

  3. 操作系统之存储管理——FIFO算法和LRU算法

    操作系统之进程调度--优先权法和轮转法(附上样例讲解) 操作系统之银行家算法-详解流程及案例数据 操作系统之多线程编程-读者优先/写者优先详解 操作系统之存储管理--FIFO算法和LRU算法 操作系统 ...

  4. 若S作主串,P作模式串,试分别写出利用BF算法和KMP算法的匹配过程。

    目   录 题目: 百度文库-答案: (1) (2) MOOC标准答案: (1) (2) mooc答案-截图: 数据结构(C语言版)-严蔚敏2007 题目: 设字符串S='aabaabaabaac', ...

  5. Prim算法和Kruskal算法

       Prim算法和Kruskal算法都能从连通图找出最小生成树.区别在于Prim算法是以某个顶点出发挨个找,而Kruskal是先排序边,每次选出最短距离的边再找. 一.Prim(普里姆算法)算法: ...

  6. 基于Huffman算法和LZ77算法的文件压缩的改进方向

    基于Huffman算法和LZ77算法的文件压缩(八) 到这里已经简单实现基于Huffman算法和LZ77算法的文件压缩, GitHub源码:点我 根据基于Huffman算法和LZ77算法的文件压缩(七 ...

  7. 最短路径Dijkstra算法和Floyd算法整理、

    转载自:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html 最短路径-Dijkstra算法和Floyd算法 Dijks ...

  8. 用Spark学习FP Tree算法和PrefixSpan算法

    在FP Tree算法原理总结和PrefixSpan算法原理总结中,我们对FP Tree和PrefixSpan这两种关联算法的原理做了总结,这里就从实践的角度介绍如何使用这两个算法.由于scikit-l ...

  9. 游戏中DDA算法和Bresenham算法的应用

    在角色扮演或即时战略游戏中,经常会将角色以最佳的方式走到指定地点.游戏场景的地面情况复杂,而且场面大,若采用盲目式搜索,例如盲目穷举法,则几乎要遍历整个场景,效率非常低,造成角色反应速度过慢,实践证明 ...

最新文章

  1. 获取远程数据本地缓存到PHP数组
  2. 微信扫码支付官方配置(一)
  3. Linux就应该这么学第七课-文件的特殊权限
  4. 图像处理的交并比(IoU)
  5. java jdbc连接db2数据库_Java连接db2数据库(常用数据库连接五)
  6. Android设计模式之——迭代器模式
  7. 查看python进程_[原创] 如何查看一个Python进程在”干什么”: py-spy 来帮忙 – 编码无悔 / Intent Focused...
  8. java语音播放事例
  9. 删除一个目录下的所有文件,但保留一个指定文件
  10. jqgrid 行选中multiboxonly属性说明
  11. 大数据发展现状和趋势
  12. linux qt 屏幕亮度,调整14.04.1 屏幕亮度
  13. html照片苹果手机,iPhone如何拍出漂亮唯美的照片
  14. 交错、反交错与IVTC —— 从入门到放弃
  15. 安装office 错误代码:30068-39
  16. LABVIEW语音识别
  17. Android 小贴士播报
  18. vue前端路由和异步组件
  19. GMS认证环境搭建-终极篇
  20. 如何用Qt展示你的GIF动图

热门文章

  1. Win7 无法用win+R打开dos命令窗口的问题
  2. 酒吧流行游戏不完全手册
  3. iptables流量中转
  4. 计算机视觉基础之数字图像(2)
  5. html怎么制作公告滚动字幕,实现公告文字轮播效果
  6. NCC单据追溯上游单据(后台)
  7. 华为云虚拟专用网络VPN,助力现代企业云上业务创新发展 为助力企业实现创新发展
  8. 手机系统日历如何与备忘录中的待办任务联动同步
  9. jQuery简单备忘录功能的日历插件
  10. Android 本地缓存开源库 Reservoir 替代SharedPreferences