1、FCFS
原理:
代码:
void FCFS(int n[MAX_TASK][3], string pname[MAX_TASK], int num)
{
int cyc_time[MAX_TASK] = { 0 };//轮转时间
int fin_time[MAX_TASK] = { 0 };//完成时间
int ser_time[MAX_TASK] = { 0 };//剩余时间
for (int i = 0; i < num; i++)//初始化
{
ser_time[i] = n[i][1];
}
int pos = 0;//运行位置
for (int i = 1;; i++)
{
ser_time[pos]--;
if (ser_time[pos] == 0)
{
fin_time[pos] = i;
cyc_time[pos] = fin_time[pos] - n[pos][0];
pos++;
if (pos == num)
break;
}
}
for (int i = 0; i < num; i++)
{
cout << pname[i] << " " << fin_time[i] << " " << cyc_time[i] << " " << (fin_time[i] - n[i][0] + 0.0) / n[i][1] << endl;;
}
}
n[][0]为到达时间
n[][1]为需要的服务时间
n[][2]为是否完成
pname为名称
num为进程数量
下同
2、RR
原理:
代码:
void RR(int n[MAX_TASK][3], string pname[MAX_TASK], int num)
{
int cyc_time[MAX_TASK] = { 0 };
int fin_time[MAX_TASK] = { 0 };
int ser_time[MAX_TASK] = { 0 };
queue<int> iqueue;//轮转队列
for (int i = 0; i < num; i++)
{
ser_time[i] = n[i][1];
}
int now = 0;//现有进程数
for (int i = 0;; i++)
{
if (i == 0)//最初时加入第一个进程
{
iqueue.push(now);
now++;
}
else
{
bool add = false;//判断是否有加入
for (int j = 1; j < num; j++)
{
if (n[j][0] == i)//到达时间和现在的时间相等
{
add = true;
ser_time[iqueue.front()]--;
if (ser_time[iqueue.front()]==0)//判断是否完成
{
n[iqueue.front()][2] = -1;
fin_time[iqueue.front()] = i;
cyc_time[iqueue.front()] = fin_time[iqueue.front()] - n[iqueue.front()][0];
iqueue.pop();
iqueue.push(j);
}
else
{
int temp = iqueue.front();//记录队首
iqueue.pop();//删除队首
iqueue.push(j);//队列末放入新加入进程
iqueue.push(temp);//放入从队首轮转回的进程
now++;
}
}
}
if (add == false)//如果未添加
{
int temp = iqueue.front();
ser_time[iqueue.front()]--;
if (ser_time[iqueue.front()] == 0)
{
n[iqueue.front()][2] = -1;
fin_time[iqueue.front()] = i;
cyc_time[iqueue.front()] = fin_time[iqueue.front()] - n[iqueue.front()][0];
iqueue.pop();
}
else
{
int temp = iqueue.front();
iqueue.pop();
iqueue.push(temp);
}
}
}
bool end = true;//判断是否结束
for (int j = 0; j < num; j++)
{
if (ser_time[j] != 0)
{
end = false;
break;
}
}
if (end == true)
break;
}
for (int i = 0; i < num; i++)
{
cout << pname[i] << " " << fin_time[i] << " " << cyc_time[i] << " " << (fin_time[i] - n[i][0] + 0.0) / n[i][1] << endl;;
}
}
易错点:
当用完时间片的进程和新加入的进程在同一时间点进入时,新加入的进程排在用完时间片的进程之前
3、SPN
原理:
代码:
void SPN(int n[MAX_TASK][3], string pname[MAX_TASK], int num)
{
int cyc_time[MAX_TASK] = { 0 };
int fin_time[MAX_TASK] = { 0 };
int ser_time[MAX_TASK] = { 0 };
for (int i = 0; i < num; i++)
{
ser_time[i] = n[i][1];
}
int pos = 0;
bool over = false;//判断上个进程是否运行结束
for (int i = 1;; i++)
{
if (over == true || i == 1)//在上一个进程结束或是开始时把进程放入
{
int min = 0;//进程最短运行时间
for (int j = 0; j < num; j++)
{
if (n[j][2] != -1)
{
min = n[j][1];
pos = j;
break;
}
}
for (int j = 0; j < num; j++)
{
if (n[j][2] != -1 && n[j][1] < min && i > n[j][0])//在未结束且时间短且已经加入的情况下
{
pos = j;//调整位置
min = n[j][1];
}
}
over = false;
}
ser_time[pos]--;
if (ser_time[pos] == 0)//进程结束
{
n[pos][2] = -1;
fin_time[pos] = i;
cyc_time[pos]=fin_time[pos] - n[pos][0];
over = true;
}
bool judge = false;
for (int j = 0; j < num; j++)
{
if (n[j][2] != -1)
{
judge = true;
break;
}
}
if (judge == false)
break;
}
for (int i = 0; i < num; i++)
{
cout << pname[i] << " " << fin_time[i] << " " << cyc_time[i] << " " << (fin_time[i] - n[i][0] + 0.0) / n[i][1] << endl;;
}
}
注意
为非抢占策略
需要记录进程是否运行完成
4、SRT
原理:
代码:
void SRT(int n[MAX_TASK][3], string pname[MAX_TASK], int num)
{
int cyc_time[MAX_TASK] = { 0 };
int fin_time[MAX_TASK] = { 0 };
int ser_time[MAX_TASK] = { 0 };
for (int i = 0; i < num; i++)
{
ser_time[i] = n[i][1];
}
int pos = 0;
for (int i = 1;; i++)
{
int min = 0;
for (int j = 0; j < num; j++)//首先把位置调整到第一个未完成的进程
{
if (n[j][2] != -1)
{
min = ser_time[j];
pos = j;
break;
}
}
for (int j = 0; j < num; j++)//每个时间单位运行结束都需要重新进行判断
{
if (n[j][2] != -1 && ser_time[j] < min && i > n[j][0])
{
pos = j;
min = ser_time[j];
}
}
ser_time[pos]--;
if (ser_time[pos] == 0)
{
n[pos][2] = -1;
fin_time[pos] = i;
cyc_time[pos] = fin_time[pos] - n[pos][0];
}
bool judge = false;
for (int j = 0; j < num; j++)
{
if (n[j][2] != -1)
{
judge = true;
break;
}
}
if (judge == false)
break;
}
for (int i = 0; i < num; i++)
{
cout << pname[i] << " " << fin_time[i] << " " << cyc_time[i] << " " << (fin_time[i] - n[i][0] + 0.0) / n[i][1] << endl;;
}
}
5、HRRN
原理:
代码:
void HRRN(int n[MAX_TASK][3], string pname[MAX_TASK], int num)
{
int cyc_time[MAX_TASK] = { 0 };
int fin_time[MAX_TASK] = { 0 };
int ser_time[MAX_TASK] = { 0 };
int wai_time[MAX_TASK] = { 0 };//记录等待时间
double max = 0;
for (int i = 0; i < num; i++)
{
ser_time[i] = n[i][1];
}
double response[MAX_TASK];
int pos = 0;
bool over = false;
for (int i = 1;; i++)
{
if (over == true || i == 1)//非抢占型
{
for (int j = 0; j < num; j++)
{
if (n[j][2] != -1)
{
max = (wai_time[j] + n[j][1]) / n[j][1];
pos = j;
break;
}
}
for (int j = 0; j < num; j++)
{
if (n[j][2] != -1 && ((wai_time[j] + n[j][1]) / n[j][1]) > max&& i >= n[j][0])
{
pos = j;
max = (wai_time[j] + n[j][1]) / n[j][1];
}
over = false;
}
}
ser_time[pos]--;
for (int j = 0; j < num; j++)//其余所有到达进程等待时间加一
{
if (n[j][2] != -1 && j != pos && i >= n[j][0])
wai_time[j]++;
}
if (ser_time[pos] == 0)
{
n[pos][2] = -1;
fin_time[pos] = i;
cyc_time[pos] = fin_time[pos] - n[pos][0];
over = true;
}
bool judge = false;
for (int j = 0; j < num; j++)
{
if (n[j][2] != -1)
{
judge = true;
break;
}
}
if (judge == false)
break;
}
for (int i = 0; i < num; i++)
{
cout << pname[i] << " " << fin_time[i] << " " << cyc_time[i] << " " << (fin_time[i] - n[i][0] + 0.0) / n[i][1] << endl;;
}
}
为非抢占式
6、主函数
int main()
{
int num;//进程数
string pname[MAX_TASK] = { };//进程名称
int time[MAX_TASK][3] = {};
string method; //算法名称
cin >> num; //获取进程数
for (int i = 0; i < num; i++)//获取每个进程信息
{
cin >> pname[i];
cin >> time[i][0];
cin >> time[i][1];
}
cin >> method; //获取算法名称
if (method=="FCFS")
{
FCFS(time, pname, num);
}
else if (method == "RR")
{
RR(time, pname, num);
}
else if (method == "SPN")
{
SPN(time, pname, num);
}
else if (method == "SRT")
{
SRT(time, pname, num);
}
else if (method == "HRRN")
{
HRRN(time, pname, num);
}
return 0;
}
7、输入输出样例