运行结果:
#include<iostream>
#include<queue>
#include<deque>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
class PCB{
public:
string name;// 进程名称
int priority;//进程优先级
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队列 核心算法
deque<PCB> PCB_deque;//双端队列 短进程优先
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 < 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.finish_time;
}
cout << endl << "周转时间:";
for (int i = 0; i < PCB_vector.size(); i++){
PCB t_pcb = PCB_vector.at(i);
cout << " " << t_pcb.turnround_time;
}
cout << endl << "带权周转时间:";
for (int i = 0; i < PCB_vector.size(); i++){
PCB t_pcb = PCB_vector.at(i);
cout << " " << t_pcb.w_turnround_time;
}
cout << endl << "****************************************" << endl;
}
bool static mysort(PCB a, PCB b){
return a.priority > b.priority;
}
/*
1.先将vector排序,依次输入deque队列
2.对队列内容进行判断,如果队首元素未到达,向后遍历找到满足条件的元素
3.如果找到满足条件元素,直接进行使用并删除,未找到等待首元素并删除
4.队首元素满足条件,直接使用删除
5.直到完成队列
*/
int main(){
cout << "请输入进程数量: ";
cin >> n_process;
cout << "请输入进程(name,arrive_time,service_time,priority)" << 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.priority;
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_deque.push_back(PCB_vector.at(i));
}
int runtime = 0;//运行时间
PCB_vector.clear();//清空数组
while (!PCB_deque.empty()){
PCB c_pcb = PCB_deque.front();
if (runtime < c_pcb.arrive_time){
bool is_success = false;
int t_success_number = -1;//不满足条件
for (int i = 0; i < PCB_deque.size(); i++){
if (runtime >= PCB_deque.at(i).arrive_time){
is_success = true;
t_success_number = i;//当前循环满足条件标号
}
}
if (is_success){
c_pcb = PCB_deque.at(t_success_number);
PCB_deque.erase(PCB_deque.begin() + t_success_number);
runtime += c_pcb.service_time;
c_pcb.finish_time = runtime;
c_pcb.turnround_time = c_pcb.finish_time - c_pcb.arrive_time;
c_pcb.w_turnround_time = c_pcb.turnround_time / c_pcb.finish_time;
PCB_vector.push_back(c_pcb);
}
else{
runtime = c_pcb.arrive_time + c_pcb.service_time;
c_pcb.finish_time = runtime;
c_pcb.turnround_time = c_pcb.finish_time - c_pcb.arrive_time;
c_pcb.w_turnround_time = c_pcb.turnround_time / c_pcb.finish_time;
PCB_vector.push_back(c_pcb);
PCB_deque.pop_front();//出队
}
}
else{
runtime += c_pcb.service_time;
c_pcb.finish_time = runtime;
c_pcb.turnround_time = c_pcb.finish_time - c_pcb.arrive_time;
c_pcb.w_turnround_time = c_pcb.turnround_time / c_pcb.finish_time;
PCB_vector.push_back(c_pcb);
PCB_deque.pop_front();//出队
}
}
Pri(1);//输出该时间片结果
return 0;
}