2012-11-06 20:23:34 -05:00
|
|
|
public class threadedAllocation implements baseAlgorithm{
|
2012-11-06 20:15:10 -05:00
|
|
|
int[] memoryBlock;
|
|
|
|
|
|
|
|
threadedAllocation(int memorySize) {
|
2012-10-30 20:53:40 -04:00
|
|
|
/* Constructor specific for this algorithm
|
|
|
|
*
|
|
|
|
* Start the threaded garbage collector, and then begin
|
|
|
|
* our actual operations */
|
2012-11-06 20:15:10 -05:00
|
|
|
memoryBlock = new int[memorySize];
|
2012-10-30 20:53:40 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
int locateBlock(int blockSize){
|
|
|
|
/* Locate a block of size blockSize, return -1 if can't find one */
|
|
|
|
|
|
|
|
//Find an open location
|
|
|
|
int memoryLoc = 0;
|
|
|
|
while (memoryLoc < this.memoryBlock.length)
|
|
|
|
{
|
|
|
|
if (memoryBlock[memoryLoc] != 0)
|
|
|
|
//Block isn't free
|
|
|
|
continue;
|
|
|
|
|
|
|
|
//One location is free, find out total size free
|
|
|
|
//This loop breaks either when we've found the size we need, or
|
|
|
|
//we found the beginning of the next block.
|
|
|
|
int beginningLoc = memoryLoc;
|
|
|
|
int free = 0;
|
|
|
|
while (free < blockSize && memoryBlock[memoryLoc] == 0)
|
|
|
|
{
|
|
|
|
memoryLoc += 1;
|
|
|
|
free += 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (free >= blockSize)
|
|
|
|
return beginningLoc;
|
|
|
|
}
|
|
|
|
//Once the above loop has exited, we've run out of locations to check
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
2012-11-06 20:15:10 -05:00
|
|
|
public void allocate(int jobID, int jobSize, int jobLength ){
|
2012-10-30 20:53:40 -04:00
|
|
|
/* Over-rides allocate() of baseAlgorithm */
|
|
|
|
|
|
|
|
//Loop until we get a block big enough for our job
|
|
|
|
// Note that this assumes we're not going to race against ourselves
|
|
|
|
int beginningLocation = locateBlock( jobSize );
|
|
|
|
while (beginningLocation == -1)
|
|
|
|
beginningLocation = locateBlock( jobSize );
|
|
|
|
|
|
|
|
//We've got a location, mark it as filled, and start the job.
|
|
|
|
for (int x = 0; x < jobSize; x++)
|
|
|
|
{
|
|
|
|
memoryBlock[beginningLocation + x] = jobID;
|
|
|
|
}
|
|
|
|
|
|
|
|
//TODO: Code to start the job
|
|
|
|
}
|
|
|
|
|
2012-11-06 20:15:10 -05:00
|
|
|
public void deallocate(int jobSize, int beginningLocation){
|
2012-10-30 20:53:40 -04:00
|
|
|
/* Over-rides deallocate() of baseAlgorithm */
|
|
|
|
|
|
|
|
//Simple algorithm, basically just mark the memory as cleared.
|
|
|
|
for (int x = 0; x < jobSize; x++)
|
|
|
|
{
|
|
|
|
memoryBlock[beginningLocation + x] = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|