Exercise+12

=Exercise 1:= toc = = Her er der tegnet to sekvensdiagrammer. Det første viser hvad der sker når der bliver lavet et request på 100 byte. Det sidste sekvensdiagram viser hvad der sker, når en memory block bliver frigjort til HeapManageren.

=Exercise 2: Design and implement class MemPool=

Klassen MemPool har følgende krav.

- Når konstruktoren oprettes skal den: o Alokere en rå blok af hukommelse, dette gøre ved hjæp af "calloc". Dette lægges over i "rawMem" som så pejer på blokken. o allokere et array af nElements, som lægges i objektet "BufDesObj"

o sætte BufferDescriptor’s ptr til at pege på deres korrekte adresse, dvs på hver deres blok o sætte BufferDescriptors "isFree" til true code format="cpp" MemPool::MemPool(size_t nE, size_t s) : nElements(nE), size(s) {   rawMem = calloc(nElements, size);

if(rawMem == 0) // !rawMem exit(1);

BufDesObj = (BufferDescriptor*)calloc(nElements, sizeof(BufferDescriptor));

for (size_t i = 0; i<nElements; i++) {       BufDesObj[i].ptr = (void*)((int)rawMem + (i*size)); BufDesObj[i].isFree = true; } } code

· Ved desctruction skal MemPool deallokere alt dynamisk oprettede hukommelse slettes, dette gøre med ::free code format="cpp" MemPool::~MemPool {   ::free(rawMem); ::free(BufDesObj); } code

·MemPool skal finde den første ikke brugte blok, og sætte den til falsk hvis den bliver optaget, samt returnere en pointer til bufferen. code format="cpp" void* MemPool::allocate {   for (size_t i = 0; i < nElements; i++) {       if(BufDesObj[i].isFree == true) {           BufDesObj[i].isFree = false; return BufDesObj[i].ptr; }   } } code

· "free" skal tjekke om den hukommelse der skal frigøres er identisk med p. Hvis den er skal den sætte "isFree", samt returnere true. code format="cpp" bool MemPool::free(void* p) { for(size_t i=0; i<nElements; i++) {           if(BufDesObj[i].ptr == p)            { BufDesObj[i].isFree = true; return true; }       }    return false; }

code

· "anyFree" skal true hvis der findes en ledig buffer-plads. code format="cpp" bool MemPool::anyFree {   for (size_t i = 0; i < nElements; i++) {       if (BufDesObj[i].isFree) return true; } } code

Til sidst testede vi klassen, ved at oprette nogle forskellige objekter af klassen. Dette virkede efter planen.

=Exercise 3: Design and implement class HeapManager= Af underviseren fik vi af vide at vi ikke behøves at lave denne klasse som singelton.

Når konstruktoren bliver oprettet, skal den allokere nPools MemPool-objekter · On construction, the HeapManager should allocate nPools MemPool-objects as specified under Exercise 2. All MemPool-objects should hold nElements elements. The first MemPool object should hold elements of size smallestElementSize, the next should have double the size, the next 4 times the sie and so on. You cannot use new for this, so you will have to use malloc and “object placement new” to create the MemPool objects.

code format="cpp" HeapManager::HeapManager(size_t pool, size_t elements, size_t smallpool) : nPools (pool), nElements(elements), smallestPool(smallpool) {   BufMemPool = (MemPool**) malloc(nPools * sizeof(MemPool*));

void* vPtr; size_t size = smallestPool; for (size_t i = 0; i < nPools; i++) {       vPtr = malloc(sizeof(MemPool));

BufMemPool[i] = new (vPtr) MemPool(nElements, size); size *= 2; } } code

· On allocate, HeapManager should… o Find the smallest available fitting memory block from it’s MemPool-objects. I.e. if a request of 100 bytes is made, the HeapManager should return a 128-byte block if one is available, otherwise a 256-byte block, and so on. o If no block can be found in any of the memory pools, an error should be reported. code format="cpp" void* HeapManager::allocate(size_t n) { for(size_t i = 0; i < nPools; i++) {       if(n <= BufMemPool[i]->getElementSize && BufMemPool[i]->anyFree) {           cout << "any free: " << BufMemPool[i]->anyFree << endl; return BufMemPool[i]->allocate; }   }    return 0; } code

· On free, HeapManager should return the memory-to-free to the memory pool it came from. Hint: Try all MemPool-objects until the deallocation succeeds. code format="cpp" void HeapManager::free(void* p) { for(size_t i = 0; i < nPools; i++) if(BufMemPool[i]->free(p)) return; } code

· On info should print information about the memory pools and their use.

code format="cpp" void HeapManager::info {   cout    << "HeapManager info" << endl << "" << endl; for(size_t i=0; i < nPools; i++) BufMemPool[i]->info; cout << endl; } code

= = =Test:=

vores main til test program er opbygget på følgende måde code format="cpp" HeapManager hm;

hm.allocate(100); hm.allocate(12); hm.allocate(256); hm.allocate(102); hm.allocate(17);

hm.info; code herunder ses resultatet når programmet har kørt.