编写程序完成单处理器系统中的进程调度,要求实现时间片轮转、优先数、最短进程优 先和最短剩余时间优先四种调度算法。实验具体包括:首先确定进程控制块的内容,进程控 制块的组成方式;然后完成进程创建原语和进程调度原语;最后编写主函数对所作工作进行 测试。 模拟程序只对你所设置的“虚拟 PCB”进行相应的调度模拟操作,即每发生“调度” 时,显示出当前运行进程的“进程标识符”、“优先数”、“剩余运行时间”等,而不需要对系 统中真正的 PCB 等数据进行修改
时间: 2024-03-16 16:41:24 浏览: 107
这是一个比较复杂的问题,需要涉及到进程控制块、进程创建、进程调度等多个方面。以下是一个简单的C++程序,实现了时间片轮转、优先数、最短进程优先和最短剩余时间优先四种调度算法:
```c++
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
// 进程控制块
struct PCB
{
int id; // 进程标识符
int priority; // 优先数
int burst_time; // 需要运行的时间
int remaining_time; // 剩余运行时间
int start_time; // 开始时间
int finish_time; // 完成时间
int turnaround_time; // 周转时间
int waiting_time; // 等待时间
};
// 进程队列
typedef queue<PCB> ProcessQueue;
// 时间片轮转调度算法
void RR(ProcessQueue& processes, int time_slice)
{
int t = 0; // 当前时间
vector<PCB> running_processes; // 正在运行的进程
while (!processes.empty() || !running_processes.empty())
{
// 将需要运行的进程加入到正在运行的队列中
while (!processes.empty() && processes.front().start_time <= t)
{
running_processes.push_back(processes.front());
processes.pop();
}
if (running_processes.empty())
{
t++;
continue;
}
// 运行时间片
PCB p = running_processes.front();
running_processes.erase(running_processes.begin());
int time_left = min(time_slice, p.remaining_time);
p.remaining_time -= time_left;
t += time_left;
p.finish_time = t;
if (p.remaining_time > 0)
{
running_processes.push_back(p);
}
else
{
p.turnaround_time = p.finish_time - p.start_time;
p.waiting_time = p.turnaround_time - p.burst_time;
cout << "Process " << p.id << " finished. Turnaround time: " << p.turnaround_time << ", Waiting time: " << p.waiting_time << endl;
}
}
}
// 优先数调度算法
void priority(ProcessQueue& processes)
{
int t = 0; // 当前时间
vector<PCB> running_processes; // 正在运行的进程
while (!processes.empty() || !running_processes.empty())
{
// 将需要运行的进程加入到正在运行的队列中
while (!processes.empty() && processes.front().start_time <= t)
{
running_processes.push_back(processes.front());
processes.pop();
}
if (running_processes.empty())
{
t++;
continue;
}
// 选择优先数最高的进程运行
auto it = min_element(running_processes.begin(), running_processes.end(), [](const PCB& a, const PCB& b) { return a.priority < b.priority; });
PCB p = *it;
running_processes.erase(it);
int time_left = p.remaining_time;
t += time_left;
p.finish_time = t;
p.turnaround_time = p.finish_time - p.start_time;
p.waiting_time = p.turnaround_time - p.burst_time;
cout << "Process " << p.id << " finished. Turnaround time: " << p.turnaround_time << ", Waiting time: " << p.waiting_time << endl;
}
}
// 最短进程优先调度算法
void SJF(ProcessQueue& processes)
{
int t = 0; // 当前时间
vector<PCB> running_processes; // 正在运行的进程
while (!processes.empty() || !running_processes.empty())
{
// 将需要运行的进程加入到正在运行的队列中
while (!processes.empty() && processes.front().start_time <= t)
{
running_processes.push_back(processes.front());
processes.pop();
}
if (running_processes.empty())
{
t++;
continue;
}
// 选择需要运行时间最短的进程运行
auto it = min_element(running_processes.begin(), running_processes.end(), [](const PCB& a, const PCB& b) { return a.remaining_time < b.remaining_time; });
PCB p = *it;
running_processes.erase(it);
int time_left = p.remaining_time;
t += time_left;
p.finish_time = t;
p.turnaround_time = p.finish_time - p.start_time;
p.waiting_time = p.turnaround_time - p.burst_time;
cout << "Process " << p.id << " finished. Turnaround time: " << p.turnaround_time << ", Waiting time: " << p.waiting_time << endl;
}
}
// 最短剩余时间优先调度算法
void SRT(ProcessQueue& processes)
{
int t = 0; // 当前时间
vector<PCB> running_processes; // 正在运行的进程
while (!processes.empty() || !running_processes.empty())
{
// 将需要运行的进程加入到正在运行的队列中
while (!processes.empty() && processes.front().start_time <= t)
{
running_processes.push_back(processes.front());
processes.pop();
}
if (running_processes.empty())
{
t++;
continue;
}
// 选择需要运行时间最短的进程运行
auto it = min_element(running_processes.begin(), running_processes.end(), [](const PCB& a, const PCB& b) { return a.remaining_time < b.remaining_time; });
PCB p = *it;
running_processes.erase(it);
int time_left = 1;
p.remaining_time -= time_left;
t += time_left;
if (p.remaining_time > 0)
{
running_processes.push_back(p);
}
else
{
p.finish_time = t;
p.turnaround_time = p.finish_time - p.start_time;
p.waiting_time = p.turnaround_time - p.burst_time;
cout << "Process " << p.id << " finished. Turnaround time: " << p.turnaround_time << ", Waiting time: " << p.waiting_time << endl;
}
}
}
int main()
{
// 创建进程
ProcessQueue processes;
processes.push({ 1, 2, 10, 10, 0, 0, 0, 0 });
processes.push({ 2, 1, 5, 5, 0, 0, 0, 0 });
processes.push({ 3, 3, 7, 7, 0, 0, 0, 0 });
processes.push({ 4, 4, 3, 3, 0, 0, 0, 0 });
processes.push({ 5, 5, 8, 8, 0, 0, 0, 0 });
// 时间片轮转调度算法
cout << "Round Robin:" << endl;
RR(processes, 3);
// 优先数调度算法
cout << "Priority:" << endl;
priority(processes);
// 最短进程优先调度算法
cout << "Shortest Job First:" << endl;
SJF(processes);
// 最短剩余时间优先调度算法
cout << "Shortest Remaining Time First:" << endl;
SRT(processes);
return 0;
}
```
在这个程序中,进程控制块`PCB`包括了进程的标识符、优先数、需要运行的时间、剩余运行时间、开始时间、完成时间、周转时间和等待时间。进程创建使用了一个名为`ProcessQueue`的队列,同时程序中实现了四种不同的调度算法。在测试中,我们创建了5个进程,并对它们进行四种不同的调度。
阅读全文