#include #include #include #include #include using namespace std; struct PCB { string name;//进程名称 int needTime=0;//进程需要的时间 int arriveTime=0;//进程到达的时间 int finishTime=0;//进程完成的时间 PCB(string mname,int matime,int mneedtime) { name=mname; arriveTime=matime; needTime=mneedtime; finishTime=0; } PCB()=default; bool operator <(const PCB &p ) { return arriveTimeres.response; }//需要注意的是,由于是按照响应比高的优先,所以是> }; struct Process {//进程运行结构 bool isFree=true;//是否闲置 int needTime=0;//运行完当前进程需要多少时间 PCB pcb;//当前进程 void setPCB(const PCB& p) { needTime=p.needTime; isFree=false; pcb=p; } void run(PCB &p) { needTime--; if(needTime==0) { isFree=true; //将运行完毕的PCB取出 p=pcb; PCB nullPcb; pcb=nullPcb; } } }; class Dispatch { public: Dispatch()=default; Dispatch(const vector &all); void run(int n);//根据不同算法运行调度,1表示先来先服务,2表示短进程优先,3表示响应比高优先 void printFinished();//输出运行结果 //void calTurnoverTime();//用于计算周转时间等信息 private: int totalNumProcess=0; int time=0;//时间,此时间为系统时间 Process pro1;//第一个任务处理程序 Process pro2;//第二个任务处理程序 vector allProcess;//所有任务,存在这里面,当时间变化的时候,里面的元素相应变化 vector waitProcess;//在当前时间,等待处理的任务 vector finishedProcess;//完成了的任务 double averageTurnoverTime=0;//平均周转时间 double averageWeightTurnoverTime=0;//带权周转时间 void updateAllProFIFS();//根据先来先服务算法更新等待任务顺序 void updateAllProSHORT();//根据运行时间来更新等待任务 void updateAllProResponse();//根据响应比跟新等待任务 void calTurnoverTime();//用于计算周转时间等信息 }; Dispatch::Dispatch(const vector &all) { allProcess=all; sort(allProcess.begin(),allProcess.end()); time=0; totalNumProcess=allProcess.size(); } void Dispatch::updateAllProFIFS() { //假设当前时间为t,由于allProcess已经按照进程到达时间排序,所以只需要从头部查看即可 //将从头部开始的,所有进程到达时间在t之前的任务放入waitProcess中 while(!allProcess.empty()) { if(/*allProcess.front().arrivetime>t*/allProcess.front().arriveTime>time) break; waitProcess.push_back(allProcess.front()); allProcess.erase(allProcess.begin()); } } void Dispatch::updateAllProSHORT() { //假设当前时间为t,由于allProcess已经按照进程到达时间排序,所以只需要从头部查看即可 //将从头部开始的,所有进程到达时间在t之前的任务放入waitProcess中 while(!allProcess.empty()) { if(/*allProcess.front().arrivetime>t*/allProcess.front().arriveTime>time) break; waitProcess.push_back(allProcess.front()); allProcess.erase(allProcess.begin()); } //由于是按照运行时间排序,所以还需更新wait sort(waitProcess.begin(),waitProcess.end(),sortByNeedTime); } void Dispatch::updateAllProResponse() { //假设当前时间为t,由于allProcess已经按照进程到达时间排序,所以只需要从头部查看即可 //将从头部开始的,所有进程到达时间在t之前的任务放入waitProcess中 while(!allProcess.empty()) { if(/*allProcess.front().arrivetime>t*/allProcess.front().arriveTime>time) break; waitProcess.push_back(allProcess.front()); allProcess.erase(allProcess.begin()); } //按照响应比排序一次 // 先获得响应比 vector resVec; for(int i=0;i tempVec; for(auto s:resVec) { tempVec.push_back(waitProcess[s.index]); } for(int i=0;i weightYurTimeVec; int totalTurTime=0; double totalWeiTurTime=0; for(auto s:finishedProcess) { int tmp=s.finishTime-s.arriveTime; double weight=(double)tmp/s.needTime; //weightYurTimeVec.push_back(weight); totalTurTime+=tmp; totalWeiTurTime+=weight; } averageTurnoverTime=(double)totalTurTime/finishedProcess.size(); averageWeightTurnoverTime=(double)totalWeiTurTime/finishedProcess.size(); } int main() { //先读出所有的进程信息,存放到容器中 vector PCBVec; fstream dataFile("data.txt",ios::in); if(!dataFile.is_open()) { cout<<"文件打开失败!"<0) { string name=""; int arriveTime=0; int needTime=0; dataFile>>name>>arriveTime>>needTime; // cout<