java - java中的循环调度

标签 java algorithm

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

我已将突发时间和到达时间存储在二维数组中:

//proc[][0] is the AT array
//proc[][1] is the BT array

和变量 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]);
}

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

最佳答案

虽然您可以仅使用数组来完成此操作,但如果您创建一个类结构来存储流程信息并使用两个 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;
    }
}

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

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

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

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

关于java - java中的循环调度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40169058/

相关文章:

Java:当对象在初始化 block 中初始化时,从另一个类调用对象的方法

java - 如何在 IntelliJ IDEA 13 中搜索或导航到 Java 文件类型?

algorithm - 指定执行自动学习的算法

.NET 4.0 内部实现排序

algorithm - 打乱列表(有重复项)以避免相同的元素彼此相邻

java - 查找集合中的 BigDecimal

java - : "Updating Maven Project". org.eclipse.m2e.wtp.WTPProjectsUtil.isM2eWtpDisabled 期间发生内部错误

java - Java 从 1.6 迁移到 1.7 后,由于 SocketChannel,我收到编译错误

algorithm - 为什么只有四种树遍历算法?

寻找长度为 k 的第一个重复子串的算法