实验二 短作业优先进程调度算法
实验内容
编写程序,模拟实现短作业优先进程调度算法。从测试文件读入进程相关信息,然后给出不同进程调度算法下,进程的运行次序情况。测试数据文件格式:测试数据文件包括n行测试数据,分别描述n个进程的相关信息。每行测试数据包括四个字段,各个字段间用空格分隔:
- 第一字段为字符串,表示进程名;
- 第二字段是整数,表示进程到达时间;
- 第三字段为整数,表示进程预期的执行时间;
- 第四字段为整数,表示进程的优先级(注:数值越大,优先级越高)。
代码实现
这里就体现出设计模式的好处了。相比于实验一,这里仅仅只是需要修改一下排序算法即可,其余都是通用的。
#include<iostream>
#include<string>
#include <algorithm>
#include <vector>
using namespace std;
struct Process {
string name;
int arrivedTime{};
int requiredTime{};
int priority{};
bool isFinished = false;
};
bool compareProcess(const Process&a,const Process&b) {
return a.requiredTime<b.requiredTime;
}
void run(vector<Process>&processes,int n) {
int curTime=0;
while(n>0) {
bool isChanged = false;
for (auto &process: processes) {
if (curTime >= process.arrivedTime && !process.isFinished) {
curTime += process.requiredTime;
cout << "作业名:" << process.name << " 到达时间:" << process.arrivedTime << " 运行时间:"
<< process.requiredTime << " 完成时间:" << curTime << " 周转时间:" << curTime - process.arrivedTime
<< " 带权周转时间:" << (curTime - process.arrivedTime) * 1.0 / process.requiredTime * 1.0 << endl;
n--;
isChanged= true;
}
}
if(!isChanged) {
curTime++; //如果所有的进程都没有运行,说明此时没有进程可运行,于是时间自增
}
}
}
int main() {
int n;
cout<<"输入进程数量: ";
cin>>n;
vector<Process>process(n);
cout<<"依次输入进程名 进程到达时间、执行时间与进程优先级,以空格隔开: "<<endl;
for (int i = 0; i < n; ++i){
cin>>process[i].name>>process[i].arrivedTime>>process[i].requiredTime>>process[i].priority;
}
sort(process.begin(),process.end(), compareProcess);
run(process,n);
cout<<"运行完成"<<endl;
}