koddla

Yazılımcıları bilgi ile güçlendirir.

Stack ve heap nedir?

Programlama dili kitapları, değer türlerinin stack üzerinde oluşturulduğunu ve referans türlerinin heap üzerinde oluşturulduğunu söyler. Ancak bu iki şeyin ne olduğunu açıklamada çok da iyi değillerdir. Peki,

  • Stack ve heap nerededir (gerçek bir bilgisayarın hafızasında fiziksel olarak)?
  • Ne ölçüde OS veya dilin çalışma süresi tarafından kontrol edilir?
  • Kapsamları nedir?
  • Her birinin boyutunu ne belirler?
  • Hangisi daha hızlıdır?

Stack, bir dizi yürütme işlemi için scratch alanı olarak bir kenara ayrılmış hafızadır. Bir işlev çağrıldığında, yerel değişkenler ve veri tutma işleri için stack üst kısmında bir blok ayrılır. Bu fonksiyon bir şey geri döndürdüğünde, blok kullanılmamış hale gelir ve bir sonraki işlev için kullanılır. Stack her zaman bir LIFO (son gelen önce çıkar) türünde ayrılmıştır; En yakın zamanda ayrılmış olan blok her zaman bir sonraki serbest bırakılacak olan bloktur. Bu yöntem, stackte iz sürmeyi basit hale getirir; stack üzerinde bir blok serbest bırakmak bir pointer ayarlamaktan daha fazla bir işlem değildir.

Heap ise dinamik paylaşımlar için kenara ayrılan bellektir. Stack’in aksine, heap için blokların yerleşiminde ve geri alınmasında kullanılacak güçlü bir desen yoktur; herhangi bir zamanda bir blok ayarlayabilir ve istediğiniz zaman da serbest bırakabilirsiniz. Bu yöntem heapteki hangi parçaların tahsis edildiğini veya herhangi bir zamanda boş olduğunu takip etmek için çok daha karmaşıktır; Farklı kullanım kalıpları için heap performansını ayarlamak adına mevcut birçok özel heap paylaştırıcısı bulunur.

Daha basit bir şekilde stack ve heap

Stack ve heap belleğin nasıl tahsis edileceğini söyleyen yollar için kullanılan genel terimlerdir. Birçok farklı şekilde uygulanabilirler ancak uygulama temel kavramlar benzerdir.

Stackteki öğeler yerleştirdikleri sırada, biri diğerinin üzerinde durur ve sadece en üstte olanı kaldırabilirsiniz. Bir kağıt yığınında olduğu gibi. Yığının sadeliği nedeniyle tahsis edilmiş belleğin her bir bölümünün kaydını içeren bir tabloya sahip olmanız gerekmez; ihtiyacınız olan tek bilgi, yığının sonunu gösteren bir işarettir. Allocate ve de-allocate için, tek işaretçinin sadece artırırlması ve azaltılması yeterlidir. Not: Bir yığın bazen hafızanın bir bölümünün üstünde başlatılabilir ve yukarıya doğru büyümek yerine aşağı doğru uzanabilir.

Heap’te ise öğelerin yerleştirilmesinin özel bir yöntemi yoktur. Açık seçik bir üst öğe olmadığından, bir erişim yolu ile öğelere erişebilir ve çıkarabilirsiniz. Bellek tahsisinde, belleğin tam bir kaydının tutulması ve parçalamayı azaltmak için bir bakım yöntemi gerekir. Ayrıca, istenen boyuta uyacak kadar hafıza segmentlerini bulmak da önemlidir.

Her thread bir stack üzerinde çalışırken, tipik olarak uygulamalar için sadece bir heap bulunur (farklı türde paylaşım için birden fazla heap olması da nadir değildir).

OS veya dil çalışma süresi tarafından hangi ölçüde kontrol edilir?

OS, her sistem düzeyi için thread oluşturulduğunda bir stack tahsis eder. Genellikle OS, uygulama için heap tahsis etmek üzere dil tarafından çalıştırılır.

kapsamı nedir?

Stack bir threade bağlanır, bu nedenle thread sona erdiğinde stack tekrar elde edilir. Heap genellikle runtime tarafından uygulama başlangıcında tahsis edilir ve uygulama (teknik olarak işlem) çıkışında geri alınır.

stack ve heap boyutunu ne belirler?

Bir thread oluşturulduğunda stack boyutu ayarlanır. Heap’ın boyutu uygulama başlangıcına ayarlanır. Ancak heap alanı gerekli olduğunda büyüyebilir (paylaştırıcı işletim sisteminden daha fazla bellek talep eder).

Stack mi heap mi daha hızlıdır?

Stack daha hızlıdır, çünkü erişim deseni, bellek ayırmak ve geri döndürmek daha uygundur – pointer/integer artırılır veya azaltır. Heap için paylaşım ise bir çok daha karmaşık bir desene sahiptir. Ayrıca, stackte her bayt çok sık bir şekilde tekrar kullanılabilir. Bu da işlemcinin önbelleğe bağlanma eğilimini artırır, ki bu işlemi çok hızlı hale getirir. Başka bir performans noktası ise, heapin global bir kaynak olması sebebiyle multi-thread safe olmasıdır.

Stack ve Heap özellikleri

Stack:

  • Heap gibi RAMde saklanır.
  • Stack üzerinde oluşturulan değişkenler kapsam dışına çıkabilir ve otomatik olarak deallocate edilir.
  • Heape göre daha hızlı allocate edilir.
  • Belirli bir stack yapısı ile uygulanır.
  • Local veriyi kaydeder, adres geri döndürür ve parametre işlemek için kullanılır.
  • Stack çok fazla kullanıldığında taşar – ovefrlow
  • Stack’te oluşturulan veriler pointera gerek olmadan kullanılabilir.
  • Stack’i ne kadar veri kullanacağınızı önden biliyorsanız ve veri miktarı fazla değilse kullanırsınız
  • Genellikle programınız başlarken belirlenmiş bir boyutu bulunur.

Heap:

  • Stack gibi RAMde saklanır.
  • C++’da heap’te oluşturulan değişkenler elle yok edilmelidir ve kapsam dışına taşmamalıdır.
  • Stack’e göre allocate işlemi daha yavaştır
  • Programın istediği anda allocate edilir.
  • Çok fazla allocate/deallocate işlemi varsa parçalanmalar oluşabilir
  • C++ veya C’de, heap üzerinde oluşturulan veriler bir pointer aracılığı ile işaretlenir ve new veya malloc aracılığı ile allocate edilir.
  • Eğer çok büyük bir buffer istenmişse allocate hatası verir.
  • Heapi ne kadar veri kullanacağınız önden bilinmediğinde ve büyük miktarda dataya ihtiyacınız varsa kullanırsınız.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Back to top