#include<iostream>
#include<queue>
using namespace std;
struct Process
{
string id;
int arrival_time/*到达时间*/, service_time/*服务时间*/, run_time/*已运行时间*/, over_time/*完成时间*/, turn_time;/*周转时间*/
bool isRun = false; //进程是否已启动
};
class ProcessQueue
{
public:
ProcessQueue(int ts);
void pushProcess(Process* p); //添加作业
void autoRun(); //进行调度
void showTrack(); //显示调度轨迹
void showProcessTabe();
~ProcessQueue();
private:
queue<Process*> q;
int time , time_slice;
vector<Process*> process;
vector<string> track;//运行轨迹
};
ProcessQueue::ProcessQueue(int ts){
time = 0;
time_slice = ts;
}
void ProcessQueue::pushProcess(Process* p) {
process.push_back(p);
}
void ProcessQueue::autoRun() {
time = 0;
for (auto& it : process) {
if (!it->isRun && it->arrival_time <= time && it->run_time == 0) {
q.push(it);
it->isRun = true;
}
}
while (true) {
if (q.empty())
break;
Process *tmp = q.front();
q.pop();
if (tmp->service_time-tmp->run_time > time_slice) {
time += time_slice;
tmp->run_time += time_slice;
}
else {
time += tmp->service_time - tmp->run_time;
tmp->over_time = time;
tmp->turn_time = time - tmp->arrival_time;
tmp->run_time = tmp->service_time;
}
for (auto&it : process) {
if (!it->isRun&&it->arrival_time <= time && it->run_time == 0) {
q.push(it);
it->isRun = true;
}
}
if (tmp->service_time != tmp->run_time)
q.push(tmp);
track.push_back(tmp->id);
}
}
void ProcessQueue::showTrack()
{
cout << "进程调度轨迹:";
for (int i = 0; i < track.size(); i++)
cout << track[i] << (i != track.size() - 1 ? "->" : "\n");
}
void ProcessQueue::showProcessTabe()
{
printf("进程名\t到达时间\t服务时间\t完成时间\t周转时间\n");
for (int i = 0; i < process.size(); i++) {
printf("%6s\t%8d\t%8d\t%8d\t%8d\n", process[i]->id.c_str(), process[i]->arrival_time, process[i]->service_time, process[i]->over_time, process[i]->turn_time);
}
}
ProcessQueue::~ProcessQueue(){}
int main() {
ProcessQueue pq(1); //参数为时间片长度
Process process[] = { { "A",0,4 },{ "B",1,3 },{"C",2,4 },{ "D",3,2 },{ "E",4,4 } }; //{进程名称,到达时间,要求服务时间}
for (int i = 0; i < 5; i++)
pq.pushProcess(&process[i]);
pq.autoRun();
pq.showTrack();
pq.showProcessTabe();
return 0;
}