25: Minnisúthlutun Flashcards
Kvik minnisúthlutun
malloc og free
Forritarar nota minnisúthlutara
(eins og malloc) til að ?
fá sýndarminni á keyrslutíma
Minnisúthlutarar (dynamic
memory allocators) sjá um?
svæði í sýndarminni sem kallast kös (heap).
Hvernig virkar Kvik minnisúthlutun?
Úthlutari skipuleggur kösina sem safn af misstórum
blokkum, sem eru annaðhvort úthlutaðar (allocated)
eða lausar (free)
Þegar kemur beiðni um nýja blogg þá finnur hann lausa blokk og lætur hana af hendi
Tvær gerðir úthlutara:
Bein úthlutun og óbein úthlutun
Hvað er Bein úthlutun: ?
notendaforrit úthlutar og losar minni
* Til dæmis: malloc og free í C
Hvað er Óbein úthlutun?
notendaforrit úthlutar, en losar ekki
minni
* Til dæmis new og ruslasöfnun í Java
malloc pakkinn
include <stdlib.h></stdlib.h>
void *malloc(size_t size)
skilar bendi á void, forritarinn skilar sjálfur bendi á þá tegund sem hann vill fá
Þegar malloc heppnast
Þá fáum við bendi á minnisblokk með stærð a.m.k. size bæti uppröðuð
(aligned) að 16 bætum (á x86-64)
Þegar malloc heppnast ekki
Skilar NULL (0) og setur errno sem ENOMEM
void free(void *p)
Skilar blokkinni sem p bendir á, í safn lausra minnisblokka
lykilatriði : p verður að koma frá fyrra kalli á malloc eða realloc
calloc:
útgáfa af malloc sem upphafsstillir blokkina sem 0
realloc:
breytir stærð á áður-úthlutaðri minnisblokk
sbrk:
innra fall í úthlutara, til að breyta stærðinni á kösinni
Takmarkanir
Geta gert alls konar runur af malloc og free köllum, vitum ekki í hvaða röð þau koma
Getum ekki ráðið fjölda eða stærð úthlutaðra blokka
Verðum að svara malloc köllum strax og getum ekki umraðað beiðnum
Verður að úthluta blokkum úr lausa minninu
Úthlutaðar blokkir verða að uppfylla uppröðunarskilyrði
Getur aðeins unnið með og breytt lausa minninu
Getur ekki fært blokkir eftir að þeim hefur verið úthlutað
Mælikvarði: Afköst (throughput)
Markmið: hámarka afköst og hámarka minnisnýtingu
Afköst: Fjöldi afgreiddra minnisbeiðna á tímaeiningu
Mælikvarði: Minnisnýting
Gera greinar mun á farm (payload) og overhead
Hvað er Sundrun (fragmentation)?
Sundrun veldur lélegri minnisnýtingu
– Innri sundrun (internal fragmentation)
– Ytri sundrun (external fragmentation)
Innri sundrun (internal fragmentation)
á sér stað ef farmurinn er minni en stærð blokkarinnar
Ytri sundrun (external fragmentation)
Eitthvað sem var ekki nýtt á milli blokka
Að vita hverju er verið að skila, Venjulega aðferð:
Geyma lengd blokkarinnar í orðinu á undan blokkinni
* Þetta orð oft kallað haussvið eða haus (header)
– Krefst eins aukaorðs fyrir hverja úthlutaða blokk
Hvaða aðferðir eru til þess að halda utanum lausar blokkir?
Aðferð 1: Óbeinn listi notar lengdirnar til þess að hoppa— tengir allar blokkir
Aðferð 2: Tengdur listi af lausu blokkunum með bendum
Aðferð 3: Aðskildir listar
Aðferð 4: Blokkir raðaðar eftir stærð
Óbeinn (implicit) listi
Fyrir hverja blokk þarf bæði stærð og úthlutunarstöðu
Óbeinn listi, hvernig er hægt að finna lausa blokk
First-fit:
Next-fit:
Best fit:
Worst-fit:
First-fit:
– Byrja fremst í listanum, velja fyrstu lausu blokkina sem passar:
– Tekur línulegan tíma í fjölda blokka (úthlutaðra og lausra)
– Í reynd verður fremsti hluti listans dálítið brotakenndur (splintered)
Next-fit:
– Eins og First-fit, nema við byrjum þar sem síðasta leit endaði
– Ætti að vera hraðvirkari en First-fit: skoðum ekki aftur sömu blokkirnar
– Virðist þó valda verra uppbroti á blokkunum
Best fit:
– Byrja fremst, velja bestu lausu blokkina: með fæstu aukabætunum
– Afgangsbrotin verða lítil — fáum oftast betri minnisnýtingu
– Oftast hægvirkari en First-fit
Úthlutun á lausri blokk: Hvað er skipting (splitting)?
Ef úthlutað pláss er minna en lausa blokkin þá getum við
skipt henni upp
Óbeinn listi: Losun blokkar
Þurfum bara að hreinsa “úthlutað” bitann
En getur valdið “gervi sundrun” (false fragmentation)
Það er til nóg af samfelldu
lausu plássi, en úthlutarinn
mun ekki finna það
Þurfum að Sameina (coalesce) við næstu blokkir ef þær lausar
Óbeinn listi: Tvíátta sameining
Jaðarmerki (boundary tags) [Knuth73]
– Endurtaka stærðina í hinum enda blokkanna
– Leyfir okkur að ferðast um listann í hina áttina líka, en þarf aukapláss
– Mikilvæg og almenn aðferð!
Gallar við jaðarmerki
Innri sundrun
– Notar meira aukaminni
– Ekki hagkvæmt er mikið af litlum blokkum
Hvaða blokkir þurfa að hafa jaðarmerki?
Þurfum aðeins jaðarmerki fyrir lausar blokkir
Yfirlit yfir helstu úthlutunaraðferðir
Staðsetningaraðferð (placement)
Skiptingaraðferð (splitting)
Sameiningaraðferð (coalescing)
Staðsetningaraðferð (placement):
– First-fit, Next-fit, Best-fit, o.fl.
– Skiptum á lægri afköstum fyrir minni sundrun (fragmentation)
- Skiptingaraðferð (splitting):
– Hvernig skiptum við upp lausum blokkum?
– Hve mikla innri sundrun sættum við okkur við?
Sameiningaraðferð (coalescing):
– Tafarlaus sameining: sameina um leið og kallað er á free
– Tafin sameining: reyna að auka hraða á free með því að
bíða með sameiningu þar til hennar er þörf. Dæmi:
–Sameina um leið og listinn skannaður fyrir malloc
– Sameina þegar magn ytri sundrunar nær einhverju lágmarki (threshold)