欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

操作系统进程管理实验: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);
}