From afc1ffcf540cc35a55acbc2707eb4478744e3513 Mon Sep 17 00:00:00 2001 From: David Weber Date: Sat, 17 Nov 2012 05:07:03 -0500 Subject: [PATCH] -Added more testing code for best fit --- BestFitAlgorithm.java | 105 ++++++++++++++++++++++++++++++------------ FirstFit.java | 2 +- memoryManagement.java | 18 ++++++-- 3 files changed, 92 insertions(+), 33 deletions(-) diff --git a/BestFitAlgorithm.java b/BestFitAlgorithm.java index 945785f..2e98a57 100644 --- a/BestFitAlgorithm.java +++ b/BestFitAlgorithm.java @@ -4,31 +4,36 @@ * 11/9/2012 */ +import java.lang.reflect.Method; import java.util.ArrayList; public class BestFitAlgorithm implements baseAlgorithm{ int memoryBlock[]; - + private Job[] jobArray = new Job[memoryManagement.JOBAMOUNT+10]; + ArrayList candidates; public BestFitAlgorithm(int memorySize) { //Initialize memory block to whatever the size is memoryBlock = new int[memorySize]; + System.out.println("The size of the memory is: " + memoryBlock.length); } public int getBestSizeIndex(int jobSize) { - int bestSize; - int bestSizeIndex; + int bestSize; //The most suitable block size for the job + int bestSizeIndex; //The most suitable block size starting index for the job - ArrayList candidates = new ArrayList(); //Dynamically resizable array list for allocation candidates (interleaved with index and memory size) + System.out.println("The size of the job is: " + jobSize); + + candidates = new ArrayList(); //Dynamically resizable array list for allocation candidates (interleaved with index and memory size) int counter = 0; //Counter for measuring unallocated memory - //Scan through memory block and get free blocks + //Scan through memory block and get free blocks. Add candidates for allocation to array list for(int i = 0; i < memoryBlock.length; i++) { - //If position in memory block here is 0, iterate from that index and count up sequential 0's + //If position in memory block here is 0, iterate from that index and count up sequential 0's (free space) if(memoryBlock[i] == 0) { for(int j = i; j < memoryBlock.length - i; j++) @@ -38,17 +43,28 @@ public class BestFitAlgorithm implements baseAlgorithm{ counter++; } } - if(counter >= jobSize) + if(counter == jobSize) { candidates.add(i); //Store index candidates.add(counter); //Store size of free memory chunk } + else if(counter >= jobSize) + { + candidates.add(i); //Store index + candidates.add(counter); //Store size of free memory chunk + } + //System.out.println("The size of the counter is: " + counter); counter = 0; } } + for(int i = 0; i < candidates.size(); i++) + { + System.out.println("Candidate index: " + candidates.get(i)); + System.out.println("Candidate size: " + candidates.get(i+1)); + } //Iterate through candidate sizes - bestSizeIndex = 0; //Initialize best index to first spot in array list + bestSizeIndex = candidates.get(0).intValue(); //Initialize best index to first spot in array list bestSize = candidates.get(1).intValue(); //Initialize bestSize to first space size in candidate @@ -59,6 +75,7 @@ public class BestFitAlgorithm implements baseAlgorithm{ if(candidates.get(i).intValue() == jobSize) { bestSizeIndex = i - 1; + System.out.println("The best size index is: " + bestSizeIndex); return bestSizeIndex; //You're done. Return the value. } //If the current size is less than the previous best size, make this the new best size @@ -66,12 +83,15 @@ public class BestFitAlgorithm implements baseAlgorithm{ { bestSize = candidates.get(i+1).intValue(); bestSizeIndex = i - 1; + System.out.println("The best size index is: " + bestSizeIndex); } } + System.out.println("The best size is: " + bestSize); - //If the best size is less than the job size, run this again + //No candidates if(candidates.isEmpty()) { + System.out.println("No best size index"); return -1; } @@ -81,28 +101,55 @@ public class BestFitAlgorithm implements baseAlgorithm{ @Override public void allocate(int jobID, int jobSize, int jobTime) { - int bestSizeIndex = getBestSizeIndex(jobSize); + try + { + Method deallocateMethod = this.getClass().getMethod("deallocate", new Class[]{int.class, int.class}); + + //checks to see if the job will fit in memory + if(jobSize>memoryBlock.length) + { + System.out.println("This job is too large"); + System.exit(0); + } + + int bestSizeIndex = getBestSizeIndex(jobSize); + + //No candidates found + if(bestSizeIndex == -1) + { + System.out.println("No candidates found...attempting to compact"); + //Try compacting, then attempt to get an index again + compact(); + + bestSizeIndex = getBestSizeIndex(jobSize); + + //Compacting still didn't produce an appropriate block + if(bestSizeIndex == -1) + { + //TODO ..... + } + } + else + { + //Allocate the memory + for(int i = bestSizeIndex; i < jobSize; i++) + { + memoryBlock[i] = jobID; + } + + System.out.println("Successfully allocated!"); + + for(int i = 0; i < memoryBlock.length; i++) + { + System.out.println("Job at position " + i + "in memoryblock: " + memoryBlock[i]); + } + } + + } - //No candidates found - if(bestSizeIndex == -1) + catch (Exception e) { - //Try compacting, then attempt to get an index again - compact(); - bestSizeIndex = getBestSizeIndex(jobSize); - - //Compacting still didn't produce an appropriate block - if(bestSizeIndex == -1) - { - //TODO ..... - } - } - else - { - //Allocate the memory - for(int i = bestSizeIndex; i < jobSize; i++) - { - memoryBlock[i] = jobID; - } + System.out.println("Could not allocate job with ID " + jobID); } } diff --git a/FirstFit.java b/FirstFit.java index ecff746..de0e91f 100644 --- a/FirstFit.java +++ b/FirstFit.java @@ -60,7 +60,7 @@ class FirstFit implements baseAlgorithm if(jobSize>memSize) { System.out.println("\n\n*********************************************************"+ - " THIS JOB IS TO LARGE TO FIT INTO MEMORY"+ + " THIS JOB IS TOO LARGE TO FIT INTO MEMORY"+ "*********************************************************"); System.exit(0); } diff --git a/memoryManagement.java b/memoryManagement.java index 0f6db30..d571a87 100644 --- a/memoryManagement.java +++ b/memoryManagement.java @@ -70,6 +70,9 @@ public class memoryManagement{ System.out.println("complete"); System.out.println(jobLength+" jobs found on file"); } + + + //Send jobs to algorithm, time is calculated and printed out after completion System.out.print("Sending jobs to threaded allocation algorithm..."); @@ -82,17 +85,25 @@ public class memoryManagement{ } timeEnd = System.currentTimeMillis() - timeStart; System.out.println("complete"); - System.out.println("Elapsed time for threaded allocation algorithm to complete " + jobLength + - " jobs is " + timeEnd + " milliseconds"); + System.out.println("Elapsed time for threaded allocation algorithm to complete " + jobLength + + " jobs is " + timeEnd + " milliseconds"); + + + + + //***Best Fit (David Weber)*** timeStart = System.currentTimeMillis(); for(int i = 0; i < jobLength - 1; i++){ - //David_Weber_BestFit.allocate(id[i], size[i], time[i]); + David_Weber_BestFit.allocate(id[i], size[i], time[i]); } timeEnd = System.currentTimeMillis() - timeStart; System.out.println("complete"); System.out.println("Elapsed time for threaded best fit allocation algorithm to complete " + jobLength + " jobs is " + timeEnd + " milliseconds"); + + + /* //***Worst Fit (David Weber)*** timeStart = System.currentTimeMillis(); for(int i = 0; i < jobLength - 1; i++){ @@ -101,6 +112,7 @@ public class memoryManagement{ timeEnd = System.currentTimeMillis() - timeStart; System.out.println("complete"); System.out.println("Elapsed time for threaded worst fit allocation algorithm to complete " + jobLength + " jobs is " + timeEnd + " milliseconds"); + */ //Put other algorithms here.