0

次のコードのどこに問題があるのか​​ を確認しようとして、わずかな問題が発生しています。

public void processNextJob() {
        /*
         * 1. get # of free CPU's still avaialble
         * 2. get top most job from priority queue
         * 3. run job - put to CPU queue
         * 4. develop a CPU queue here
         * 5. count cores against freeCPUS and some sort of calculation to sort run times
         */
        int freeCPUS = 500;
        int availableCPUS = 0;
        JobRequest temp = new JobRequest(); // initalised to new JobRequest
        Queue q = new LinkedList();

        while (true) {
            int size = q.size();
            for (int i = 0; i < size; i++) {
                temp = (JobRequest) q.peek();
                if (temp != null) {
                    availableCPUS += temp.getCores();
                }
            }
            if ((freeCPUS - availableCPUS) >= 0) {
                JobRequest nextJob = schedulerPriorityQueue.closestDeadlineJob(freeCPUS - availableCPUS); // returns top job from queue
                if (nextJob != null) {
                    System.out.println("Top priority / edf job:");
                    printJob(nextJob);
                    q.add(nextJob);

                } else {
                    System.out.println("Job = null");
                }

            } else {
                break;
            }
        }
        if (temp != null) {

            System.out.println("Execution Queue");

            for(Object jr : q){
             printJob((JobRequest)jr);//print all elements in q   
            }

        }

    }

ここで起こっていることは、priorityqueue から最上位の要素を追加し、それを新しい LinkedList に追加していることです。しかし、priorityqueue から取り出しているジョブには、「cores」という値を持つ項目があります。コアの制限を超えないようにしながら、できるだけ多くの仕事を奪おうとしています。

temp.getCores()コア値を取得する場所です

私が抱えている問題は、それらをリンクリスト キューに正しく追加していないことです。値が変更されません。私のキューにはコア値が「160」の 5 つの出力が表示されますが、上限を 500 に設定しているため、キューはそれをまったく満たしていません。

使用可能な CPU を 500 未満という指定された制限に到達させるために、priorityqueue から値を追加する際にどこが間違っているのかわかりません。

編集:

public JobRequest closestDeadlineJob(int freeCPUS) {
        // find top job to determine if other jobs for date need to be considered
        JobRequest nextJob = scheduledJobs.peek(); // return top most job

        if (nextJob != null) {

            System.out.println("Found top EDF job:");
            printJob( nextJob );

            // what is it's date?
            Date highestRankedDate = nextJob.getConvertedDeadlineDate();

            // create a temporary queue to work out priorities of jobs with same deadline
            JobPriorityQueue schedulerPriorityQueue = new JobPriorityQueue();

            // add the top job to priority queue
            //schedulerPriorityQueue.addJob(nextJob);

            for (JobRequest jr : scheduledJobs) {

                // go through scheduled jobs looking for all jobs with same date
                if (jr.getConvertedDeadlineDate().equals(highestRankedDate)) {
                    // same date deadline, soadd to scheduler priority queue
                    schedulerPriorityQueue.addJob(jr);
                    System.out.println("Adding following job to priority queue:");
                    printJob(jr);
                }
            }

            JobRequest highestPriorityJob = schedulerPriorityQueue.poll();
            // this is the item at the top of the PRIORTY JOB queue to return 

            // remove that item from scheduledJobs
            scheduledJobs.remove(highestPriorityJob);


            return highestPriorityJob;
        } else {
            return null;
        }
    }
4

1 に答える 1

0

ここを見る必要があると思います。

変数をインクリメントするfor()ループでは、常に次のものを取得しています。availableCPUSheadQueue

temp = (JobRequest) q.peek();

また、peek()はキューから要素を削除しないため、同じJobRequestものを に割り当てることになりtempます。

Iteratorの代わりに を使用してみてくださいfor:

availableCPUS = 0;
Iterator<JobRequest> it = q.iterator();
while (it.hasNext()) {
    temp = it.next();
    if (temp != null) {
        availableCPUS += temp.getCores();
    }
}

また、コアを正しくカウントできるようにするには、while ループの反復ごとに forを設定availableCPUSする必要があると思います。0

availableCPUS = 0;したがって、イテレータの初期化のすぐ上に配置する必要があります。

于 2013-02-25T12:00:14.783 に答える