java - 循环调度程序

标签 java scheduler round-robin

我需要使用我无法修改的作业类来实现“循环”调度程序。循环调度程序应首先处理等待时间最长的作业,然后将计时器重置为零。如果两个作业的等待时间相同,则先处理 ID 较低的作业。作业类只提供三个值(作业 ID、剩余持续时间和优先级(这不是必需的)。每个作业都有一个开始时间,因此在第一个周期中可能只有几个作业可用,下一个周期可能会更多,等等。由于我每次调用它时调用的“作业数组”都是不同的,所以我不确定如何存储等待时间。

这是工作类别:

public class Jobs{
private int[] stas = new int[0];
private int[] durs = new int[0];
private int[] lefs = new int[0];
private int[] pris = new int[0];
private int[] fins = new int[0];
private int clock;

public Jobs()
{
    this("joblist.csv");
}

public Jobs(String filename)
{
    BufferedReader fp = null;
    String line = "";
    String[] b = null;
    int[] tmp;
    try
    {
        fp = new BufferedReader(new FileReader(filename));
        while((line = fp.readLine()) != null)
        {
            b = line.split(",");
            if(b.length == 3)
            {
                try
                {
                    int sta = Integer.parseInt(b[0]);
                    //System.out.println("sta: " + b[0]);
                    int dur = Integer.parseInt(b[1]);
                    //System.out.println("dur: " + b[1]);
                    int pri = Integer.parseInt(b[2]);
                    //System.out.println("pri: " + b[2]);
                    stas = app(stas, sta);
                    //System.out.println("stas: " + Arrays.toString(stas));
                    durs = app(durs, dur);
                    //System.out.println("durs: " + Arrays.toString(durs));
                    lefs = app(lefs, dur);
                    //System.out.println("lefs: " + Arrays.toString(lefs));
                    pris = app(pris, pri);
                    //System.out.println("pris: " + Arrays.toString(pris));
                    fins = app(fins, -1);
                    //System.out.println("fins: " + Arrays.toString(fins));
                }
                catch(NumberFormatException e) {}
            }
        }
        fp.close();
    }
    catch(FileNotFoundException e) { e.printStackTrace(); }
    catch(IOException e) { e.printStackTrace(); }
    clock = 0;
}

public boolean done()
{
    boolean done = true;
    for(int i=0; done && i<lefs.length; i++)
        if(lefs[i]>0) done=false;
    return done;
}

public int getClock() { return clock; }
public int[][] getJobs()
{
    int count = 0;
    for(int i=0; i<stas.length; i++)
        if(stas[i]<=clock && lefs[i]>0)
            count++;
    int[][] jobs = new int[count][3];
    count = 0;
    for(int i=0; i<stas.length; i++)
        if(stas[i]<=clock && lefs[i]>0)
        {
            jobs[count] = new int[]{i, lefs[i], pris[i]};
            count++;
        }
    return jobs;
}

public int cycle() { return cycle(-1); }
public int cycle(int j)
{
    if(j>=0 && j<lefs.length && clock>=stas[j] && lefs[j]>0)
    {
        lefs[j]--;
        if(lefs[j] == 0) fins[j] = clock+1;
    }
    clock++;
    return clock;
}

private int[] app(int[] a, int b)
{
    int[] tmp = new int[a.length+1];
    for(int i=0; i<a.length; i++) tmp[i] = a[i];
    tmp[a.length] = b;
    return tmp;
}

public String report()
{
    String r = "JOB,PRIORITY,START,DURATION,FINISH,DELAY,PRI*DELAY\n";
    float dn=0;
    float pdn=0;
    for(int i=0; i<stas.length; i++)
    {
        if(fins[i]>=0)
        {
            int delay = ((fins[i]-stas[i])-durs[i]);
            r+= ""+i+","+pris[i]+","+stas[i]+","+durs[i]+","+fins[i]+","+delay+","+(pris[i]*delay)+"\n";
            dn+= delay;
            pdn+= pris[i]*delay;
        }
        else
        {
            int delay = ((clock*10-stas[i])-durs[i]);
            r+= ""+i+","+pris[i]+","+stas[i]+","+durs[i]+","+fins[i]+","+delay+","+(pris[i]*delay)+"\n";
            dn+= delay;
            pdn+= pris[i]*delay;
        }
    }
    if(stas.length>0)
    {
        r+= "Avg,,,,,"+(dn/stas.length)+","+pdn/stas.length+"\n";
    }
    return r;
}

public String toString()
{
    String r = "There are "+stas.length+" jobs:\n";
    for(int i=0; i<stas.length; i++)
    {
        r+= "  JOB "+i+": START="+stas[i]+" DURATION="+durs[i]+" DURATION_LEFT="+lefs[i]+" PRIORITY="+pris[i]+"\n";
    }
    return r;
}

我不需要完整的代码,只需要了解如何存储等待时间并循环正确的作业。

最佳答案

虽然基于数组的解决方案“可能”有效,但我会提倡采用更加面向对象的方法。使用所需属性(id、start_time、wait 等)创建“Job”类。使用 csv 文件创建作业对象并将它们保存在列表中。编写一个比较器来对该作业列表进行排序(在本例中,基于作业等待/年龄将是因素)。

作业执行者必须执行以下操作:

while(jobs exist) {
  iterate on the list {
    if job is executable // start_time > current sys_time
    consume cycles/job for executable jobs
    mark completed jobs (optional)
  }    
  remove the completed jobs
}

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

相关文章:

operating-system - 循环调度和IO

MySQL 循环更新

java - JPA 如何知道如何使用连接表链接列和实体?

java - 来自数据库的 Spring 属性持有者

java - 以编程方式解锁屏幕并显示 Activity

hadoop - 为什么 hadoop 容量调度程序使用 200% 的容量

android - 如何为Android设置调度程序

azure - 如何使用 Azure Scheduler 配置和进行测试

java - 重新混淆自己的java和编译版本

c++ - 循环中的循环算法