Skip Navigation LinksMS Academic > Blogovi > Detaljno

C# - Razumevanje vrednosnih i referentnih tipova 2. deo

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#.

  1. 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).

  2. 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.




Napomena: Usled velikog broja automatski generisanih komentara (spam) prinuđeni smo da uvedemo dodatnu verifikaciju. Molimo vas da pre slanja vašeg komentara unesete u polje rezultat zbira.

captcha

Upišite rezultat: