最短作业优先(SJF)或最短作业优先,是一种调度策略,它选择执行时间最短的等待进程进行下一步执行。 SJN 是一种非抢占式算法。
- 最短作业优先的优点是在所有调度算法中平均等待时间最短。
- 这是一个贪心算法。
- 如果较短的进程不断出现,可能会导致饥饿。这个问题可以使用老化的概念来解决。
- 这实际上是不可行的,因为操作系统可能不知道突发时间,因此可能不会对它们进行排序。虽然无法预测执行时间,但可以使用多种方法来估计作业的执行时间,例如先前执行时间的加权平均值。 SJF 可用于可以准确估计运行时间的专用环境。
算法:
- 根据到达时间对所有流程进行排序。
- 然后选择具有最短到达时间和最短突发时间的进程。
- 进程完成后,创建一个进程池,直到前一个进程完成后,并从具有最小突发时间的池中选择该进程。
如何使用程序在 SJF 中计算以下时间?
- 完成时间:进程完成执行的时间。
- 周转时间:完成时间和到达时间之间的时间差。周转时间 = 完成时间 – 到达时间
- 等待时间(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
C#
// C# program to implement Shortest Job first with Arrival Time
using System;
public 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
static public void Main (){
int num;
Console.WriteLine("Enter number of Process: ");
num = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("...Enter the process ID...");
for (int i = 0; i < num; i++) {
Console.WriteLine("...Process " + (i + 1) + "...");
Console.WriteLine("Enter Process Id: ");
mat[i, 0] = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("Enter Arrival Time: ");
mat[i, 1] = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("Enter Burst Time: ");
mat[i, 2] = Convert.ToInt32(Console.ReadLine());
}
Console.WriteLine("Before Arrange...");
Console.WriteLine("Process ID\tArrival Time\tBurst Time");
for (int i = 0; i < num; i++) {
Console.WriteLine(mat[i, 0] + "\t\t" + mat[i, 1] + "\t\t" + mat[i, 2]);
}
arrangeArrival(num, mat);
completionTime(num, mat);
Console.WriteLine("Final Result...");
Console.WriteLine("Process ID\tArrival Time\tBurst" +
" Time\tWaiting Time\tTurnaround Time");
for (int i = 0; i < num; i++) {
Console.WriteLine(mat[i, 0] + "\t\t" + mat[i, 1] + "\t\t" + mat[i, 2] + "\t\t" + mat[i, 4] + "\t\t" + mat[i, 5]);
}
}
}
// This code is contributed by
// Dharanendra L V.
输出:
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
如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程和学生竞争性编程现场课程。