C++實現FCFS,SJF,Round_Robin
阿新 • • 發佈:2018-12-26
測試用input.txt 四個數字依次為程序編號 程序到達時間 程序需要時間 程序優先順序
1 0 79 1
2 184 49 0
3 135 52 2
4 128 65 1
5 197 98 0
6 112 10 2
7 298 6 1
8 112 72 0
9 38 47 2
10 236 100 1
程式碼部分
#include <iostream>
#include <fstream>#include <string>
using namespace std;
struct Process {
int num;
int ReadyTime;
int time;
int Priority;
};
void PaiXuReadyTime(Process *a,int n)
{
int i = 0, j = 0, k = 0;
for (i = 0; i < n - 1; i++)
{
k = i;
for (j = i + 1; j < n; j++)
{
if (a[k].ReadyTime > a[j].ReadyTime)
{
k = j;
}
}
if (k != i)
{
Process tmp = a[k];
a[k] = a[i];
a[i] = tmp;
}
}
}
void PaiXuTime(Process *a, int n)
{
int i = 0, j = 0, k = 0;
for (i = 0; i < n - 1; i++)
{
k = i;
for (j = i + 1; j < n; j++)
{
if (a[k].time > a[j].time)
{
k = j;
}
}
if (k != i)
{
Process tmp = a[k];
a[k] = a[i];
a[i] = tmp;
}
}
}
void ShortestJobFirst(Process * p,int n)
{
Process *a = new Process[n];
for (int q = 0; q < n; q++)
{
a[q] = p[q];
}
PaiXuReadyTime(a, n);
int *TimeSequence = new int[n + 1];
TimeSequence[0] = a[0].ReadyTime;
for(int m = 0; m < n; m++)
{
TimeSequence[m + 1] = TimeSequence[m] + a[m].time;
Process *TempSequence = new Process[n];
int nfTS = 0;
for (int f = m + 1; f < n; f++)
{
if (/*(a[f].ReadyTime >= TimeSequence[m]) && */(a[f].ReadyTime <= TimeSequence[m + 1]))
{
TempSequence[nfTS] = a[f];
nfTS++;
}
}
PaiXuTime(TempSequence, nfTS);
if (nfTS > 0)
{
Process lalala = a[m + 1];
a[m + 1] = TempSequence[0];
for (int i = m+2; i < n; i++)
{
if (TempSequence[0].num == a[i].num)
a[i] = lalala;
}
}
}
cout << "SJF" << endl;
for (int i = 0; i < n; i++)
{
cout << a[i].num << " " << a[i].ReadyTime << " " << a[i].time << " " << a[i].Priority << " " << TimeSequence[i + 1] << " " << endl;
}
//計算平均週轉時間
float sum = 0;
for (int i = 0; i < n; i++)
{
//cout << TimeSequence[i] << " - " << a[i].ReadyTime << endl;
sum = sum + TimeSequence[i] - a[i].ReadyTime + a[i].time;
}
sum = sum / n;
cout << "Average turn around time is " << sum << endl;
cout << endl;
}
void FCFS(Process * p,int n)
{
int i = 0, j = 0, k = 0;
Process *a = new Process[n];
for (int q = 0; q < n; q++)
{
a[q] = p[q];
}
for (i = 0; i < n - 1; i++)
{
k = i;
for (j = i + 1; j < n; j++)
{
if (a[k].ReadyTime > a[j].ReadyTime)
{
k = j;
}
}
if (k != i)
{
Process tmp = a[k];
a[k] = a[i];
a[i] = tmp;
}
}
/*for (int i = 0; i < n; i++)
cout << "time " << a[i].time << " ";*/
cout << "FCFS" << endl;
int *TimeSequence=new int[n + 1];
TimeSequence[0]= a[0].ReadyTime;
for (int i = 0; i < n+1; i++)
{
TimeSequence[i + 1] = TimeSequence[i] + a[i].time;
}
for (int i = 0; i < n; i++)
{
cout << a[i].num << " " << a[i].ReadyTime << " " << a[i].time << " " << a[i].Priority << " " << TimeSequence[i+1] << " " << endl;
}
//計算平均週轉時間
float sum = 0;
for (int i =0; i < n ; i++)
{
//cout << TimeSequence[i] << " - " << a[i].ReadyTime<<" + "<<a[i].time << endl;
sum = sum + TimeSequence[i]-a[i].ReadyTime+a[i].time;
}
sum = sum /n ;
cout << "Average turn around time is " << sum << endl;
cout << endl;
}
void DeleteProcess(Process* p, int i,int&n)//刪除p中下標為i的程序 剩餘程序向前補缺 n為p當前長度
{
for (int j = i; j < n; j++)
p[j] = p[j + 1];
n--;
}
void Round_Robin(Process * p, int n,int TimeSlice)
{
Process *ProcessQueue = new Process[200]; //用來儲存執行順序
Process *a = new Process[n];
for (int q = 0; q < n; q++)
{
a[q] = p[q];
}
int test[200];
int testNum = 0;
int TimeSequence[200] = { 0 };
int TimeSequenceNum = 0;
PaiXuReadyTime(a, n);
int ProcessQueueNum = 0; //ProcessQueue中process個數
ProcessQueue[ProcessQueueNum] = a[0];
ProcessQueueNum++;
int CurrentProcess = 0; //記錄ProcessQueue執行到哪一個程序了
int i = 0; //計數還不在ProcessQueue的最小下標
if (a[0].time < TimeSlice) //小於0情況還需考慮直到找到合適的a[i]或者執行完所有的程序
{
TimeSequence[TimeSequenceNum + 1] = TimeSequence[TimeSequenceNum] + a[0].time;
TimeSequenceNum++;
}
else
{
TimeSequence[TimeSequenceNum + 1] = TimeSequence[TimeSequenceNum] + TimeSlice;
TimeSequenceNum++;
test[testNum] = ProcessQueue[CurrentProcess].num;
testNum++;
ProcessQueue[0].time = ProcessQueue[0].time - TimeSlice;
}
i++;
while (ProcessQueueNum !=0)
{
for (;CurrentProcess < ProcessQueueNum; CurrentProcess=(CurrentProcess+1)%ProcessQueueNum)
{
if (ProcessQueue[CurrentProcess].time < TimeSlice)
{
TimeSequence[TimeSequenceNum + 1] = TimeSequence[TimeSequenceNum] + ProcessQueue[CurrentProcess].time;
TimeSequenceNum++;
ProcessQueue[CurrentProcess].time = 0;
test[testNum] = ProcessQueue[CurrentProcess].num;
testNum++;
DeleteProcess(ProcessQueue, CurrentProcess, ProcessQueueNum);
if (ProcessQueueNum == 0)
break;
}
else
{
TimeSequence[TimeSequenceNum + 1] = TimeSequence[TimeSequenceNum] + TimeSlice;
TimeSequenceNum++;
ProcessQueue[CurrentProcess].time = ProcessQueue[CurrentProcess].time - TimeSlice;
test[testNum] = ProcessQueue[CurrentProcess].num;
testNum++;
}
for (int j = i; j < n; j++)
{
if (a[j].ReadyTime < TimeSequence[TimeSequenceNum])
{
ProcessQueue[ProcessQueueNum] = a[j];
ProcessQueueNum++;
i++;
}
}
}
}
cout << "Round_Robin" << endl;
cout << "依次執行的程序的程序號" << endl;
for (int i = 0; i < testNum; i++)
cout << test[i] << " ";
/*cout << "整個過程的時間" << endl;
for (int i = 0; i < TimeSequenceNum; i++)
cout << TimeSequence[i] << " ";*/
cout << endl;
//cout << TimeSequenceNum << testNum ;
//計算週轉時間
float sum = 0;
for (int i = 0; i < testNum-1; i++)
{
sum = TimeSequence[i + 1] - TimeSequence[i] + sum;
for (int j = i - 1; j >= 0; j--)
{
if (test[i] == test[j])
{
sum = sum + (i - j - 1)*TimeSlice;
break;
}
}
}
sum = sum / n;
cout << "Average turn around time is " << sum << endl;
}
int main()
{
Process p[10];
ifstream infile;
infile.open("input.txt");
if (!infile) cout << "error" << endl;
string str;
string part;
int i=0;
while (getline(infile, str)) //按行讀取,遇到換行符結束
{
part=str.substr(0,2);
p[i].num = stoi(part);
part = str.substr(3,3);
p[i].ReadyTime = stoi(part);
part = str.substr(7,3);
p[i].time= stoi(part);
part = str.substr(11,1);
p[i].Priority = stoi(part);
i++;
}
ShortestJobFirst(p, 10);
FCFS(p, 10);
Round_Robin(p, 10, 10);
}