短进程优先调度算法缺陷及改进:C++抢占式方案
短进程优先调度算法缺陷及改进:C++抢占式方案
短进程优先(Shortest Job First,SJF)调度算法是一种常用的CPU调度算法,它优先选择服务时间短的进程执行。然而,SJF算法存在一个主要缺陷:可能导致长作业饥饿。
问题描述
当持续有短作业到达时,长作业可能会无限期地推迟执行,这就是所谓的'饥饿'现象。这是因为SJF算法总是优先选择服务时间短的进程,而忽略了长作业的等待时间。
解决方法:抢占式SJF调度
为了解决这个问题,可以引入抢占式的SJF调度算法。在抢占式SJF中,当一个新的、服务时间更短的作业到达时,系统会中断当前正在执行的长作业,将CPU分配给新到达的短作业。
C++代码实现
以下是使用C++实现的抢占式SJF调度算法:cpp#include
// 进程控制块struct ProcessControlBlock { int processId; // 进程号 std::string status; // 状态 int serviceTime; // 要求服务时间
ProcessControlBlock(int pid, const std::string& st, int stime) : processId(pid), status(st), serviceTime(stime) {}};
// 静态创建进程std::vector
// 添加进程到进程队列 processes.push_back(ProcessControlBlock(1, 'Ready', 5)); processes.push_back(ProcessControlBlock(2, 'Ready', 3)); processes.push_back(ProcessControlBlock(3, 'Ready', 7)); processes.push_back(ProcessControlBlock(4, 'Ready', 2)); processes.push_back(ProcessControlBlock(5, 'Ready', 6));
return processes;}
// 抢占式短进程优先调度算法void preemptiveSjfScheduling(std::vector
std::queue<ProcessControlBlock> readyQueue; for (auto& process : processes) { readyQueue.push(process); }
processes.clear();
int currentTime = 0; while (!readyQueue.empty()) { ProcessControlBlock currentProcess = readyQueue.front(); readyQueue.pop();
currentTime += currentProcess.serviceTime;
currentProcess.status = 'Finished';
processes.push_back(currentProcess); }}
// 显示调度结果void displayScheduleResult(const std::vector
int main() { // 静态创建进程 std::vector
// 抢占式短进程优先调度 preemptiveSjfScheduling(processes);
// 显示调度结果 displayScheduleResult(processes);
return 0;}
代码解释:
ProcessControlBlock结构体: 表示一个进程,包含进程ID、状态和服务时间。2.createProcesses()函数: 创建一组示例进程。3.preemptiveSjfScheduling()函数: 实现抢占式SJF算法。 - 首先对进程按服务时间从小到大排序。 - 使用一个队列readyQueue来存储就绪进程。 - 在循环中,每次从队列头部取出一个进程执行。 - 当一个进程执行完毕后,将其状态设置为 'Finished' 并添加到结果列表中。4.displayScheduleResult()函数: 打印调度结果。
优势:
抢占式SJF调度算法能够有效避免长作业饥饿问题,保证短作业能够及时得到服务,提高了系统的吞吐量和响应速度。
原文地址: https://www.cveoy.top/t/topic/FE4 著作权归作者所有。请勿转载和采集!