MS Academic > Blogovi > Detaljno
C# - Razumevanje vrednosnih i referentnih tipova 2. deo
Autor:
luka |
25.05.2011. | Zavedeno pod:
C#value typesreference typesheapstackmemory organizationboxingunboxing
Radi boljeg razumevanja vrednosnih i referentnih tipova, kao nastavak na prethodni blog, pokušaću da objasnim organizaciju memorije i smeštanje podataka na stack i heap. Sledeći put ćemo videti kako vrednosne tipove možemo pretvoriti u referentne dodeljivanjem objekta i obrnuto tj. korišćenjem tehnika pakovanja (boxing) i otpakivanja (unboxing). Zatim će biti reči i o bezbednom kastovanju podataka i operatorima is i as.
3. Organizacija memorije
U računarsku memoriju (operativnu memoriju) se smeštaju programi koji se
izvršavaju i podaci koje koriste ti programi. Korisno je da proučimo
kako se podaci smeštaju u memoriju, kako bismo bolje razumeli razlike
između vrednosnih i referentnih tipova.
Operativni sistemi i jezičke infrastrukture (language runtime) često
dele memoriju za čuvanje podataka (data memory) u dve celine. Ove celine
se tradicionalno nazivaju stack i heap i organizovane su na posebne
načine. To je slučaj i u jeziku C#.
-
Stack je organizovan kao gomila kutija naređanih jedna na drugu.
Kada se pozove metoda, svaki parametar se postavi na vrh steka. Nakon
toga svaka lokalna promenljiva biva smeštena na stek. Kada se metoda
završi, sve se ukloni sa steka u obrnutom redosledu, a memorija se
oslobađa tako da stek postaje dostupan metodi koja se nakon toga pozove.
Ovakva politika smeštanja se naziva LIFO (last in first out).
- Heap je organizovan kao velika gomila kutija koje su raštrkane po
sobi. Svaka kutija ima labelu koja služi kao indikacija da li se
koristi. Kada se novi objekat kreira, runtime traži praznu kutiju i
alocira je za smeštanje tog objekta. Referenca na objekat se smešta u
lokalnu promenljivu na steku. Runtime vodi evidenciju o broju referenci
na svaku kutiju (jer više referenci može referencirati isti objekat).
Kada poslednja referenca nestane, runtime označi kutiju kao van
upotrebe, i u nekom trenutku garbage collector će je osloboditi za
ponovno korišćenje.
Nećemo ulaziti detaljnije u način rada garbage collectora u ovom blogu,
ali ću pokušati da dam odgovor na jedno pitanje koje mi se često postavlja. Kako garbage collector zna da više nijedna referenca ne referiše neki objekat na heap-u? Obratite pažnju da su reference na
objekte smeštene na steku, a ne na heap-u! Zato je neophodno je da se vodi
evidencija o svim podacima smeštenim na steku, a sve što je nedostižno
iz referenci smeštenih je neupotrebljivo. Ilustrovaću ovo
sledećim primerom:

Deklarisali smo dve reference unreachable1 i unreachable2 tipa
Unreachable i kreirali objekte na koje one ukazuju. Objekti tipa
Unreachable sadrže polje pointer koje je referenca na Unreachable
objekat (slika 1). U matematičkom slengu, neka je unreachable1.pointer =
unreachable2 i unreachable2. pointer = unreachable1 (slika 2). Ako
pustimo da refence unreachable1 i unreachable2 teže nuli (dodelimo im
null, oprostite na slengu), objekti unreachable1 i unreachable2 postaće
nedostižni, jer ne postoji podatak na steku koji ukazuje na njihovu
lokaciju (slika 3).

Međutim oni su međusobno uvezani, ukazuju jedno na
drugo, pa se postavlja pitanje da li će ih garbage collector pokupiti?
Odgovor je DA! Ukloniće ih iz prostog razloga jer su oni zaista
nedostižni za programera tj. ne može nikako da im pristupi jer ne
postoji referenca koja ukazuje na njih, oni samo lebde negde na heapu i
ukazuju jedno na drugo. Ovaj primer se može prozvoljno zakomplikovati,
ali princip je isti. Programer ne može pristupiti nijednom objektu koji
nije direktno ili indirektno (preko niza referenci, bilo da su na heap-u
ili na steku) dostižan iz neke početne reference koja je smeštena na
steku i takav objekat će biti pokupljen od strane garbage collectora
(and thank Zeus for that!).
Slobodno postavljajte pitanja i dajte sugestije i komentare, kao i do sada.
Hvala na pažnji!
Komentari
Lepo objasnjeno :)
anonymous, 02.06.2011. 01:06
Pošaljite komentar
Komentari će biti prikazani pošto ih odobri moderator sajta. Da bi komentari bili objavljeni, moraju biti u skladu sa politikom objavljivanja.