📌  相关文章
📜  最短作业优先(或SJF)CPU调度程序|套装1(非抢先)

📅  最后修改于: 2021-05-07 00:30:48             🧑  作者: Mango

最短作业优先(SJF)或紧随其后的最短作业是一种调度策略,它选择执行时间最短的等待进程来执行。 SJN是一种非抢占式算法。

  • 最短作业优先的优点是在所有调度算法中平均等待时间最短。
  • 这是一个贪婪算法。
  • 如果持续出现较短的过程,可能会导致饥饿。使用老化的概念可以解决这个问题。
  • 这实际上是不可行的,因为操作系统可能不知道突发时间,因此可能无法对它们进行排序。尽管无法预测执行时间,但是可以使用几种方法来估计作业的执行时间,例如先前执行时间的加权平均值。 SJF可用于可以准确估计运行时间的特殊环境中。

算法:

  1. 根据到达时间对所有过程进行排序。
  2. 然后选择具有最小到达时间和最小突发时间的进程。
  3. 在过程完成之后,创建一个过程池,该过程池直到上一个过程完成为止,并在突发时间最短的池中选择该过程。

如何使用程序在SJF中计算以下时间?

  1. 完成时间:流程完成其执行的时间。
  2. 周转时间:完成时间与到达时间之间的时间差。周转时间=完成时间–到达时间
  3. Waiting Time(WT):等待时间和突发时间之间的时间差。
    等待时间=周转时间–爆发时间

在这篇文章中,我们假设到达时间为0,因此转身和完成时间相同。

C++
// C++ program to implement Shortest Job first with Arrival Time
#include
using namespace std;
int mat[10][6];
  
void swap(int *a, int *b)
{
    int temp = *a;
    *a = *b;
    *b = temp;
}
  
void arrangeArrival(int num, int mat[][6])
{
    for(int i=0; i mat[j+1][1])
            {
                for(int k=0; k<5; k++)
                {
                    swap(mat[j][k], mat[j+1][k]);
                }
            }
        }
    }
}
  
void completionTime(int num, int mat[][6])
{
    int temp, val;
    mat[0][3] = mat[0][1] + mat[0][2];
    mat[0][5] = mat[0][3] - mat[0][1];
    mat[0][4] = mat[0][5] - mat[0][2];
      
    for(int i=1; i= mat[j][1] && low >= mat[j][2])
            {
                low = mat[j][2];
                val = j;
            }
        }
        mat[val][3] = temp + mat[val][2];
        mat[val][5] = mat[val][3] - mat[val][1];
        mat[val][4] = mat[val][5] - mat[val][2];
        for(int k=0; k<6; k++)
        {
            swap(mat[val][k], mat[i][k]);
        }
    }
}
  
int main()
{
    int num, temp;
      
    cout<<"Enter number of Process: ";
    cin>>num;
      
    cout<<"...Enter the process ID...\n";
    for(int i=0; i>mat[i][0];
        cout<<"Enter Arrival Time: ";
        cin>>mat[i][1];
        cout<<"Enter Burst Time: ";
        cin>>mat[i][2];
    }
      
    cout<<"Before Arrange...\n";
    cout<<"Process ID\tArrival Time\tBurst Time\n";
    for(int i=0; i


Java
// Java program to implement Shortest Job first with Arrival Time
import java.util.*;
  
class GFG {
  
    static int[][] mat = new int[10][6];
  
    static void arrangeArrival(int num, int[][] mat) {
        for (int i = 0; i < num; i++) {
            for (int j = 0; j < num - i - 1; j++) {
                if (mat[j][1] > mat[j + 1][1]) {
                    for (int k = 0; k < 5; k++) {
                        int temp = mat[j][k];
                        mat[j][k] = mat[j + 1][k];
                        mat[j + 1][k] = temp;
                    }
                }
            }
        }
    }
  
    static void completionTime(int num, int[][] mat) {
        int temp, val = -1;
        mat[0][3] = mat[0][1] + mat[0][2];
        mat[0][5] = mat[0][3] - mat[0][1];
        mat[0][4] = mat[0][5] - mat[0][2];
  
        for (int i = 1; i < num; i++) {
            temp = mat[i - 1][3];
            int low = mat[i][2];
            for (int j = i; j < num; j++) {
                if (temp >= mat[j][1] && low >= mat[j][2]) {
                    low = mat[j][2];
                    val = j;
                }
            }
            mat[val][3] = temp + mat[val][2];
            mat[val][5] = mat[val][3] - mat[val][1];
            mat[val][4] = mat[val][5] - mat[val][2];
            for (int k = 0; k < 6; k++) {
                int tem = mat[val][k];
                mat[val][k] = mat[i][k];
                mat[i][k] = tem;
            }
        }
    }
  
    // Driver Code
    public static void main(String[] args) {
        int num;
  
        Scanner sc = new Scanner(System.in);
  
        System.out.println("Enter number of Process: ");
        num = sc.nextInt();
  
        System.out.println("...Enter the process ID...");
        for (int i = 0; i < num; i++) {
            System.out.println("...Process " + (i + 1) + "...");
            System.out.println("Enter Process Id: ");
            mat[i][0] = sc.nextInt();
            System.out.println("Enter Arrival Time: ");
            mat[i][1] = sc.nextInt();
            System.out.println("Enter Burst Time: ");
            mat[i][2] = sc.nextInt();
        }
  
        System.out.println("Before Arrange...");
        System.out.println("Process ID\tArrival Time\tBurst Time");
        for (int i = 0; i < num; i++) {
            System.out.printf("%d\t\t%d\t\t%d\n", 
                mat[i][0], mat[i][1], mat[i][2]);
        }
  
        arrangeArrival(num, mat);
        completionTime(num, mat);
        System.out.println("Final Result...");
        System.out.println("Process ID\tArrival Time\tBurst" +
                        " Time\tWaiting Time\tTurnaround Time");
        for (int i = 0; i < num; i++) {
            System.out.printf("%d\t\t%d\t\t%d\t\t%d\t\t%d\n", 
             mat[i][0], mat[i][1], mat[i][2], mat[i][4], mat[i][5]);
        }
        sc.close();
    }
}
  
// This code is contributed by
// sanjeev2552


输出:

Process ID      Arrival Time    Burst Time
1               2               3
2               0               4
3               4               2
4               5               4
Final Result...
Process ID      Arrival Time    Burst Time      Waiting Time    Turnaround Time
2               0               4               0               4
3               4               2               0               2
1               2               3               4               7
4               5               4               4               8

在Set-2中,我们将讨论SJF的抢占版本,即最短剩余时间优先