Java 最短剩余时间计划Min()错误

Java 最短剩余时间计划Min()错误,java,process,operating-system,scheduling,min,Java,Process,Operating System,Scheduling,Min,我的名为myArr的数组包含 Process burst arrive 1 8 0 2 4 1 3 9 2 4 5 3 我遇到的问题是,当我得到这个输出时,我认为我的Min()方法是错误的 Gantt Chart | p[2] | p[4] | p[1] | p[3] | 0 1 5 10 17 26 我应该得到以下输出 Syst

我的名为myArr的数组包含

Process  burst  arrive
1         8      0
2         4      1
3         9      2
4         5      3
我遇到的问题是,当我得到这个输出时,我认为我的Min()方法是错误的

Gantt Chart
| p[2]  | p[4]  | p[1]  | p[3]  |
0       1       5      10      17   26
我应该得到以下输出

System.out.println("--------------------------------------Shortest Process Next--------------------------------------"); 
             System.out.println();

             Arrays.sort(myArr, new Comparator<int[]>() {
                    public int compare(int[] o1, int[] o2) {
                        int ret = Integer.compare(o1[2], o2[2]);
                        // if the entries are equal at index 2, compare index 1
                        if (0 == ret) {
                            ret = Integer.compare(o1[1], o2[1]);
                        }
                        return (ret);
                    }
                });

            System.out.println("____Process_____");
            System.out.println("P   "+"B  "+"A  ");
            for(int t=0; t<myArr.length; t++){


                System.out.println(myArr[t][0]+"  "+myArr[t][1]+"  "+myArr[t][2]+"  ");
            }


              InputStreamReader isr = new InputStreamReader(System.in);
                BufferedReader in = new BufferedReader(isr);

                int n=myArr.length; //# of process


                int p[] = new int[n];
                int at[] = new int[n];
                int bt[] = new int[n];
                int bt2[] = new int[n];
                int wt[] = new int[n];
                int tat[] = new int[n];

                for (int i = 0; i < n; i++) {

                    p[i] = myArr[i][0]; // Process number
                    at[i] = myArr[i][2]; //arrival time
                    bt[i] = myArr[i][1];//burst time

                    bt2[i] = bt[i];//copy of the burst times
                }

                int tbt = 0;
                for (int i = 0; i < n; i++) {
                    tbt = tbt + bt[i];              //Suma de todos los burst time
                }

                int time[] = new int[tbt]; // array time tiene un size del count de los burst time
                int k = 0;
                int q2 = 0;

                System.out.println("Gantt Chart");
                System.out.print("|");
                //bt[0] = bt[0] - 1;

                for (int i = 0; i < tbt; i++) {
                    int q = Min(bt, at, tbt, i, n);
                    if (q != q2) {
                        System.out.print(" p[" + p[q] + "]\t|");
                        time[k++] = i;
                        wt[q] = i;
                        tat[q] = i + bt[q];
                    }
                    bt[q] = bt[q] - 1;
                    q2 = q;
                }
                time[k] = tbt;
                System.out.println();
                System.out.print("0\t");
                for (int i = 0; i <= k; i++) {
                    System.out.print(time[i] + "\t");
                }

System.out.println(“---------------------------------------最短进程下一个------------------------------”;
System.out.println();
sort(myArr,新的Comparator(){
公共整数比较(整数[]o1,整数[]o2){
int-ret=Integer.compare(o1[2],o2[2]);
//如果索引2的条目相等,则比较索引1
如果(0==ret){
ret=整数。比较(o1[1],o2[1]);
}
返回(ret);
}
});
System.out.println(“\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu进程”);
System.out.println(“P”+“B”+“A”);
对于(int t=0;t0&r>=a[i]){
min=b[i];
j=i;
}
}
返回j;
}   

您需要根据到达时间安排,而不是直接使用最短的剩余时间因素

输出不正确的原因有:-

  • 除非某个进程已到达队列中,否则无法将其调度到就绪队列中

  • 此外,您的预期输出图表也不正确。如果只需要首先实现最短的剩余时间,而不需要任何时间片,那么甘特图如下所示:-

    | P1 | P2 | P4 | P3 |


  • 现在,我不会评论代码中的错误,因为它看起来太多了,但是,我建议您使用更好的方法

    a) 您应该首先检查每个流程的到达时间,从 0并首先选择最短的突发时间作业,让其完全执行

    b) 完成第一个作业后,再次检查所有进程的到达时间,然后选择最短的突发时间进程(在已到达的进程中)

    c) 如前所述,对n个进程进行迭代。选择最短的突发时间进程并完全完成它,然后按照步骤a、b和c进行操作,直到进程结束


    如果您在实现相同的功能时遇到问题,请提出一个新的问题。

    调试您的代码,并告诉我们为什么会得到错误的输出。我尝试过这样做,但一切似乎都很好
    public static int Min(int b[], int a[], int tbt, int r, int n) { 
    
            int j = 0;
            int min = tbt;
    
            for (int i = n - 1; i >= 0; i--) {
                if (b[i] < min && b[i] > 0 && r >= a[i]) {
                    min = b[i];
                    j = i;
                }
            }
            return j;
        }   
    
        0            8     12      17              26