时间轮转调度算法
运行结果:
#include<iostream>
#include<queue>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
class PCB{
public:
string name;// 进程名称
double arrive_time;//到达时间
double service_time;//服务时间
string state;//进程状态 run:运行 finish:完成
double finish_time;//完成时间
double turnround_time;//周转时间
double w_turnround_time;//带权周转时间
double aver_turnround_time;// 平均周转时间
double aver_w_turnround_time;// 平均带权周转时间
};
int n_process;//进程数量
vector<PCB> PCB_vector;//pcb数组 负责排序,,给queue传参数
queue<PCB> PCB_queue;//pcb队列 核心算法
vector<PCB> R_PCB_vecotr;//pcb数组 负责保存最后结果
vector<int> time_slice;//时间片
void Pri(){
cout << endl << "*******************************" << endl;
cout << "进程名 ";
for (int i = 0; i < PCB_vector.size(); i++){
PCB t_pcb = PCB_vector.at(i);
cout << " " << t_pcb.name;
}
cout << endl << "到达时间:";
for (int i = 0; i < PCB_vector.size(); i++){
PCB t_pcb = PCB_vector.at(i);
cout << " " << t_pcb.arrive_time;
}
cout << endl << "服务时间:";
for (int i = 0; i < PCB_vector.size(); i++){
PCB t_pcb = PCB_vector.at(i);
cout << " " << t_pcb.service_time;
}
cout << endl << "*******************************" << endl;
}
void Pri(int time_slice){
cout << endl << "********************" << "时间片: " << time_slice << " ********************";
cout << endl << endl;
cout << "进程名 ";
for (int i = 0; i < R_PCB_vecotr.size(); i++){
PCB t_pcb = R_PCB_vecotr.at(i);
cout << " " << t_pcb.name;
}
cout << endl << "完成时间:";
for (int i = 0; i < R_PCB_vecotr.size(); i++){
PCB t_pcb = R_PCB_vecotr.at(i);
cout << " " << t_pcb.finish_time;
}
cout << endl << "周转时间:";
for (int i = 0; i < R_PCB_vecotr.size(); i++){
PCB t_pcb = R_PCB_vecotr.at(i);
cout << " " << t_pcb.turnround_time;
}
cout << endl << "带权周转时间:";
for (int i = 0; i < R_PCB_vecotr.size(); i++){
PCB t_pcb = R_PCB_vecotr.at(i);
cout << " " << t_pcb.w_turnround_time;
}
cout << endl << "****************************************" << endl;
}
bool static mysort(PCB a,PCB b){
return a.arrive_time < b.arrive_time;
}
int main(){
cout << "请输入时间片:";
int t_time_slice;
while (cin >> t_time_slice){
time_slice.push_back(t_time_slice);
if (cin.get() == '\n') break;
}
cout << "请输入进程数量: ";
cin >> n_process;
cout << "请输入进程(name,arrive_time,service_time)" << endl;
PCB t_pcb;
for (int i = 0; i < n_process; i++){
cin >> t_pcb.name >> t_pcb.arrive_time >> t_pcb.service_time;
t_pcb.aver_turnround_time = 0;//初始化
t_pcb.aver_w_turnround_time = 0;
t_pcb.finish_time = 0;
t_pcb.turnround_time = 0;
t_pcb.w_turnround_time = 0;
PCB_vector.push_back(t_pcb);
}
Pri();
sort(PCB_vector.begin(), PCB_vector.end(), mysort);//升序排序
for (int i = 0; i < PCB_vector.size(); i++){
PCB_queue.push(PCB_vector.at(i));//先将pcb按照fcfs传入队列
}
//每个时间片执行一次
for (int i = 0; i < time_slice.size(); i++){
int t_time_slice = time_slice.at(i);//时间片
int runtime = 0;//一个时间片运行时间
while (!PCB_queue.empty()){
PCB c_pcb = PCB_queue.front();
if ((c_pcb.service_time - c_pcb.turnround_time) <= t_time_slice){
runtime += (c_pcb.service_time - c_pcb.turnround_time);//不可少
c_pcb.turnround_time += c_pcb.service_time - c_pcb.turnround_time;//此时周转时间仅用来记录运行时间
c_pcb.finish_time = runtime;
c_pcb.state = "finish";//更新状态
R_PCB_vecotr.push_back(c_pcb);//放入结果
PCB_queue.pop();//完成出队
}
else{
c_pcb.turnround_time += t_time_slice;
runtime += t_time_slice;
c_pcb.state = "run";//更新状态
PCB_queue.push(c_pcb);//放到队尾
PCB_queue.pop();//出队
}
}
for (int j = 0; j < R_PCB_vecotr.size(); j++){
R_PCB_vecotr.at(j).turnround_time = R_PCB_vecotr.at(j).finish_time - R_PCB_vecotr.at(j).arrive_time;//重新计算周转时间
R_PCB_vecotr.at(j).w_turnround_time = R_PCB_vecotr.at(j).turnround_time / R_PCB_vecotr.at(j).finish_time;//计算带权周转时间
}
Pri(t_time_slice);//输出该时间片结果
R_PCB_vecotr.clear();//清空结果下次继续
for (int i = 0; i < PCB_vector.size(); i++){//重新读入队列
PCB_queue.push(PCB_vector.at(i));//先将pcb按照fcfs传入队列
}
}
return 0;
}