C++操作系统之高优先级调度(HPF)算法(非抢占式)
HPF算法:
按优先级进行排序,优先级越高的则优先执行,前提条件是到达时间要对,没到达的不考虑。
主要逻辑:
主要是考虑两点:
第一:排序问题,即初始化的时候按到达时间以及优先权来排序。
第二:时间片记录问题,当前时间有没有进程进来,进来的要进行优先权的排序,只要在这个时间片内能到达的,则证明可以跑,那么就按最高优先级的排序,让高优先级的先执行即可
代码区:
#include
#include
#include
#include
using namespace std;
struct PCB {string Name;//进程名字double Priority;//优先权double arriveTime;//进程到达时间double serviceTime;//进程需要服务时间double endTime;//已服务时间double finishTime;//完成时间点记录double RunTime; //进程周转时间string State;//进程状态};bool myCompare_ArriveTime(PCB P1, PCB P2) {//按到达时间排序return P1.arriveTime < P2.arriveTime;}bool myComapre_ServiceTime(PCB P1, PCB P2) {//按服务时间排序return P1.serviceTime < P2.serviceTime;
}bool myCompare_ArriveTime_ServiceTime(PCB P1, PCB P2) {//如果到达时间相同则按服务时间排序,如果到达时间不同那么就按到达时间排序if (P1.arriveTime == P2.arriveTime) {return P1.serviceTime < P2.serviceTime;}//按到达时间排序return P1.arriveTime < P2.arriveTime;
}bool myCompare_ArriveTime_Priority(PCB P1, PCB P2) {//如果到达时间相同则按服务时间排序,如果到达时间不同那么就按到达时间排序if (P1.arriveTime == P2.arriveTime) {return P1.Priority > P2.Priority;}//按到达时间排序return P1.arriveTime < P2.arriveTime;
}bool myCompare_Priority(PCB P1, PCB P2) {//如果到达时间相同则按服务时间排序,如果到达时间不同那么就按到达时间排序if (P1.arriveTime == P2.arriveTime) {return P1.Priority > P2.Priority;}//按到达时间排序return P1.Priority > P2.Priority;
}
queue<PCB> Change(queue<PCB>q) {vector<PCB>v;while (q.size() != 0) {v.push_back(q.front());q.pop();}sort(v.begin(), v.end(), myCompare_Priority);for (vector<PCB>::iterator it = v.begin(); it != v.end(); it++) {q.push(*it);}return q;
}void showData_Vector(vector<PCB>& v) {cout << "----------------------------------------------------当前进程情况----------------------------------------------------" << endl;cout << "进程名\t" << "进程到达时间\t" << "进程服务时间\t" << " 进程优先级\t" << "进程已服务时间\t" << " 进程完成时间\t" << "进程周转时间\t" << "进程当前状态\t" << endl;for_each(v.begin(), v.end(), [](PCB p) {cout << p.Name << "\t " << p.arriveTime<< " \t\t" << p.serviceTime << "\t\t" << p.Priority << "\t\t" << p.endTime << "\t\t" << p.finishTime << "\t\t" << p.RunTime << " \t" << p.State << endl; });cout << "--------------------------------------------------------------------------------------------------------------------" << endl;
}void showData(queue<PCB>& q) {cout << "----------------------------------------------------当前进程情况----------------------------------------------------" << endl;cout << "进程名\t" << "进程到达时间\t" << "进程服务时间\t" << " 进程优先级\t" << "进程已服务时间\t" << " 进程完成时间\t" << "进程周转时间\t" << "进程当前状态\t" << endl;while (q.size() != 0) {cout << q.front().Name << "\t " << q.front().arriveTime << " \t\t"<< q.front().serviceTime << "\t\t" << q.front().Priority << "\t\t" << q.front().endTime << "\t\t"<< q.front().finishTime << "\t\t" << q.front().RunTime << " \t" << q.front().State << endl;q.pop();}
}
/*高优先先服务
*/
void HPF() {vector<PCB>v;cout << "请输入进程个数:";int sum;int increatment = 0;cin >> sum;increatment = sum - 1;PCB p;queue<PCB>readyList;for (int i = 1; i <= sum; i++) {cout << "请输入第 " << i << " 个进程名字:";cin >> p.Name;cout << "请输入第 " << i << " 个进程优先级:";cin >> p.Priority;cout << "请输入第 " << i << " 个进程到达时间:";cin >> p.arriveTime;cout << "请输入第 " << i << " 个进程需要服务的时间:";cin >> p.serviceTime;p.State = "就绪状态";p.endTime = 0;p.finishTime = 0;p.RunTime = 0;//把进程放入容器中v.push_back(p);}//按进程到达的时间排序sort(v.begin(), v.end(), myCompare_ArriveTime_Priority);//展示当前情况showData_Vector(v);//把数据放入队列中for (vector<PCB>::iterator it = v.begin(); it != v.end(); it++) {readyList.push(*it);}int tempTime = 0;queue<PCB>endlist;queue<PCB>runList;queue<PCB>tempList;PCB temp;//获取第一个数据前的操作:while (1) {if (tempTime == readyList.front().arriveTime) {cout << "-------------------------------------------------------" << endl;cout << "第" << tempTime << "秒" << readyList.front().Name << "进程到达" << endl;cout << "-------------------------------------------------------" << endl;//把进来的进程放入执行队列中runList.push(readyList.front());readyList.pop();break;}else {cout << "第" << tempTime << "秒没有进程被执行" << endl;tempTime++;}}//showData(readyList);//拿到第一个开始执行下一步操作:while (runList.size() != 0){if (runList.front().serviceTime != 0) {//如果时间还需服务时间不为0则做相关的加或者减cout << "第" << tempTime << "秒 -" << runList.front().Name << "- 正在执行" << endl;tempTime++;runList.front().endTime++;runList.front().serviceTime--;}if (runList.front().serviceTime == 0) {//如果第一个数据的所需服务时间为0了那么这个数据所需执行的时间够了则交给下一个程序cout << "-------------------------------------------------------" << endl;cout << "第" << tempTime << "秒 -" << runList.front().Name << "- 已执行完毕" << endl;cout << "-------------------------------------------------------" << endl;//把结束时间标记上runList.front().finishTime = tempTime;//把状态进行修改runList.front().State = "执行完毕";//放入另一个队列中保存起来//计算周转时间runList.front().RunTime = tempTime - runList.front().arriveTime;endlist.push(runList.front());//弹出第一个数据让下一个开始执行runList.pop();if (readyList.size() != 0) {while (readyList.size() != 0) {if (tempTime >= readyList.front().arriveTime) {runList.push(readyList.front());readyList.pop();}else {tempTime++;if (tempTime == readyList.front().arriveTime) {runList.push(readyList.front());readyList.pop();break;}}}if (runList.size() != 0) {if (tempTime >= runList.front().arriveTime) {cout << "-------------------------------------------------------" << endl;cout << "第" << runList.front().arriveTime << "秒" << runList.front().Name << "进程到达" << endl;cout << "-------------------------------------------------------" << endl;}}runList = Change(runList);}}}queue<PCB>result;result = endlist;showData(endlist);//平均周转时间double avgTime = 0;double sumTime = 0;int size = result.size();while (result.size() != 0) {sumTime += result.front().RunTime;result.pop();}avgTime = sumTime / size;cout << "平均周转时间:" << avgTime << endl;cout << "--------------------------------------------------------------------------------------------------------------------" << endl;
}int main() {HPF();return 0;
}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
