1+ package Others ;
2+
3+ import java .util .ArrayList ;
4+
5+ /**
6+ * @author Dekas Dimitrios
7+ */
8+ public class BestFit {
9+ private static final int NO_ALLOCATION = -255 ; // if a process has been allocated in position -255,
10+ // it means that it has not been actually allocated.
11+
12+ /**
13+ * Method to find the maximum valued element of an array filled with positive integers.
14+ *
15+ * @param array: an array filled with positive integers.
16+ * @return the maximum valued element of the array.
17+ */
18+ private static int findMaxElement (int [] array ) {
19+ int max = -1 ;
20+ for (int value : array ) {
21+ if (value > max ) {
22+ max = value ;
23+ }
24+ }
25+ return max ;
26+ }
27+
28+ /**
29+ * Method to find the index of the memory block that is going to fit the given process based on the best fit algorithm.
30+ *
31+ * @param blocks: the array with the available memory blocks.
32+ * @param process: the size of the process.
33+ * @return the index of the block that fits, or -255 if no such block exists.
34+ */
35+ private static int findBestFit (int [] blockSizes , int processSize ) {
36+ // Initialize minDiff with an unreachable value by a difference between a blockSize and the processSize.
37+ int minDiff = findMaxElement (blockSizes );
38+ int index = NO_ALLOCATION ; // If there is no block that can fit the process, return NO_ALLOCATION as the result.
39+ for (int i =0 ; i < blockSizes .length ; i ++) { // Find the most fitting memory block for the given process.
40+ if (blockSizes [i ] - processSize < minDiff && blockSizes [i ] - processSize >= 0 ) {
41+ minDiff = blockSizes [i ] - processSize ;
42+ index = i ;
43+ }
44+ }
45+ return index ;
46+ }
47+
48+ /**
49+ * Method to allocate memory to blocks according to the best fit
50+ * algorithm. It should return an ArrayList of Integers, where the
51+ * index is the process ID (zero-indexed) and the value is the block
52+ * number (also zero-indexed).
53+ *
54+ * @param sizeOfBlocks: an int array that contains the sizes of the memory blocks available.
55+ * @param sizeOfProcesses: an int array that contains the sizes of the processes we need memory blocks for.
56+ * @return the ArrayList filled with Integers repressenting the memory allocation that took place.
57+ */
58+ static ArrayList <Integer > bestFit (int [] sizeOfBlocks , int [] sizeOfProcesses ) {
59+ // The array list responsible for saving the memory allocations done by the best-fit algorithm
60+ ArrayList <Integer > memAlloc = new ArrayList <>();
61+ // Do this for every process
62+ for (int processSize : sizeOfProcesses ) {
63+ int chosenBlockIdx = findBestFit (sizeOfBlocks , processSize ); // Find the index of the memory block going to be used
64+ memAlloc .add (chosenBlockIdx ); // Store the chosen block index in the memAlloc array list
65+ if (chosenBlockIdx != NO_ALLOCATION ) { // Only if a block was chosen to store the process in it,
66+ sizeOfBlocks [chosenBlockIdx ] -= processSize ; // resize the block based on the process size
67+ }
68+ }
69+ return memAlloc ;
70+ }
71+
72+ /**
73+ * Method to print the memory allocated.
74+ *
75+ * @param memAllocation: an ArrayList of Integer representing the memory allocation done by the bestFit method.
76+ */
77+ public static void printMemoryAllocation (ArrayList <Integer > memAllocation ) {
78+ System .out .println ("Process No.\t Block No." );
79+ System .out .println ("===========\t =========" );
80+ for (int i = 0 ; i < memAllocation .size (); i ++) {
81+ System .out .print (" " + i + "\t \t " );
82+ if (memAllocation .get (i ) != NO_ALLOCATION )
83+ System .out .print (memAllocation .get (i ));
84+ else
85+ System .out .print ("Not Allocated" );
86+ System .out .println ();
87+ }
88+ }
89+ }
0 commit comments