1. 程式人生 > >2】時間片輪轉RR程序排程演算法

2】時間片輪轉RR程序排程演算法

// 作業系統_實驗二(RR排程演算法).cpp : 定義控制檯應用程式的入口點。
//
#include <iostream>
#include <queue>
#include <iomanip>
#include <fstream>
using namespace std;

typedef struct  
{
	char name;
	int ArrivalTime;
	int ServiceTime;
	int FinishedTime;
	int WholeTime;
	double WeightWholeTime;
}RR;

static queue<RR>RRqueue;  //宣告一個佇列
static double AverageWT =0,AverageWWT=0;
static int q;  //時間片
static int n;  //程序個數
static RR RRarray[100];  //程序結構

void Input()
{
	//檔案讀取模式
	ifstream inData;
	inData.open("./data4.txt");
	//data.txt表示q = 4的RR排程演算法
	//data2.txt表示q = 1的RR排程演算法
	inData>>n;
	inData>>q;

	for (int i=0;i<n;i++)
	{
		inData>>RRarray[i].name;
	}
	for (int i=0;i<n;i++)
	{
		inData>>RRarray[i].ArrivalTime;
	}
	for (int i=0;i<n;i++)
	{
		inData>>RRarray[i].ServiceTime;
	}


	//使用者輸入模式
	//cout<<"****************************************************************"<<endl;

	//cout<<"please input the number of process n = ";
	//cin>>n;
	//cout<<"please input the number of timeSlice q = ";
	//cin>>q;

	//cout<<"please input the name of process:"<<endl;
	//for (int i=0;i<n;i++)
	//{
	//	cin>>RRarray[i].name;
	//}

	//cout<<"please input the ArrivalTime of process:"<<endl;
	//for (int i=0;i<n;i++)
	//{
	//	cin>>RRarray[i].ArrivalTime;
	//}

	//cout<<"please input the ServiceTime of process:"<<endl;
	//for (int i=0;i<n;i++)
	//{
	//	cin>>RRarray[i].ServiceTime;
	//}

	cout<<"****************************************************************"<<endl;

	//輸出使用者所輸入的資訊
	cout<<"The information of processes is the following:"<<endl;
	cout<<setw(10)<<"processName"<<" ";
	cout<<setw(10)<<"ArrivalTime"<<" ";
	cout<<setw(10)<<"ServiceTime"<<" "<<endl;
	for (int i=0;i<n;i++)
	{
		cout<<setw(10)<<RRarray[i].name<<" ";
		cout<<setw(10)<<RRarray[i].ArrivalTime<<" ";
		cout<<setw(10)<<RRarray[i].ServiceTime<<" "<<endl;
	}
	cout<<"****************************************************************"<<endl;
}

void RRAlgorithm()
{
	char processMoment[100];   //儲存每個時間片p對應的程序名稱
	RRqueue.push(RRarray[0]);

	int processMomentPoint = 0;
	int CurrentTime=0;
	int tempTime;   //宣告此變數控制CurrentTime的累加時間,當前程序的服務時間小於時間片q的時候,起到重要作用
	int i=1;  //指向還未處理的程序的下標
	int finalProcessNumber = 0;   //執行RR演算法後,程序的個數
	int processTime[50];

	//CurrentTime的初始化
	if (RRarray[0].ServiceTime>=q)
	{
		CurrentTime = q;
	}
	else
	{
		CurrentTime = RRarray[0].ServiceTime;
	}

	while(!RRqueue.empty())
	{	
		for (int j=i;j<n;j++)   //使得滿足程序的到達時間小於當前時間的程序都進入佇列
		{
			if (RRarray[j].name!=NULL && CurrentTime >= RRarray[j].ArrivalTime) 
			{
				RRqueue.push(RRarray[j]);
				i++;
			}
		}
		if (RRqueue.front().ServiceTime<q)
		{
			tempTime = RRqueue.front().ServiceTime;
		}
		else
		{
			tempTime = q;
		}

		RRqueue.front().ServiceTime -= q;   //程序每執行一次,就將其服務時間 -q

		//將隊首程序的名稱放入陣列中
		processMoment[processMomentPoint] = RRqueue.front().name;
		processMomentPoint++;
		processTime[finalProcessNumber] = tempTime;
		finalProcessNumber++;


		if (RRqueue.front().ServiceTime <= 0)  //把執行完的程序退出佇列
		{
			//RRqueue.front().FinishedTime = CurrentTime;
			RRqueue.pop();   //如果程序的服務時間小於等於,即該程序已經服務完了,將其退棧

		}
		else
		{
			//將隊首移到隊尾
			RRqueue.push(RRqueue.front());
			RRqueue.pop();
		}
		CurrentTime += tempTime;	
											
	}

	//程序輸出處理   每個時間段對應的執行的程序
	cout<<"各程序的執行時刻資訊:"<<endl;
	cout<<"  "<<"0時刻 --> "<<setw(2)<<processTime[0]<<"時刻";
	processTime[finalProcessNumber]=0;
	int time = processTime[0];

	int count = 0;

	for (int i=0;i<finalProcessNumber;i++)
	{		
		count = 0;
		cout<<setw(3)<<processMoment[i]<<setw(3)<<endl;

		while(RRarray[count].name!=processMoment[i] && count<n)
		{
			count++;
		}
		RRarray[count].FinishedTime = time;

		if (i<finalProcessNumber - 1)
		{
			cout<<setw(3)<<time<<"時刻"<<" --> "<<setw(2)<<time + processTime[i+1]<<"時刻"<<setw(3);
			time += processTime[i+1];		
		}

	}
	cout<<endl;

	//週轉時間、帶權週轉時間、平均週轉時間、帶權平均週轉時間的計算
	//1. 週轉時間 = 完成時間 - 到達時間
	//2. 帶權週轉時間 = 週轉時間/服務時間

	for (int i=0;i<n;i++)
	{
		RRarray[i].WholeTime = RRarray[i].FinishedTime - RRarray[i].ArrivalTime;
		RRarray[i].WeightWholeTime = (double)RRarray[i].WholeTime/RRarray[i].ServiceTime;
	}

	double x=0,y=0;
	for (int i=0;i<n;i++)
	{
		x += RRarray[i].WholeTime;
		y += RRarray[i].WeightWholeTime;
	}

	AverageWT = x/n;
	AverageWWT = y/n;

}

void display()
{
	cout<<"******************************************************"<<endl;
	cout<<"RR排程演算法執行後:程序相關資訊如下:"<<endl;
	cout<<setw(10)<<"程序名(ID)"<<" ";
	cout<<setw(10)<<"到達時間"<<" ";
	cout<<setw(10)<<"服務時間"<<" ";
	cout<<setw(10)<<"完成時間"<<" ";
	cout<<setw(10)<<"週轉時間"<<" ";
	cout<<setw(10)<<"帶權週轉時間"<<endl;
	for (int i = 0;i<n;i++)
	{
		cout<<setw(10)<<RRarray[i].name<<" ";
		cout<<setw(10)<<RRarray[i].ArrivalTime<<" ";
		cout<<setw(10)<<RRarray[i].ServiceTime<<" ";
		cout<<setw(10)<<RRarray[i].FinishedTime<<" ";
		cout<<setw(10)<<RRarray[i].WholeTime<<" ";
		cout<<setw(10)<<RRarray[i].WeightWholeTime<<" "<<endl;;
	}
	cout<<"所有程序的平均週轉時間 = "<<AverageWT<<endl;
	cout<<"所有程序的平均帶權週轉時間 = "<<AverageWWT<<endl;
	cout<<"******************************************************"<<endl;
}

int main()
{
	Input();
	RRAlgorithm();
	display();
	system("pause");
	return 0;
}