操作系统进程管理实验:FCFS和SFJ
程序员文章站
2022-07-05 12:19:30
...
FCFS
#include <iostream>
#include<string>
#include<algorithm>
#include<iomanip>
using namespace std;
int number;
typedef struct PCB {
char Name;//进程名
int ArriveTime;//到达时间
int ServerTime;//服务时间,运行时间
int StartTime;//开始时间
int FinishTime;//完成时间
int Turn_Over_Time;//周转时间
float Weighted_Turn_Over_Time;//带权周转时间
}pcb[1000];
PCB a[1000];
PCB b[1000];
bool compareFCFS(struct PCB a, struct PCB b)//比较函数
{
return a.ArriveTime < b.ArriveTime;
}
bool compareSJF(struct PCB a, struct PCB b)//比较函数
{
return a.ServerTime < b.ServerTime;
}
void FCFS(PCB a[]) //先来先服务
{
int i;
sort(a, a + number, compareFCFS);//排序
for (i = 0; i < number; i++)
{
if (i == 0) {
a[0].StartTime = a[0].ArriveTime;
a[0].FinishTime = a[0].ArriveTime + a[0].ServerTime;
a[0].Turn_Over_Time = a[0].FinishTime - a[0].ArriveTime; //周转时间 = 完成时间 - 到达时间
a[0].Weighted_Turn_Over_Time = a[0].Turn_Over_Time / a[0].ServerTime; //带权周转时间 = 周转时间 / 服务时间
}
else{
if (a[i - 1].FinishTime > a[i].ArriveTime) //比较上一个进程结束时间,和本进程到达时间
{
a[i].StartTime = a[i - 1].FinishTime; //开始时间 = 上一个进程的结束时间
}
else {
a[i].StartTime = a[i].ArriveTime; //开始时间 = 进程到达时间
}
a[i].FinishTime = a[i].StartTime + a[i].ServerTime; // 完成时间 = 开始时间 + 服务时间
a[i].Turn_Over_Time = a[i].FinishTime - a[i].ArriveTime; //周转时间 = 完成时间 - 到达时间
a[i].Weighted_Turn_Over_Time = a[i].Turn_Over_Time * 1.0 / a[i].ServerTime; //带权周转时间 = 周转时间 * 1.0 / 服务时间
}
}
cout << "进程名" << " " << "到达时间" << " " << "服务时间" << " " << "开始时间" << " " << "完成时间" << " " << "周转时间" << " " << "带权周转时间" << endl;
for (i = 0; i < number; i++)
{
cout <<" "<< a[i].Name << " " << a[i].ArriveTime << " " << a[i].ServerTime << " " << a[i].StartTime << " " << a[i].FinishTime << " " << a[i].Turn_Over_Time << " " << a[i].Weighted_Turn_Over_Time << endl;
}
}
int main()
{
int i;
cout << "请输入进程的数量" << endl;
/*cin >> number;
for (i = 0; i < number; i++) //将进程到达时间和服务时间输入程序
{
cout << "请输入进程" << i + 1 << "的进程名、到达时间和时间:";
cin >> a[i].Name >> a[i].ArriveTime >> a[i].ServerTime;
}
*/
number = 4;
a[0].Name = 'a';
a[0].ArriveTime = 1;
a[0].ServerTime = 2;
a[1].Name = 'b';
a[1].ArriveTime = 5;
a[1].ServerTime = 3;
a[2].Name = 'c';
a[2].ArriveTime = 2;
a[2].ServerTime = 7;
a[3].Name = 'd';
a[3].ArriveTime = 9;
a[3].ServerTime = 6;
FCFS(a); //先来先服务
return 0;
}
SFJ
#include <iostream>
#include<string>
#include<algorithm>
#include<iomanip>
using namespace std;
int number;
typedef struct PCB {
char Name;//进程名
int ArriveTime;//到达时间
int ServerTime;//服务时间,运行时间
int StartTime;//开始时间
int FinishTime;//完成时间
int Turn_Over_Time;//周转时间
float Weighted_Turn_Over_Time;//带权周转时间
}pcb;
PCB a[1000];
PCB b[1000];
bool compareServer(struct PCB p, struct PCB q)//比较函数
{
return p.ServerTime < q.ServerTime;
}
bool compareArriveTime(struct PCB p, struct PCB q)//比较函数
{
return p.ArriveTime < q.ArriveTime;
}
void SFJ(PCB b[]) {
int i;
b[0].StartTime = b[0].ArriveTime;
b[0].FinishTime = b[0].ArriveTime + b[0].ServerTime;
b[0].Turn_Over_Time = b[0].FinishTime - b[0].ArriveTime; //周转时间 = 完成时间 - 到达时间
b[0].Weighted_Turn_Over_Time = b[0].Turn_Over_Time / b[0].ServerTime; //带权周转时间 = 周转时间 / 服务时间
for (i = 1; i < number; i++)
{
if (b[i].ArriveTime < b[i - 1].FinishTime)
{
sort(b + i, b + number, compareServer);//除第一个进程,其余进程根据服务时间排序
b[i].StartTime = b[i - 1].FinishTime;
b[i].FinishTime = b[i].StartTime + b[i].ServerTime; // 完成时间 = 开始时间 + 服务时间
b[i].Turn_Over_Time = b[i].FinishTime - b[i].ArriveTime; //周转时间 = 完成时间 - 到达时间
b[i].Weighted_Turn_Over_Time = b[i].Turn_Over_Time * 1.0 / b[i].ServerTime; //带权周转时间 = 周转时间 * 1.0 / 服务时间
}
else {
sort(b + i, b + number, compareArriveTime);//除第一个进程,其余进程根据到达时间排序
b[i].StartTime = b[i].ArriveTime;
b[i].FinishTime = b[i].StartTime + b[i].ServerTime; // 完成时间 = 开始时间 + 服务时间
b[i].Turn_Over_Time = b[i].FinishTime - b[i].ArriveTime; //周转时间 = 完成时间 - 到达时间
b[i].Weighted_Turn_Over_Time = b[i].Turn_Over_Time * 1.0 / b[i].ServerTime; //带权周转时间 = 周转时间 * 1.0 / 服务时间
}
}
cout << "进程名" << " " << "到达时间" << " " << "服务时间" << " " << "开始时间" << " " << "完成时间" << " " << "周转时间" << " " << "带权周转时间" << endl;
for (i = 0; i < number; i++)
{
cout << " " << b[i].Name << " " << b[i].ArriveTime << " " << b[i].ServerTime << " " << b[i].StartTime << " " << b[i].FinishTime << " " << b[i].Turn_Over_Time << " " << b[i].Weighted_Turn_Over_Time << endl;
}
}
int main()
{
int i;
cout << "请输入进程的数量" << endl;
/*cin >> number;
for (i = 0; i < number; i++) //将进程到达时间和服务时间输入程序
{
cout << "请输入进程" << i + 1 << "的进程名、到达时间和时间:";
cin >> b[i].Name >> b[i].ArriveTime >> b[i].ServerTime;
}
*/
number = 4;
b[0].Name = 'a';
b[0].ArriveTime = 1;
b[0].ServerTime = 2;
b[1].Name = 'b';
b[1].ArriveTime = 5;
b[1].ServerTime = 3;
b[2].Name = 'c';
b[2].ArriveTime = 2;
b[2].ServerTime = 7;
b[3].Name = 'd';
b[3].ArriveTime = 9;
b[3].ServerTime = 6;
for (i = 0; i < number; i++)
{
a[i] = b[i];
}
SFJ(b);
}