最短作业优先(SJF)或紧随其后的最短作业是一种调度策略,它选择执行时间最短的等待进程来执行。 SJN是一种非抢占式算法。
- 最短作业优先的优点是在所有调度算法中平均等待时间最短。
- 这是一个贪婪算法。
- 如果持续出现较短的过程,可能会导致饥饿。使用老化的概念可以解决这个问题。
- 这实际上是不可行的,因为操作系统可能不知道突发时间,因此可能无法对它们进行排序。尽管无法预测执行时间,但是可以使用几种方法来估计作业的执行时间,例如先前执行时间的加权平均值。 SJF可用于可以准确估计运行时间的特殊环境中。
算法:
- 根据到达时间对所有过程进行排序。
- 然后选择具有最小到达时间和最小突发时间的进程。
- 在过程完成之后,创建一个过程池,该过程池直到上一个过程完成为止,并在突发时间最短的池中选择该过程。
如何使用程序在SJF中计算以下时间?
- 完成时间:流程完成其执行的时间。
- 周转时间:完成时间与到达时间之间的时间差。周转时间=完成时间–到达时间
- 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的抢占版本,即最短剩余时间优先