操作系统 FCFS先到先服务调度算法

//cpp文件


#include "stdafx.h"

void FCFS();//先到先服务调度算法
void  SJF();//短进程优先算法
void printProc();//输出进程的计算结果

struct process_type //进程结构
{
	int pid;
	int ArrivalTime;//到达时间
	int ServiceTime;//服务时间
	int StartTime;//开始时间
	int FinishTime;//完成时间
	int RoundTime;//周转时间
	double WeightRoundTime;//带权周转时间   
};

struct process_type proc[20];//申请20个进程控制块,内存中进程数最大值为20
int PNum, NowTime;//PNum表示进程数,NowTime表示当前的时刻

int SumRT = 0; //总周转时间
double SumWRT = 0; //总带权周转时间
int AverageRT = 0; //平均周转时间   
double AverageWRT = 0;//平均带权周转时间

void   main()
{
	int i, n;
	char a;
	n = 1;

	cout << "请输入进程个数:";
	cin >> PNum;
	for (i = 0;i<PNum;i++)
	{
		cout << "请输入第" << i + 1 << "个进程的pid,到达时间和服务时间:" << endl;
		cin >> proc[i].pid;
		cin >> proc[i].ArrivalTime;
		cin >> proc[i].ServiceTime;
	}

	while (n == 1)
	{
		cout << "\n********************************************";
		cout << "\n*               CPU调度演示系统            *";
		cout << "\n********************************************";
		cout << "\n           1.FCFS        2.SJF        3.退出";
		cout << "\n********************************************";
		cout << "\n请选择(~)";
		cin >> a;

		//		a=getchar();
		switch (a)
		{
		case'1':
			FCFS();
			printProc();
			break;
		case'2':
			SJF();
			printProc();
			break;
		case'3':
			exit(0);
		default:
			n = 0;
		}
	}
}

void printProc()//输出进程的计算结果
{
	cout << endl << "进程pid\t到达时间\t服务时间\t周转时间\t带权周转时间\n";//逐个输出每一个进程的相关数据

	for (int i = 0;i<PNum;i++)
	{
		cout << endl << proc[i].pid << "\t" << proc[i].ArrivalTime << "\t\t" << proc[i].ServiceTime << "\t\t" << proc[i].RoundTime << "\t\t" << proc[i].WeightRoundTime;
		SumRT += proc[i].RoundTime;
		SumWRT += proc[i].WeightRoundTime;
	}
	/*计算平均周转时间*/
	AverageRT = SumRT / PNum;
	/*计算平均带权周转时间*/
	AverageWRT = SumWRT / PNum;
	cout << "\n平均周转时间:" << AverageRT << "\t" << "\t平均带权周转时间:" << AverageWRT << endl;//输出平均周转时间和平均带权周转时间
}

void FCFS()
{
	int i, j;
	for (i = 0;i<PNum;i++)//按进程到达时间的先后排序
	{                                  
		for (j = 0;j<PNum - i - 1;j++)
		{
			if (proc[j].ArrivalTime>proc[j + 1].ArrivalTime)
			{
				/*	  填写代码   */
				int a = proc[j + 1].ArrivalTime;
				int b = proc[j + 1].RoundTime;
				int c = proc[j + 1].pid;

				proc[j + 1].ArrivalTime =  proc[j].ArrivalTime;
				proc[j + 1].RoundTime   =  proc[j].RoundTime;
				proc[j + 1].pid         =  proc[j].pid;

				proc[j].ArrivalTime =  a;
				proc[j].RoundTime =  b;
				proc[j].pid =  c;


			}
		}
	}
	



	for (i = 0;i<PNum;i++)
	{
		if (i == 0)
		{
			/*计算开始时间*/
			proc[i].StartTime = 0;

			/*计算结束时间*/
			proc[i].FinishTime = proc[i].StartTime + proc[i].ServiceTime;
		}
		else
		{
			if (proc[i].ArrivalTime<proc[i - 1].FinishTime)
			{
				/*计算结束时间*/
				proc[i].StartTime = proc[i - 1].FinishTime;//开始时间等于上一个进程的结束时间
				proc[i].FinishTime = proc[i].StartTime + proc[i].ServiceTime;//结束时间等于开始时间加上服务时间

			}
			else
			{
				/*计算结束时间*/
				proc[i].StartTime = proc[i].ArrivalTime;//如果在前一个进程结束之后到达,则开始时间等于到到达时间
				proc[i].FinishTime = proc[i].StartTime + proc[i].ServiceTime;//结束时间等于开始时间加上服务时间
			}
		}



	

		printf("进程%d从%d开始,在%d时刻结束\n", proc[i].pid, proc[i].StartTime, proc[i].FinishTime);

		proc[i].RoundTime = proc[i].FinishTime - proc[i].ArrivalTime;//周转时间
		proc[i].WeightRoundTime = proc[i].RoundTime / proc[i].ServiceTime;//带权周转时间

		proc[i + 1].StartTime = proc[i].FinishTime;
	}
	//	printProc();
}

void SJF()
{

}

//头文件
// stdafx.h : 标准系统包含文件的包含文件,
// 或是经常使用但不常更改的
// 特定于项目的包含文件
//

#pragma once

#include "targetver.h"

#include <stdio.h>
#include <tchar.h>



// TODO:  在此处引用程序需要的其他头文件

#include "stdafx.h"
#include <iostream>
#include "conio.h"
#include "stdio.h"
#include "stdlib.h"

using namespace std;





posted @ 2018-04-26 20:50  hunterxing  阅读(962)  评论(0编辑  收藏  举报