Herhangi bir programlama dili dökümanına baktığımız zaman Value Type ‘ların stack bellekte, Reference Type’ların da heap bellekte tutulduğu yazar. Pek

Herhangi bir programlama dili dökümanına baktığımız zaman Value Type ‘ların stack bellekte, Reference Type’ların da heap bellekte tutulduğu yazar. Peki nedir bu stack ve heap bellek? Bu kavramların anlaşılması yazdığımız kodun arka planda neler yaptığı hakkında bize bilgiler verir. Stack ve Heap ‘i açıklarken belleğin nasıl yönetildiği, nasıl kullanıldığı hakkında fikir edinmiş olacağız.

Stack belleği uzun bir kutu şeklinde düşünebiliriz. Yeni bir nesne eklemek istediğimiz de, bu nesne en üstte olacak şekilde sıralanır. En alttaki nesneye ulaşmak için en üstteki nesneleri tek tek çıkarmamız gerekir. Basittir. Heap belleği ise geniş bir oda şeklinde düşünelim. Boş bulduğumuz her yere bir nesne yerleştirebiliriz ve istediğimiz bir nesneyi de istediğimiz anda alabiliriz. Tabiki geniş bir odada istediğimiz nesneyi aramak vakit alan bir işlemdir. Komplekstir.

Şimdi de programlama dilinde nasıl çalıştığına bakalım. Instance değişkenleri ve objeler heap üzerindedir. Lokal değişkenler ve metotlar da stack üzerindedir. Bir fonksiyon çağırdığımız zaman, işletim sistemi stack belleğin en üst kısmında bu fonksiyon ve lokal elemanları için bir yer açar ve sırayla onları oraya ekler. Örnek üzerinden gidersek konuyu daha iyi kavramış oluruz.

Class Deneme() 
	Deneme dnm; // Instance değişkeni 
	string ad ; // instance değişkeni 
	Main()
	{ 
		Deneme d ; // Lokal değişken 
		d = New Deneme(); 
		d.Hesapla(d); 
	} 
	void Hesapla(Deneme a)
	{ 
		//lokal değişken : d 
		dnm = new Deneme(); 
		a.Yazdir(“Hello World”); 
	} 
	void Yazdir(string yazi)
	{ 
		//lokal değişken : 
		yazi ad = yazi; 
	} 
}
  1. Main metodu stack belleğe yerleştirilir.
  2. d bir reference tipindedir, stack belleğe alınır. Fakat daha nesnesi oluşturulmamıştır.
  3. d nesnesi heap bellekte oluşturulur ve bu d ye atanır.
  4. Hesapla metodu çağrılır ve d nin bir kopyası bu metoda gönderilir.
  5. Hesapla metodu stack belleğe eklenir.
  6. Hesapla metodu içindeki a lokal değişkeni de stack belleğe eklenir.
  7. dnm nesnesi heap bellekte oluşturulur.
  8. Yazdir metodu çağrılır.
  9. Yazdir metodu stack belleğe eklenir.
  10. Yazdir metodu içindeki “yazi” lokal değişkeni de stack belleğe eklenir.
  11. “ad” değişkeni string bir nesneyi de referans etmeye başlamıştır.
  12. Yazdir metodunda sonra satıra geldiğimizde yazdir metodu ve onunla ilgili olan “yazi” lokal değişkeni stack bellekten çıkarılır.
  13. Bu şekilde diğer metotlarda da son satıra gelince stack bellekten çıkarılır. Gördüğünüz gibi önce main metodu çağrıldı, stack belleğe yerleştirildi. Main metotu da Hesapla metodunu çağırdı. Hesapla metodu da Yazdir metodunu çağırdı.

Stack belleğin en üstünde şu anda yazdir metodu bulunuyor. Yazdir metodu işini bitirdikten sonra stack bellekten çıkarıldı. Şimdi en üstte Hesapla metodu bulunuyor. Hesapla metodu da işini bitirdi ve stack bellekten çıkarıldı. Aradaki farklara maddeler halinde göz atacak olursak : Stack

  • LIFO prensibine göre çalışır. (Last In First Out). Yani son gelen ilk olarak çıkar. Bunu bir kutu gibi düşünmüştük. Kutuya bir kitap eklemek istediğimizde en üste ekleriz. Kutudan bir kitap çıkarmak istiyorsak en üstteki kitabı alıp çıkarırız. En alttaki kitabı çıkarmak için bütün kitapları tek tek çıkarmamız lazım.
  • Her bir thread (iş parçacığı) için bir tane stack bellek oluşturulur.
  • Maksimum boyutu thread oluşturulurken ayarlanır.
  • Stack, daha hızlıdır. Çünkü çalışma prensibi çok basittir ve ulaşılmak istenen veriler ve boş alanlar ardarda sıralanmış olur.
  • Bu kısımda oluşturulmuş veriler için pointer kullanımına gerek yoktur. 
  • Lokal değişkenler ve metotlar bu kısıma bağlıdır. Heap
  • İçindekiler karışık bir şekilde sıralanmıştır. Bunu da oda gibi düşünmüştük. 
  • Heap bellek, uygulama başlatıldığında başlar. Ortak olarak kullanılır. Stack gibi her bir thread için ayrı bir tane oluşturulmaz. Bir process için bir heap oluşturulur diyebiliriz. 
  • Stack belleğe göre daha yavaştır. Nedeni ise herhangi bir nesneye ulaşmak için kompleks bir arama yapmanız gerekir. Bir nesneyi boş bulduğumuz herhangi bir yere koyabiliriz. Karmaşıktır. 
  • “Memory Leaks” , “Fragmentation” bu kısımda ortaya çıkar. 
  • Yer sorunu olduğu zaman işletim sisteminden daha fazla yer isteyebilir. Yani genişleyebilir. 
  • Instance değişkenleri ve objeler bu bölgeye bağlıdır.

HEAP

  • İçindekiler karışık bir şekilde sıralanmıştır. Bunu da oda gibi düşünmüştük.
  • Heap bellek, uygulama başlatıldığında başlar. Ortak olarak kullanılır. Stack gibi her bir thread için ayrı bir tane oluşturulmaz. Bir process için bir heap oluşturulur diyebiliriz.
  • Stack belleğe göre daha yavaştır. Nedeni ise  herhangi bir nesneye ulaşmak için kompleks bir arama yapmanız gerekir. Bir nesneyi boş bulduğumuz herhangi bir yere koyabiliriz. Karmaşıktır.
  • “Memory Leaks” , “Fragmentation” bu kısımda ortaya çıkar.
  • Yer sorunu olduğu zaman işletim sisteminden daha fazla yer isteyebilir. Yani genişleyebilir.
  • Instance değişkenleri ve objeler bu bölgeye bağlıdır.

İyi çalışmalar..

İlgili Makaleler

Bu yazıya 0 yorum yapılmış.

Yorum Gönder