用c++实现sjf抢占式算法,要求:1)输入各进程到达时间(以空格间隔)和运行时间(以空格间隔),手动输入。 2)结果输出各进程的开始时间和结束时间、进程的平均等待时间,和具体的甘特图。
时间: 2024-03-25 13:36:59 浏览: 179
好的,我会尽力回答你的问题。关于你的问题,我提供下面的代码实现,希望能够帮到你。
```c++
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct Process{
int pid; // 进程号
int arrTime; // 到达时间
int exeTime; // 执行时间
int waitTime; // 等待时间
int startTime; // 开始时间
int finishTime; // 完成时间
};
// 按到达时间排序
bool cmpArrTime(Process x, Process y){
return x.arrTime < y.arrTime;
}
// 按剩余时间排序
bool cmpRemainTime(Process x, Process y){
return x.exeTime < y.exeTime;
}
int main(){
int n; // 进程个数
cout << "请输入进程个数:";
cin >> n;
vector<Process> p(n); // 进程数组
// 输入各进程信息
for(int i = 0; i < n; i++){
cout << "请输入进程" << i + 1 << "的到达时间和执行时间:";
cin >> p[i].arrTime >> p[i].exeTime;
p[i].pid = i + 1;
}
sort(p.begin(), p.end(), cmpArrTime); // 按到达时间排序
int curTime = p[0].arrTime; // 当前时间
int remainTime = 0; // 剩余时间
vector<Process> readyQ; // 就绪队列
vector<Process> finishQ; // 完成队列
while(!readyQ.empty() || !p.empty()){
// 将到达时间小于等于当前时间的进程加入就绪队列
while(!p.empty() && p[0].arrTime <= curTime){
readyQ.push_back(p[0]);
p.erase(p.begin());
}
if(readyQ.empty()){
curTime = p[0].arrTime;
continue;
}
// 选取剩余时间最短的进程
sort(readyQ.begin(), readyQ.end(), cmpRemainTime);
remainTime = readyQ[0].exeTime;
curTime += remainTime;
// 更新等待时间、开始时间、完成时间
for(int i = 0; i < readyQ.size(); i++){
if(readyQ[i].pid != readyQ[0].pid){
readyQ[i].waitTime += remainTime;
}
else{
readyQ[i].startTime = curTime - remainTime;
readyQ[i].finishTime = curTime;
}
}
finishQ.push_back(readyQ[0]); // 加入完成队列
readyQ.erase(readyQ.begin()); // 从就绪队列中删除
}
// 输出结果
cout << endl;
cout << "进程\t开始时间\t完成时间\t等待时间" << endl;
double sumWaitTime = 0.0;
for(int i = 0; i < n; i++){
cout << finishQ[i].pid << "\t" << finishQ[i].startTime << "\t\t" << finishQ[i].finishTime << "\t\t" << finishQ[i].waitTime << endl;
sumWaitTime += finishQ[i].waitTime;
}
cout << "平均等待时间:" << sumWaitTime / n << endl;
// 输出甘特图
cout << endl << "甘特图:" << endl;
for(int i = 0; i < n; i++){
cout << "进程" << finishQ[i].pid << ":";
for(int j = 0; j < finishQ[i].exeTime; j++){
cout << "*";
}
cout << endl;
}
return 0;
}
```
该程序实现了 SJF 抢占式算法,可以手动输入各进程的到达时间和执行时间。程序输出了各进程的开始时间、完成时间、等待时间和平均等待时间,以及甘特图。希望能够对你有所帮助!
阅读全文