2】時間片輪轉RR程序排程演算法
阿新 • • 發佈:2018-12-26
// 作業系統_實驗二(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; }