# 非抢占式最短作业优先算法

# 调度策略与算法原理

​ SJF(Shortest Job First,最短作业优先)是一种进程调度策略,它选择执行时间最短的进程来优先执行。在SJF调度策略下,操作系统会根据进程的执行时间长度来决定调度顺序,短作业将被优先执行。

基本原则和策略:

  1. 作业长度:SJF调度策略假设我们可以预测每个进程的执行时间。因此,每个进程都被分配了一个执行时间长度。
  2. 最短作业优先:在就绪队列中,选择具有最短执行时间的进程来执行。这意味着进程的执行时间越短,越容易获得CPU的执行机会。
  3. 非抢占式调度:一旦进程开始执行,它将一直运行到完成,除非它自愿释放CPU或阻塞。
  4. 先来先服务:当多个进程具有相同的执行时间时,采用先到先服务(FIFO)原则,即按照进程到达的顺序来决定执行顺序。

​ SJF调度策略旨在减少平均等待时间,因为短作业往往能够更快地完成并释放CPU资源,从而提高系统的吞吐量和响应时间。然而,SJF调度策略需要提前了解每个进程的执行时间,而在实际情况中,通常无法准确预测进程的执行时间。因此,SJF调度策略往往用作一种参考,而非实际应用的主要调度算法。

​ 扩展:抢占式最短作业优先算法是:最短完成时间优先(Shortest Time to Complet First)调度策略。

# 实验步骤

​ 接上文,在这里继续完成调度算法的实现

​ 你只需要实现一个SJF算法类,然后实现schedule函数,比如下面的方法:

bool compareByBurstTime(const Process& p1, const Process& p2) {
    return p1.burst_time < p2.burst_time;
}

void schedule(Process processes[], int n) {
    // 按照执行时间排序进程
    sort(processes, processes + n, compareByBurstTime);

    int current_time = 0;

    for (int i = 0; i < n; i++) {
        Process currentProcess = processes[i];

        cout << "执行进程 " << currentProcess.pid << ",执行时间 " << currentProcess.burst_time << endl;

        current_time += currentProcess.burst_time;

        cout << "进程 " << currentProcess.pid << " 执行完毕,完成时间 " << current_time << endl;
    }
}

# 实验结果