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.
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
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 exceededSı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
- Heap Belleğiİşletim Sistemleri, s. 13Heap belleği, boyutu ya da ömrü önceden bilinmeyen, çalışma zamanında ayrılan ve onu oluşturan fonksiyondan uzun yaşayabilen verilerin tutulduğu bölgedir.
- YığınVeri Yapıları, s. 36Yığın, öğeleri son giren ilk çıkar (LIFO) sırasıyla saklayan bir veri yapısıdır; en son eklenen öğe her zaman ilk çıkarılan öğedir.
- ÖzyinelemeProgramlamanın Temelleri, s. 42Özyineleme, bir fonksiyonun sorunu, basit bir temel duruma ulaşana dek aynı sorunun daha küçük sürümleri için kendisini çağırarak çözdüğü tekniktir.
- Threadİşletim Sistemleri, s. 34Thread, işletim sisteminin zamanlayabileceği en küçük yürütme birimidir; bir process içinde çalışır ve o process'in belleğini diğer thread'lerle paylaşır.
- FonksiyonProgramlamanın Temelleri, s. 20Fonksiyon, belirli bir işi yapan, isteğe bağlı olarak parametre denen girdiler alıp sonuç döndürebilen, adlandırılmış ve yeniden kullanılabilir kod bloğudur.
- Memory Leakİşletim Sistemleri, s. 20Memory leak, bir programın artık ihtiyaç duymadığı belleği tutmayı sürdürdüğü hatadır; bellek kullanımı zamanla artar, sistem yavaşlayabilir ya da çökebilir.
Bu sayfada bir hata ya da eksik mi gördünüz?Düzeltme önerin