Search
 
 
  Engleski
 
 
 
Open in this window (click to change)
Forum@DeGiorgi: Početna
Forum za podršku nastavi na PMF-MO
Login Registracija FAQ Smajlići Članstvo Pretražnik Forum@DeGiorgi: Početna

Kako alocirati puno memorije?
WWW:

Moja sarma
 
Započnite novu temu   Odgovorite na temu   printer-friendly view    Forum@DeGiorgi: Početna -> Kolegiji 1. godine, preddiplomski studij Matematika -> Programiranje 1 i 2
Prethodna tema :: Sljedeća tema  
Autor/ica Poruka
krcko
Forumaš nagrađen za životno djelo
Forumaš nagrađen za životno djelo


Pridružen/a: 07. 10. 2002. (15:57:59)
Postovi: (18B3)16
Sarma = la pohva - posuda
655 = 759 - 104

PostPostano: 9:53 uto, 13. 4. 2004    Naslov: Kako alocirati puno memorije? Citirajte i odgovorite

Gradim stablo koje ce narasti na 100-tinjak megabajta i vise. Jasno, necu alocirati sve odjednom, no zanima me koja je optimalna velicina blokova memorije koje trazim od malloc-a.

Prva ideja je alocirati cvor po cvor. Cini se najprirodnije, no strah me da ce zbog jaaako cestog pozivanja doci do fragmentacije memorije. Pa bi rupe izmedju mogle popapati vise memorije nego iskoristeni dio.

Alternativa je alocirati u blokovima neke razumne velicine, recimo izmedju 100 Kb i nekoliko Mb. Unutra punim cvorove jedan za drugim dok ne potrosim blok, tek onda ponovo trazim memoriju od malloca.

Pitanje je zna li netko kako se to "standardno" radi? Jasno je da implementacija alociranja memorije nije stvar C-a nego ovisi o OS-u. Prema dosadasnjim eksperimentima na W2K isplati se alocirati u vecim blokovima, a za Linux nisam siguran. Zna li netko vise o tome?
Gradim stablo koje ce narasti na 100-tinjak megabajta i vise. Jasno, necu alocirati sve odjednom, no zanima me koja je optimalna velicina blokova memorije koje trazim od malloc-a.

Prva ideja je alocirati cvor po cvor. Cini se najprirodnije, no strah me da ce zbog jaaako cestog pozivanja doci do fragmentacije memorije. Pa bi rupe izmedju mogle popapati vise memorije nego iskoristeni dio.

Alternativa je alocirati u blokovima neke razumne velicine, recimo izmedju 100 Kb i nekoliko Mb. Unutra punim cvorove jedan za drugim dok ne potrosim blok, tek onda ponovo trazim memoriju od malloca.

Pitanje je zna li netko kako se to "standardno" radi? Jasno je da implementacija alociranja memorije nije stvar C-a nego ovisi o OS-u. Prema dosadasnjim eksperimentima na W2K isplati se alocirati u vecim blokovima, a za Linux nisam siguran. Zna li netko vise o tome?



_________________
Vedran Krcadinac

Ljudi su razliciti, a nula je paran broj.
[Vrh]
Korisnički profil Pošaljite privatnu poruku Pošaljite e-mail Posjetite Web stranice
Matko
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 15. 06. 2003. (01:56:38)
Postovi: (57)16
Sarma = la pohva - posuda
= 10 - 2

PostPostano: 17:54 uto, 13. 4. 2004    Naslov: Re: Kako alocirati puno memorije? Citirajte i odgovorite

Memory management je nesto sto je uvijek pod kontrolom OS-a i nad time bez odgovarajucih specijalnih API funkcija programer nema nikakvu kontrolu direktno iz samog (ANSI) C-a. S druge strane, memory management bi po defaultu trebao biti dovoljno inteligentan da programeru uvijek omoguci maksimalno mogucu alokaciju memorije. To znaci da onoliko memorije koliko bi mogao alocirati u malim chunkovima bi isto tako trebalo biti moguce alocirati i odjednom.

Fragmentacija memorije je jedna sasvim druga prica i nad time je dosta tesko imati uopce ikakvog utjecaja. Svaki proces u OS-u prilikom startanja dobiva svoj virtualni adresni prostor koji je za njega linearan. Heap (prostor iz kojeg se crpe dinamicki alocirani komadi memorije) jest u tom adresnom prostoru jedan najobicniji segment, i dok iz procesovog kuta gledanja tu moze biti sve uredno poslozeno, dotle u stvarnom fizickom adresnom prostoru (koji je pod vise-manje iskljucivim protektoratom OS-a) moze vladati prilicno razbacano stanje. Naravno, ukoliko program radi puno sitnih alokacija i delakocija, tada ce i u procesovom privatnom heapu stanje moze biti itekako razbacano, dajuci sve skupa razbacanost^2.

Iz tog razloga vec u samom startu nije dobro razmisljati o tome da se u programu radi puno alokacije i dealokacije. U ovisnosti o kvaliteti memory management rutina i fragmentiranosti memorijskog prostora (sto je tesko predvidljiva velicina) malloc() i free() su po svom vremenu izvrsavanja spore do jako spore funkcije, pa zbog toga ucestalost njihovih pozivanja ne bi smjela biti jako velika (ukoliko se ne zele nepotrebno narusiti performanse programa). Standardno (i najjednostavnije) rjesenje jest alocirati odmah prilikom startanja programa dovoljno veliki komad memorije (i 100 MB ako treba ukoliko to dopustaju resursi) kao memory pool, dealocirati ga, naravno, tek prilikom izlaska iz programa, te definirati vlastite alokacijske rutine za alokaciju i dealokaciju chunkova koje ce koristiti memory pool (a koje ce vjerojatno biti moguce implementirati efikasnije ukoliko se uzmu u obzir specificnosti osnovnih struktura podataka za koje se alocirava memorija).

Naravno, ne treba previse razbijati glavu s time ukoliko ti se sve to ne da programirati. Postoji vec hrpa gotovih open source implementacija za memory management (ja imam neke za C++, ali sigurno isto tako postoje i za C) koje se mogu naci na netu (afaik, obicno dolaze kao dio implementacije garbage collectora za C, pa ces ih searchajuci zajedno s tim keywordom vjerojatno lakse uspjeti naci).
Memory management je nesto sto je uvijek pod kontrolom OS-a i nad time bez odgovarajucih specijalnih API funkcija programer nema nikakvu kontrolu direktno iz samog (ANSI) C-a. S druge strane, memory management bi po defaultu trebao biti dovoljno inteligentan da programeru uvijek omoguci maksimalno mogucu alokaciju memorije. To znaci da onoliko memorije koliko bi mogao alocirati u malim chunkovima bi isto tako trebalo biti moguce alocirati i odjednom.

Fragmentacija memorije je jedna sasvim druga prica i nad time je dosta tesko imati uopce ikakvog utjecaja. Svaki proces u OS-u prilikom startanja dobiva svoj virtualni adresni prostor koji je za njega linearan. Heap (prostor iz kojeg se crpe dinamicki alocirani komadi memorije) jest u tom adresnom prostoru jedan najobicniji segment, i dok iz procesovog kuta gledanja tu moze biti sve uredno poslozeno, dotle u stvarnom fizickom adresnom prostoru (koji je pod vise-manje iskljucivim protektoratom OS-a) moze vladati prilicno razbacano stanje. Naravno, ukoliko program radi puno sitnih alokacija i delakocija, tada ce i u procesovom privatnom heapu stanje moze biti itekako razbacano, dajuci sve skupa razbacanost^2.

Iz tog razloga vec u samom startu nije dobro razmisljati o tome da se u programu radi puno alokacije i dealokacije. U ovisnosti o kvaliteti memory management rutina i fragmentiranosti memorijskog prostora (sto je tesko predvidljiva velicina) malloc() i free() su po svom vremenu izvrsavanja spore do jako spore funkcije, pa zbog toga ucestalost njihovih pozivanja ne bi smjela biti jako velika (ukoliko se ne zele nepotrebno narusiti performanse programa). Standardno (i najjednostavnije) rjesenje jest alocirati odmah prilikom startanja programa dovoljno veliki komad memorije (i 100 MB ako treba ukoliko to dopustaju resursi) kao memory pool, dealocirati ga, naravno, tek prilikom izlaska iz programa, te definirati vlastite alokacijske rutine za alokaciju i dealokaciju chunkova koje ce koristiti memory pool (a koje ce vjerojatno biti moguce implementirati efikasnije ukoliko se uzmu u obzir specificnosti osnovnih struktura podataka za koje se alocirava memorija).

Naravno, ne treba previse razbijati glavu s time ukoliko ti se sve to ne da programirati. Postoji vec hrpa gotovih open source implementacija za memory management (ja imam neke za C++, ali sigurno isto tako postoje i za C) koje se mogu naci na netu (afaik, obicno dolaze kao dio implementacije garbage collectora za C, pa ces ih searchajuci zajedno s tim keywordom vjerojatno lakse uspjeti naci).


[Vrh]
Korisnički profil Pošaljite privatnu poruku
Prethodni postovi:   
Započnite novu temu   Odgovorite na temu   printer-friendly view    Forum@DeGiorgi: Početna -> Kolegiji 1. godine, preddiplomski studij Matematika -> Programiranje 1 i 2 Vremenska zona: GMT + 01:00.
Stranica 1 / 1.

 
Forum(o)Bir:  
Ne možete otvarati nove teme.
Ne možete odgovarati na postove.
Ne možete uređivati Vaše postove.
Ne možete izbrisati Vaše postove.
Ne možete glasovati u anketama.
You cannot attach files in this forum
You can download files in this forum


Powered by phpBB © 2001, 2002 phpBB Group
Theme created by Vjacheslav Trushkin
HR (Cro) by Ančica Sečan