1. Ana Sayfa
  2. Mühendislik
  3. Stack ve Heap Kavramları

Stack ve Heap Kavramları

Stack ve Heap Kavramları

Yazılım geliştiriyor veya bu alanda eğitim görüyorsanız muhakkak stack ve heap kavramları ile karşılaşmışsınızdır. Peki nedir bu stack ve heap?

Kodumuz işletim sisteminde bir yer kaplar. Bu yerin boyutu kimi zaman belirli yani değişmez iken kimi zaman ise kullanıcının program esnasında gireceği verilere göre değişebilecek durumdadır. Temel olarak bu farklılıktan dolayı iki farklı yöntem mevcut. Bir diğer deyişle değerlerin RAM de saklandığı 2 kısım vardır: Stack ve Heap. İki kelime de Türkçeye ‘yığın’ olarak çevrilse de aralarında çok önemli farklar bulunuyor. Kısaca Stack için, boyutları belli sabit değerlerin saklandığı kısım ve Heap için de, değişken değerlerin saklandığı kısım demek mümkün.

Stack ve Heap

Stack ve heap
Fotoğraf: @jazzcoding

Stack ve Heap bellekte (RAM’de) bulunan mantıksal yapılardır demiştik. Değer tip (value type) dediğimiz int, short, byte, long, decimal, double, float gibi tipler stackte tutulur. Stackte veriler üst üste (LIFOLast in First out) mantığında dizilir ve sırası gelmeden aradaki bir değer ile işlem yapılamaz. Class type (Sınıf tipi) değişkenler referans tiplerdir referans ettikleri model (referans) stackte değerleri ise heapde saklanır.

NOT: Değer tipler veriyi tutan değişken türleridir. Referans tipler ise veri yerine verinin bellekteki adresini tutan değişken türleridir. (Referans tiplere string, array, interface, class, pointer’ı örnek olarak vermek mümkün.)

Stack ve Heap
Fotoğraf: @koderhq.com

Stack ve Heap Arasındaki Farklar

Heap ve Stack arasında ki en önemli farklardan birisi heapde veriler karışık bir şekilde saklanırken stackte artan ya da azalan adres mantığında (big and little endian) çalışır. Buna bağlı olarak heapde yer alan bir veriye erişmek stackte yer alan bir veriye erişmeye göre daha maliyetli bir işlemdir. Başka bir fark ise stackteki veri hemen silinirken heapdeki veri Garbage Collector algoritmasına bağlıdır.

Stack bellekten statik olarak yer tahsisi için kullanılırken, Heap dinamik olarak yer tahsisi etmeyi sağlar. Her ikisi de Ram bölgesinde bulunur. Stack’te yer alan veriler direk bellek içine yerleştirilir dolayısıyla erişimi çok hızlıdır. Heap ise runtime (çalışma zamanı) anında kullanılırlar ve dağınık bir bellek göz yapısı olduğu için erişimi stack kadar kolay olmaz dolayısıyla yavaş çalışır. Stack bellekteki veri hemen silinirken Heap bellekteki verinin silinmesi Garbage Collector’a (Çöp toplama mekanizmasına) bağlıdır. Stack alanı sınırlı olduğundan çok büyük sayıda ve büyük tiplerde veri atanması belleğin dolmasına sebep olabilir.

Stack veri yapısına üst üste dizili tabaklar örnek verilebilir. Alttaki bir tabağı almak istediğinizde nasıl ki üstündeki tabakları da indirmeniz gerekiyorsa, stack veri yapısında da aradaki bir veriyi alabilmek için öncelikle üsttekileri çekmek gerekiyor.

Kullanacağınız yerin boyutunu tam olarak biliyorsanız Stack, ihtiyacınız olan boyutu tam olarak bilmiyorsanız Heap kullanımı daha mantıklı bir tercih olacaktır.

Stackoverflow Nedir?

Stack-Overflow - stack ve heap

İlk duyuşunuzda aklınıza stackoverflow.com sitesi gelmiş olabilir ki sitenin ismi zaten buradan geliyor.

Yığın bellek alanı, program çalışmaya başladığı anda belirlenir ve daha sonra bu alanın boyutu değiştirilemez. Bu alan, işletim sistemi tarafından genellikle kısıtlı şekilde belirlendiği için yığın üzerindeki yoğun ekleme işlemlerinde hafıza birimi taşması sorunu yaşanabilmektedir. Stackoverflow sitesi de tam da bu sorun üzerine kurulmuş bir sitedir. Dolayısıyla yazacağımız programlarda stack bölgesinin yönetiminde ne kadar bilgili olursak, o kadar az sorun yaşarız.

 Stack Overflow logo

Stack’ın Heap’den bir farkı da önceden belirlenmiş bir boyutu olmasıdır, yani belirli miktarda veriyi tutabilir. Bu boyut windows’ta default olarak 1mb’dır, fakat bazı Unix sistemlerinde bu boyut 8 mb’a kadar çıkabilir. Eğer program Stack’e bu boyutun kaldırabileceğinden fazla veri koymaya çalışırsa Stackoverflow durumuyla karşılaşılır.

Verimli kodlama yapabilmek için yazdığımız kodlar çalıştığı esnada arka planda neler olduğunu bilmemiz gerekiyor. Yazdığımız kodların hepsi RAM da yer kaplamakta. Performansın önemi ufak programlarda çok hissedilmese de profesyonel çalışmalarda hayati bir etkiye sahip.

Ek olarak, değer tipli değişkenlerin adreslerini (referanslarını) parametre olarak aktarabilmek “REF” ve “OUT” keywordleri ile mümkün!

Yorum Yap

Yorum Yap