实验一
【实验题目】:先来先服务FCFS和短作业优先SJF进程调度算法
【实验目的】
通过这次实验,加深对进程概念的理解,进一步掌握进程状态的转变、进程调度的策略及对系统性能的评价方法。
【实验内容及要求】
算法思路:
先来先服务FCFS: 当在作业中采用该算法时,系统将按照作业到达的先后次序来进行调度。每次调度是从就绪的进程队列中选择一个最先进入该队列的进程,为之分配处理机,使之投入运行。该进程一直运行到完成或发生某事件而阻塞后,进程调度程序才将处理机分配给其他进程。
有利于长作业(进程)而不利于短作业(进程)
有利于CPU繁忙型作业(进程)而不利于I/O繁忙型作业(进程)
短作业优先SJF:SJF算法是以作业的长短来计算优先级,作业越短其优先级越高。当把短作业优先算法用于作业调度时,它将从作业的后备队列中选择若干个估计运行时间最短的作业,优先将它们调入内存运行.
比FCFS改善平均周转时间和平均带权周转时间,缩短作业的等待时间;
对长作业非常不利,可能长时间得不到执行;
未能依据作业的紧迫程度来划分执行的优先级;
难以准确估计作业(进程)的执行时间,从而影响调度性能。
问题描述:
设计程序模拟进程的先来先服务FCFS和短作业优先SJF调度过程。假设有n个进程分别在T1, … ,Tn时刻到达系统,它们需要的服务时间分别为S1, … ,Sn。分别采用先来先服务FCFS和短作业优先SJF进程调度算法进行调度,计算每个进程的完成时间,周转时间和带权周转时间,并且统计n个进程的平均周转时间和平均带权周转时间。
程序要求如下:
1)进程个数n;每个进程的到达时间T1, … ,Tn和服务时间S1, … ,Sn;选择算法1-FCFS,2-SJF。
2)要求采用先来先服务FCFS和短作业优先SJF分别调度进程运行,计算每个进程的周转时间,带权周转时间,并且计算所有进程的平均周转时间,带权平均周转时间;
3)输出:要求模拟整个调度过程,输出每个时刻的进程运行状态,如“时刻3:进程B开始运行”等等;
4)输出:要求输出计算出来的每个进程的周转时间,带权周转时间,所有进程的平均周转时间,带权平均周转时间。
周转时间=结束时间-到达时间
带权周转时间=周转时间/服务时间
【流程图】
【实验结果】
核心代码:
FCFS:
SJF:
【源代码】
#include <iostream>
#include <iomanip>
using namespace std;
#define MaxNum 100//允许的最大进程数
typedef struct{
char ID;//进程名字
int ArrivalTime;//到达时间
int ServiceTime;//服务时间
int ServiceTime_SJF;//SJF排序用的服务时间
int FinishTime;//完成时间
int ExecuteTime;//各进程的开始执行时间
int WholeTime;//周转时间
double WeightWholeTime;//带权周转时间
}PRO;
static int n=0;//进程数
static PRO pro[100]; //进程结构体
static PRO temp; //进程结构
static int choose;//算法选择
static double AverageWT_FCFS=0,AverageWT_SJF=0;//FCFS和SJF的平均周转时间
static double AverageWWT_FCFS=0,AverageWWT_SJF=0;//FCFS和SJF的平均带权周转时间
static double SumWT_FCFS=0,SumWT_SJF=0;//FCFS、SJF中的周转时间总和
static double SumWWT_FCFS=0,SumWWT_SJF=0;;//FCFS、SJF中的带权周转时间总和
void Input();//输入进程数、各进程到达、服务时间
void sortArrivalTime();//根据达时间排序
void sortServiceTime();//已到达的进程服务时间排序
void calculationInitTime(int i);//计算第一个进程的各个时间
void calculationTime(int i);//计算
void display(int b);//输出
void outTimeState(int b);//输出各时间状态
void chooseAlgorithm();//选择算法
void FCFS();
void SJF();
//输入进程数、各进程到达、服务时间
void Input() {
cout<<"请输入作业(进程)个数n:";
cin>>n;
cout<<"请分别输入每个进程的到达时间(空格隔开):"<<endl;
for (int i=0;i<n;i++)
{
cin>>pro[i].ArrivalTime;//调用结构体,对到达时间赋值
}
cout<<"请分别输入每个进程的服务时间(空格隔开):"<<endl;
for (i=0;