编写并调度一个多道程序系统的作业调度模拟程序
时间: 2023-06-12 12:06:39 浏览: 140
好的,我可以给你提供一个简单的多道程序系统作业调度模拟程序的实现思路。
首先,我们需要一个作业队列来存储所有待执行的作业。每个作业都有一个唯一的作业ID、需要执行的时间、优先级等信息。我们可以用一个结构体来表示每个作业。如下所示:
```c++
struct Job {
int id; // 作业ID
int time; // 需要执行的时间
int priority; // 优先级
};
```
接下来,我们需要一个就绪队列来存储所有已经到达并等待执行的作业。我们可以将就绪队列实现为一个优先队列,按照作业的优先级从高到低排序。C++ STL中的priority_queue就可以胜任此任务。
然后,我们需要一个运行队列来存储当前正在执行的作业。由于多道程序系统中可能同时有多个作业在执行,我们可以将运行队列实现为一个队列。
当一个作业到达后,我们将其加入作业队列,并且按照到达时间将其加入到就绪队列中。当运行队列中没有作业时,我们将就绪队列中的第一个作业取出并加入运行队列中。当作业执行完毕后,我们将其从运行队列中移除,并且从作业队列中删除。如果就绪队列中还有其他作业等待执行,我们将其按照优先级加入运行队列中。
整个模拟程序的主要流程如下:
1. 初始化作业队列、就绪队列和运行队列。
2. 模拟作业的到达,将作业加入作业队列和就绪队列中。
3. 模拟作业的执行,从就绪队列中取出第一个作业加入运行队列中,执行完毕后将其从运行队列中移除,并从作业队列中删除。
4. 重复步骤2-3,直到所有作业都执行完毕。
下面是一个简单的C++实现:
```c++
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
struct Job {
int id;
int time;
int priority;
Job(int i, int t, int p) {
id = i;
time = t;
priority = p;
}
};
struct CompareJob {
bool operator()(Job const& j1, Job const& j2) {
return j1.priority < j2.priority;
}
};
int main() {
vector<Job> jobs = {
Job(1, 3, 1),
Job(2, 5, 2),
Job(3, 4, 3),
Job(4, 2, 4),
Job(5, 1, 5)
};
priority_queue<Job, vector<Job>, CompareJob> readyQueue;
queue<Job> runQueue;
int currentTime = 0;
int totalWaitTime = 0;
while(!jobs.empty() || !runQueue.empty() || !readyQueue.empty()) {
// 将到达时间小于等于当前时间的作业加入就绪队列中
while(!jobs.empty() && jobs[0].time <= currentTime) {
readyQueue.push(jobs[0]);
jobs.erase(jobs.begin());
}
// 如果运行队列中没有作业,则将就绪队列中的第一个作业加入运行队列中
if(runQueue.empty() && !readyQueue.empty()) {
runQueue.push(readyQueue.top());
readyQueue.pop();
}
// 执行作业
if(!runQueue.empty()) {
Job& currentJob = runQueue.front();
currentJob.time--;
if(currentJob.time <= 0) {
totalWaitTime += currentTime + 1 - currentJob.time - currentJob.priority;
runQueue.pop();
}
}
currentTime++;
}
cout << "Average waiting time: " << (float) totalWaitTime / 5 << endl;
return 0;
}
```
这个程序模拟了5个作业的执行,每个作业的执行时间、优先级和到达时间都不同。程序输出了所有作业的平均等待时间。
阅读全文