java中的循环调度

Pat*_*ndu 8 java algorithm

我正在尝试实现循环调度算法.但到目前为止我所做的代码只考虑了突发时间.我也需要考虑这个过程的到达时间.我有一个time_chart数组,我用它来存储当前正在执行的进程的编号.但是如果当前没有进程正在执行(即如果所选进程已完成执行并且下一个进程尚未到达.),则应将值0插入time_chart数组中.

我将突发时间和到达时间存储在2D数组中:

//proc[][0] is the AT array
//proc[][1] is the BT array
Run Code Online (Sandbox Code Playgroud)

和变量q中的时间量子.以下是我的代码:

int time_chart[] = new int[total_time];
int sel_proc = 1;
int current_q = 0;

for (int k = 0; k < total_time; k++) {

    //Assign selected process to current time in the Chart
    time_chart[k] = sel_proc;

    //Decrement Remaining Time of selected process by 1 since it has been assigned the CPU for 1 unit of time
    proc[sel_proc - 1][1]--;

    //Updating value of sel_proc for next iteration
    current_q++;

    if (current_q == q || proc[sel_proc - 1][1] == 0)//If Time slice has expired or the current process has completed execution
    {
        current_q = 0;
        //This will select the next valid value for sel_proc
        for (int j = 1; j <= n; j++) {
            sel_proc++;
            if (sel_proc == (n + 1)) {
                sel_proc = 1;
            }
            if (proc[sel_proc - 1][1] != 0) {
                break;
            }
        }
    }
}

// print timeline for testing
for (i = 0; i < total_time; i++) {
System.out.println("Time " + i + ": " + time_chart[i]);
}
Run Code Online (Sandbox Code Playgroud)

目前它将选择下一个进程,即使它还没有到达.因此,我需要检查下一个进程是否已到达.我试过proc[sel_proc][0] <= k用来检查这个,但它似乎没有用.我的意思是我没有得到任何输出.我想不出另一种检查下一个过程是否到来的方法.如果下一个进程没有到达,我如何检查并将值0放入数组?

Leo*_*eon 2

尽管您可以仅使用数组来完成此操作,但如果您创建一个类结构来存储进程信息并使用两个Queues. 第一个Queue是按到达时间排序的进程列表,第二个Queue是当前正在执行的进程。

你可以按照这些思路来模拟你的处理过程

private static class Process {
    public final int id;
    public final int burstTime;
    public final int arrivalTime;
    public int executionTime;

    public Process(int id, int burstTime, int arrivalTime) {
        super();
        this.id = id;
        this.burstTime = burstTime;
        this.arrivalTime = arrivalTime;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后创建一个队列调用未计划的进程(或者任何看起来合适的进程)并将进程添加到按到达时间排序的队列中。Queue<Process> = new LinkedList<>()

现在,在循环期间,每次您只需检查队列的头部并查看进程的到达时间是否等于或大于当前时间。如果是,则将其从队列中删除并将其添加到调度程序队列的头部。LinkedList<Process> = new LinkedList<>()

您始终从调度程序队列中删除头进程并更新该进程的执行时间。确保不要超出突发时间,即执行时间始终按量程或burstTime -executionTime 增加,具体取决于哪个更小。更新后,如果执行时间小于burstTime,则将进程添加回调度程序队列。

请记住,如果进程的剩余时间小于量程,则当前时间不会增加量程。