Ana içeriğe geç

Stack Belleği

İngilizcesi
Stack Memory
Türkçe karşılığı
yığın belleği
Okunuşu
stek memıri

Günlük kullanımda çoğunlukla İngilizcesi tercih edilir.

Güncellendi 2 dk okuma

Bu sayfayı paylaşın

Bağlantıyı gönderin, tanımı bağlantısıyla birlikte alıntılayın ya da kendi sitenizde bir kart olarak gösterin.

https://softwaredictionary.org/tr/terimler/stack-memory

Kısaca

Stack belleği, bir thread'in fonksiyonlarının yerel değişkenlerini ve dönüş adreslerini tuttuğu bölgedir; her çağrıda büyür, dönüşte otomatik olarak küçülür.

Stack belleği (stack memory) nedir?

Her fonksiyon çağrısı thread'in stack'ine bir stack çerçevesi (frame) ekler: fonksiyonun parametreleri, yerel değişkenleri ve dönülecek adres. Fonksiyon döndüğünde çerçevesi çıkarılır ve bellek anında yeniden kullanılabilir hâle gelir. Çerçeveler son giren ilk çıkar (LIFO) sırasıyla eklenip çıkarıldığı için ayırma yalnızca bir işaretçiyi kaydırmaktır; bu da stack'i son derece hızlı yapar.

Her thread'in kendi stack'i vardır ve boyutu sabit ve oldukça küçüktür: birkaç megabayt tipiktir; Linux'ta ana thread için çoğu zaman 8 MB, Windows'ta 1 MB. Stack'teki değerlerin boyutunun önceden bilinmesi gerekir ve yalnızca onları oluşturan fonksiyon yaşadığı sürece yaşarlar. Daha büyük, boyutu değişken ya da daha uzun ömürlü olan her şey heap'e gider.

Bir program çöktüğünde yazdırdığı stack trace, çağrı yığınının (call stack) bir anlık görüntüsüdür: hangi fonksiyonun hangisini çağırdığını, hata veren satıra kadar gösterir. Hata ayıklayıcılar da aynı çerçeveleri gösterir ve durduğu anda her fonksiyonun yerel değişkenlerini incelemenizi sağlar.

Sık yapılan bir yanlış, stack overflow'un yalnızca kötü yazılmış kodda olduğunu düşünmektir. Stack'te yer kalmadığı her durumda olur; en sık çok derine inen ya da hiç bitmeyen özyinelemeyle, ama çok büyük yerel dizilerle de. Derin özyinelemeyi bir döngüye çevirmek ya da büyük tamponları heap'e taşımak bunu çözer.

Önemli noktalar

  • Stack her fonksiyon çağrısının çerçevesini tutar: parametreler, yerel değişkenler, dönüş adresi.
  • Çerçeveler çağrıda eklenir, dönüşte çıkarılır; bu yüzden ayırma çok hızlıdır.
  • Her thread'in kendi küçük, sabit boyutlu stack'i vardır.
  • Stack trace, bir hata olduğunda çağrı yığınının anlık görüntüsüdür.
  • Derin ya da sonsuz özyineleme stack overflow'a yol açar.

Örnek

Çağrı yığınındaki çerçeveler ve bir stack overflow (Python)python
def total(prices):
    subtotal = sum(prices)      # 'prices' and 'subtotal' live in this call's frame
    return add_tax(subtotal)

def add_tax(amount):
    return amount * 1.2         # a new frame on top; popped when it returns

print(total([10, 20]))          # frames: <module> → total → add_tax

def countdown(n):
    return countdown(n - 1)     # no base case: every call adds a frame

countdown(10)                   # RecursionError: maximum recursion depth exceeded

Sık sorulan sorular

Stack ile heap belleği arasındaki fark nedir?

Stack fonksiyon çağrı çerçevelerini saklar ve son giren ilk çıkar sırasıyla otomatik yönetilir; bu hızlıdır ama küçük ve kısa ömürlüdür. Heap ise her an ayrılabilen, büyük olabilen ve serbest bırakılana ya da çöp toplayıcı toplayana kadar yaşayan veriyi saklar; bu daha esnektir ama daha yavaştır.

Stack overflow'a ne yol açar?

Thread'in sahip olduğundan fazla stack alanı kullanmak; genellikle çok derin ya da sonsuz özyinelemeyle veya çok büyük yerel diziler tanımlayarak. Program o zaman çöker ya da RecursionError veya StackOverflowError gibi bir hata verir.

Stack çerçevesi (stack frame) nedir?

Tek bir fonksiyon çağrısı için ayrılan, argümanlarını, yerel değişkenlerini ve dönüş adresini tutan stack belleği bloğudur. Her çağrıda yeni bir çerçeve oluşturulur, çağrı dönünce kaldırılır.

Sık karşılaştırılanlar

İlgili sayfalar

Bu sayfada bir hata ya da eksik mi gördünüz?Düzeltme önerin

Daha fazla

Ayarlar