短进程优先调度算法缺陷及改进:C++抢占式方案

短进程优先(Shortest Job First,SJF)调度算法是一种常用的CPU调度算法,它优先选择服务时间短的进程执行。然而,SJF算法存在一个主要缺陷:可能导致长作业饥饿

问题描述

当持续有短作业到达时,长作业可能会无限期地推迟执行,这就是所谓的'饥饿'现象。这是因为SJF算法总是优先选择服务时间短的进程,而忽略了长作业的等待时间。

解决方法:抢占式SJF调度

为了解决这个问题,可以引入抢占式的SJF调度算法。在抢占式SJF中,当一个新的、服务时间更短的作业到达时,系统会中断当前正在执行的长作业,将CPU分配给新到达的短作业。

C++代码实现

以下是使用C++实现的抢占式SJF调度算法:cpp#include #include #include #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 createProcesses() { std::vector processes;

// 添加进程到进程队列    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& processes) { std::sort(processes.begin(), processes.end(), [](const ProcessControlBlock& p1, const ProcessControlBlock& p2) { return p1.serviceTime < p2.serviceTime; });

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& processes) { std::cout << 'Process Scheduling Result:' << std::endl; for (const auto& process : processes) { std::cout << 'Process ID: ' << process.processId << ', Status: ' << process.status << ', Service Time: ' << process.serviceTime << std::endl; }}

int main() { // 静态创建进程 std::vector processes = createProcesses();

// 抢占式短进程优先调度    preemptiveSjfScheduling(processes);

// 显示调度结果    displayScheduleResult(processes);

return 0;}

代码解释:

  1. ProcessControlBlock 结构体: 表示一个进程,包含进程ID、状态和服务时间。2. createProcesses() 函数: 创建一组示例进程。3. preemptiveSjfScheduling() 函数: 实现抢占式SJF算法。 - 首先对进程按服务时间从小到大排序。 - 使用一个队列 readyQueue 来存储就绪进程。 - 在循环中,每次从队列头部取出一个进程执行。 - 当一个进程执行完毕后,将其状态设置为 'Finished' 并添加到结果列表中。4. displayScheduleResult() 函数: 打印调度结果。

优势:

抢占式SJF调度算法能够有效避免长作业饥饿问题,保证短作业能够及时得到服务,提高了系统的吞吐量和响应速度。

短进程优先调度算法缺陷及改进:C++抢占式方案

原文地址: https://www.cveoy.top/t/topic/FE4 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录