LAB4: Dinamička memorija


Zadatak

Dodati novi način upravljanja dinamičkom memorijom složenosti O(1).

Dodati ga u lib/mm/O1.c s novim sučeljem malloc0_init()/malloc0(size)/free0(blok).

Pokazati rad korištenja novog sučelja na primjerima koji trebaju demonstrirati i probleme kad nema memorije.

Pri radu, pri svakoj promjeni prikazati stanje strukture podataka. Npr.

O1malloc inicijaliziran, stanje:
stanje blokova 32: 0000000000000000
stanje blokova 48: 0000000000000000
stanje blokova 64: 0000000000000000
stanje blokova 96: 0000000000000000
stanje blokova 128: 0000000000000000
stanje blokova 196: 0000000000000000
stanje blokova 256: 0000000000000000
...

zauzmi 100 B
dodijeljeno 128 B na adresi 0xNešto
stanje blokova 128: 0001001100000000

oslobodi 0x12345678
oslobođen blok veličine 512 B
stanje blokova 512: 0000000000001100

Primjer ideje za ostvarenje

Kod inicijalizacije može se blok za ovaj način tražiti od sustava s malloc/kmalloc.

Definirati nekoliko veličina blokova, npr. 32, 48, 64, 96, 128, ... i samo takve blokove dodjeljivati. Npr. ako je traženo 100 B dati mu blok od 128 B.

U inicijalizaciji tražiti blok memorije (s malloc) te dobiveni blok podijeliti na dijelove (npr. 10-tak za 32 B, 10-tak za 48 itd.). Bitmapama pratiti koji su slobodni a koji zauzeti -- blokovi ne trebaju imati zaglavlja!

Preporuka za veličine blokova: 32, 48, 64, 96, 128, 196, ...
bsz[0]=32; bsz[i+1]= (1<<(msb_index(bsz[i])-1)) // iz: arch/i386/bits.h: msb_index(num) = 31 - __builtin_clz(num)
//48=32+16; 64=48+16; 96=64+32...

Implementaciju se može najprije napraviti i izvan Benu koda - ne ovisi o ničemu. Tek kad ispravno proradi ugraditi ga u Benu.