【问题标题】:Implementing round robin scheduling algorithm in Java在Java中实现循环调度算法
【发布时间】:2014-10-25 14:35:51
【问题描述】:

经过数小时的思考,我终于崩溃了,结果我不知道如何在 java 中实现循环。我尝试了不同的方法,并且我得到了最接近的方法..我用一个例子来解释..

AT = Arrival Time
BT = Burst Time (Execution Time)

起初我有这一行数字(0,5;6,9;6,5;15,10) 其中元素在位置0-2-4 表示到达时间,位置1-3-5 中的元素表示突发时间。 到目前为止,我的代码将这个输入变成了一个名为 Process 的类,它带有一个 构造函数:Process(String name, int AT, int BT)。我已经在ArrayList 中分隔了进程。 所以现在我有一个ArrayList alst = [P0,P1,P2,P3],其中P0AT 0BT 5 等等`..

我创建了一个方法,该方法将返回一个进程列表,这些进程已被切割一段时间 - 例如(0,5;6,9;6,5;15,10) 我会得到一个结果:[P0,P0,P1,P1,P1,P2,P2,P3,P3,P3,P3]

所以循环法是一种方法,每个进程都有量子时间来执行,我选择了 3。

  1. 带有 AT 0 和 BT 3 的 P0 进入 - 添加到最终列表(经过时间 = 3)
  2. 带有 AT 0 和 BT 2 的 P0 进入 - 添加到最终列表中(时间已过 = 5)
  3. P0 完成
  4. 具有 AT 6 和 BT 3 的 P1 进入 - 添加到最终列表中(时间已过 = 9)
  5. 下一个 P1 被添加到队列中
  6. 带有 AT 6 和 BT 3 的 P2 进入 - 添加到最终列表中(时间已过 = 12)
  7. 下一个 P2 被添加到队列中
  8. 具有 AT 6 和 BT 3 的 P1 从队列中进入 - 添加到最终列表 (经过的时间 = 15)
  9. 下一个 P1 进入队列
  10. P3 到达,添加到最终列表中(经过的时间 = 18)
  11. P1 来自队列 - 添加到最终列表中

这就是我觉得我的大脑崩溃了,我不知道如何排队。

结果应如下所示:[P0,P0,P1,P2,P1,P3,P2,P1,P3,P3,P3]

我根据给出的第一个答案编码的内容。还是不行。。

public ArrayList roundRobinJarjestus(ArrayList pstlst) {
    ArrayList queue = new ArrayList();// järjekord, alguses tühi
    ArrayList uuspst = new ArrayList();
    queue.add(pstlst.get(0));
    int i = 0;
    double time = 0;
    double pworkTime = 0;
    int kvant = 3;

    while (i < pstlst.size()) {
        Protsess p = (Protsess) queue.get(i); //first process is taken
        pworkTime = p.getTooaeg(); //execute time
        time = time + pworkTime;

        // if next arrival time is lower than time passed
        if (((Protsess) pstlst.get(i + 1)).getSaabumisaeg() < time) {
            queue.add(pstlst.get(i + 1));
        }

        // if worktime - quantum is higher than zero
        // and still left something to execute
        if (pworkTime - kvant > 0) {
            p.setTooaeg(pworkTime - kvant);
            queue.add(p);
        }
        uuspst.add(queue.get(i));
        i = i + 1;
    }
    return uuspst;
}

【问题讨论】:

  • 如果您描述算法以及“到达时间”和“突发时间”的含义,这将很有帮助
  • 我认为 AT=进程第一次请求资源。 BT=资源完成任务所需的时间。

标签: java algorithm scheduling round-robin


【解决方案1】:

您可以维护一个等待进程队列并使用以下算法:

  1. 选择队列中的第一个进程(如果它不为空)。将其添加到输出列表中。

  2. 在给定的时间段内执行它(如果剩余时间少于一个时间段,则执行更短的时间)并从该进程的剩余时间中减去该时间段。

  3. 如果有新进程到达,将它们添加到队列的末尾。

  4. 如果最后执行的进程没有完成(即剩余时间不为0),则将其加入等待队列的末尾。

  5. 如果还有剩余进程,请转到步骤 1。

【讨论】:

  • 队列中的项目是如何被选中的?
  • @charen 队列的头部总是被选中和移除。
  • 我应该坚持使用量子时间分离进程的想法,还是应该根据完全到达 + 执行时间从我拥有它们的地方开始?
  • @charen 我不会将它们分开(因为该算法不需要它并且它不会使问题或实现更容易)。
  • @charen 是的。 3 也可能需要一个循环。
【解决方案2】:
package cpuSch;

import java.io.*;

class fcfs
    {
    public static void main(String args[]) throws Exception
    {
        int n,AT[],BT[],WT[],TAT[];
        float AWT=0;

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

            System.out.println("Enter no of process");

        n=Integer.parseInt(br.readLine());
        BT=new int[n];
        WT=new int[n];
        TAT=new int[n];
        AT=new int[n];
            System.out.println("Enter Burst time for each                                                                                                                    process\n______________________________");
            for(int i=0;i<n;i++)
        {
            System.out.println("Enter BT for process "+(i+1));
        BT[i]=Integer.parseInt(br.readLine());
        }
        System.out.println("______________________________");
    for(int i=0;i<n;i++)
    {
        System.out.println("Enter AT for process"+i);
    AT[i]=Integer.parseInt(br.readLine());
    }
        System.out.println("______________________________");
    WT[0]=0;

    for(int i=1;i<n;i++)
    {
        WT[i]=WT[i-1]+BT[i-1];
        WT[i]=WT[i]-AT[i];
    }

    for(int i=0;i<n;i++)
    {
        TAT[i]=WT[i]+BT[i];
        AWT=AWT+WT[i];
    }
        System.out.println("  PROCESS   BT      WT      TAT     ");

    for(int i=0;i<n;i++)
    {
        System.out.println("    "+ i + "       "+BT[i]+"       "+WT[i]+"       "+TAT[i]);}
        AWT=AWT/n;
        System.out.println("___________________________________________");
        System.out.println("Average WT="+AWT+"\n___________________________________________");
    }
 }

【讨论】:

    【解决方案3】:

    示例代码

    import java.io.*;
    class fcfs
    {
    public static void main(String args[]) throws Exception
    {
    int n,AT[],BT[],WT[],TAT[];
    float AWT=0;
    InputStreamReader isr=new InputStreamReader(System.in);
    BufferedReader br=new BufferedReader(isr);
    System.out.println("Enter no of process");
    n=Integer.parseInt(br.readLine());
    BT=new int[n];
    WT=new int[n];
    TAT=new int[n];
    AT=new int[n];
    System.out.println("Enter Burst time for each process\n******************************");
    for(int i=0;i<n;i++)
    {
    System.out.println("Enter BT for process "+(i+1));
    BT[i]=Integer.parseInt(br.readLine());
    }
    System.out.println("***********************************************");
    for(int i=0;i<n;i++)
    {
    System.out.println("Enter AT for process"+i);
    AT[i]=Integer.parseInt(br.readLine());
    }
    System.out.println("***********************************************");
    WT[0]=0;
    for(int i=1;i<n;i++)
    {
    WT[i]=WT[i-1]+BT[i-1];
    WT[i]=WT[i]-AT[i];
    }  
    for(int i=0;i<n;i++)
    {
    TAT[i]=WT[i]+BT[i];
    AWT=AWT+WT[i];
    }
    System.out.println("  PROCESS   BT      WT      TAT     ");
    for(int i=0;i<n;i++)
    {System.out.println("    "+ i + "       "+BT[i]+"       "+WT[i]+"       "+TAT[i]);}
    AWT=AWT/n;
    System.out.println("***********************************************");
    System.out.println("Avg waiting time="+AWT+"\n***********************************************");
    
    }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-19
      • 2020-02-26
      • 1970-01-01
      • 2017-03-07
      • 1970-01-01
      • 2017-01-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多