Yığın ve yığın nerede ve nerede?

Programlama dillerindeki kitaplar, bu iki şeyin ne olduğunu açıklamadan yığında değer tiplerinin yaratıldığını ve öbek üzerinde referans türlerinin yaratıldığını açıklar. Bunun için net bir açıklama okumamıştım. Bir yığının ne olduğunu biliyorum. Ancak,

  • nerede ve ne (fiziksel olarak gerçek bilgisayar belleğinde)?
  • İşletim sistemi veya dil tarafından ne ölçüde kontrol ediliyorlar?
  • Onların hacmi nedir?
  • Her birinin boyutunu ne belirler?
  • Daha hızlı ne yapar?
7380
17 сент. mattshane ayarlandı 17 eylül 2008-09-17 07:18 '08, 07:18, 2008-09-17 07:18
@ 25 cevap

Yığın, bir yürütme iş parçacığı için sıfırdan boşluk olarak ayarlanmış bir hafızadır. Bir işlev çağrıldığında, blok yerel değişkenler ve bazı kimlik bilgileri için yığının en üstünde saklanır. Bu işlev döndüğünde, blok kullanılmaz ve bir dahaki sefer çağrıldığında kullanılabilir. Yığın her zaman LIFO sırasına göre ayrılır (ilk sıradaki sonuncu); En yeni ayrılmış blok her zaman serbest bırakılacak bir sonraki bloktur. Bu, yığını izlemeyi kolaylaştırır; bir bloğu yığından bırakmak, tek bir işaretçi ayarından başka bir şey değildir.

Bir yığın, dinamik ayırma için tahsis edilmiş bir hafızadır. Yığının aksine, blokları bir yığından ayırmak ve serbest bırakmak için bir zorlama şablonu yoktur; İstediğiniz zaman bir blok seçip istediğiniz zaman bırakabilirsiniz. Bu, herhangi bir zamanda yığının hangi kısımlarının dağıtıldığını veya serbest bırakıldığını izlemeyi çok zorlaştırır; Farklı kullanım şekilleri için yığın performansını ayarlamak için birçok özel cum distribütörü bulunmaktadır.

Her iş parçacığı bir yığın alır, bir uygulama için genellikle sadece bir yığın kullanılır (farklı yerleştirme türleri için birkaç yığın olması nadir değildir).

Sorularınıza doğrudan cevap vermek için:

İşletim sistemi veya dil tarafından ne ölçüde kontrol ediliyorlar?

İşletim sistemi, bir iş parçacığı oluştururken her sistem iş parçacığı için bir yığın ayırır. Genellikle, işletim sistemi bir uygulamaya bir öbek ayırmak için dil yürütme ortamı tarafından çağrılır.

Onların hacmi nedir?

Yığın ipliğe tutturulur, böylece iplik yığından çıktığında düzeltilir. Bir yığın genellikle uygulama çalışma zamanında başlatıldığında ve uygulama (teknik işlem) çıktıktan sonra geri döndüğünde atanır.

Her birinin boyutunu ne belirler?

Bir iş parçacığı oluştururken yığın boyutu ayarlanır. Yığın boyutu, uygulama başlatıldığında ayarlanır, ancak gerektiğinde artabilir (tahsisatçı işletim sisteminden daha fazla bellek ister).

Daha hızlı ne yapar?

Yığın daha hızlıdır, çünkü erişim kalıbı hafızadan ayrılmasını ve boşaltılmasını önemsiz kılar (işaretçi / tam sayı basitçe büyür veya küçülür) ve öbek tahsis veya tahsisatla ilgili çok daha karmaşık finansal tablolara sahiptir. Ek olarak, yığıntaki her bayt sıklıkla tekrar kullanılır, bu işlemcinin önbelleğinde gösterilme eğiliminde olduğu anlamına gelir, bu da onu çok hızlı yapar. Bir başka yığın performans isabeti, esas olarak küresel bir kaynak olan yığının tipik olarak çoklu yivli olması gerektiğidir. Her dağıtım ve sürüm - kural olarak, programdaki "tüm" diğer yığın çağrılarıyla senkronize edilmiş olmalıdır.

Gösteriyi temizle: 2019

5436
17 сент. Cevap Jeff Hill 17 Eylül'de verildi . 2008-09-17 07:52 '08, 07:52, 2008-09-17 07:52

yığın

  • Bilgisayarın RAM'inde bir demet olarak kaydedilmiş.
  • Yığında oluşturulan değişkenler kapsam dışına çıkar ve otomatik olarak serbest bırakılır.
  • Yığındaki değişkenlere kıyasla ayırmak için çok daha hızlı.
  • Gerçek yığın veri yapısı ile uygulanır.
  • Yerel verileri kaydeder, parametreleri iletmek için kullanılan adresleri döndürür.
  • Çok fazla yığın kullanıldığında yığın taşması olabilir (çoğunlukla sonsuz veya çok fazla özyineleme, çok büyük dağılımlar).
  • Yığında oluşturulan veriler, işaretçiler olmadan kullanılabilir.
  • Derlemeden önce ne kadar veri ayırmanız gerektiğini tam olarak bilseydiniz yığını kullanacaktınız ve çok büyük değil.
  • Genellikle, program başladığında maksimum boyut zaten belirlenir.

Öbek:

border=0
  • Bilgisayarın belleğinde, yığınla aynı şekilde depolanır.
  • C ++ 'da, yığıntaki değişkenler elle imha edilmeli ve asla kapsam dışına çıkmamalıdır. Veriler delete , delete[] veya free olarak serbest bırakılır.
  • Yığındaki değişkenlere kıyasla tahsisat işlemi daha yavaştır.
  • Talep üzerine program tarafından kullanılmak üzere bir veri bloğu tahsis etmek için kullanılır.
  • Çok fazla tahsis ve muafiyet varken, parçalanma olabilir.
  • C ++ veya C'de, öbek üzerinde oluşturulan veriler işaretçiler tarafından gösterilecek ve sırasıyla new veya malloc tahsis edilecektir.
  • Çok fazla tampon gerektiğinde dağıtılmaması olabilir.
  • Çalışma zamanında tam olarak ne kadar veriye ihtiyacınız olduğunu bilmiyorsanız veya çok fazla veri ayırmanız gerekirse, bir demet kullanırsınız.
  • Bellek sızıntısından sorumlu.

örnek:

2164
17 сент. Cevap Brian R. Bondy tarafından 17 Eylül. 2008-09-17 07:20 '08, 07:20 2008-09-17 07:20

En önemli nokta, yığın ve yığının bellek ayırma yöntemleri için genel terimler olmasıdır. Farklı şekillerde uygulanabilirler ve bu terimler temel kavramlara uygulanabilir.

  • Elementler yığında, elemanlar, yerleştirildikleri sırayla üst üste yerleştirilir ve sadece üst kısmı çıkarabilirsiniz (her şeyi yatırmadan).

    2019

1294
19 марта '09 в 17:38 2009-03-19 17:38 Cevap thomasrutter tarafından 19 Mart 09: 17 : 38'te verildi 2009-03-19 17:38

(Bu cevabı az çok kandırdığı başka bir sorudan değiştirdim.)

Sorunuzun cevabı uygulamaya özeldir ve derleyiciler ve işlemci mimarileri arasında değişebilir. Ancak, bu basitleştirilmiş bir açıklamadır.

  • Hem yığın hem de yığın, temel işletim sisteminden tahsis edilen bellek alanlarıdır (genellikle talep üzerine fiziksel belleğe eşlenen sanal bellek).
  • Çok iş parçacıklı bir ortamda, her iş parçacığının kendi tamamen bağımsız yığını olacak, ancak yığını ayırır. Paralel erişim öbek üzerinde kontrol edilmelidir ve istif üzerinde mümkün değildir.

Bir yığın

  • Öbek, kullanılmış ve boş blokların bağlantılı bir listesini içerir. Yeni yığın tahsisleri ( new veya malloc ) serbest bloklardan birinden uygun bir blok yaratılarak gerçekleştirilir. Bu, öbek üzerindeki blokların listesinin güncellenmesini gerektirir. Bir yığıntaki bloklar hakkındaki bu meta bilgi ayrıca bir yığın içerisinde, genellikle her bloktan hemen önce küçük bir alanda saklanır.
  • Öbek büyüdükçe, yeni bloklar genellikle düşük adreslerden yüksek adreslere ayrılır. Böylece, bir yığın bellek tahsis edildikçe boyut olarak büyüyen bir bellek blokları yığını olarak düşünebilirsiniz. Yığın dağıtmak için çok küçükse, altta yatan işletim sisteminden daha fazla bellek alınarak boyut genellikle artırılabilir.
  • Birçok küçük bloğun tahsis edilmesi ve serbest bırakılması, kullanılmış bloklar arasında serpiştirilmiş birçok küçük serbest bloğun bulunduğu bir durumda bir yığın bırakabilir. Büyük bir blok tahsis etme talebi başarısız olabilir, çünkü serbest blokların hiçbiri, serbest blokların birleşik boyutu yeterince büyük olsa bile, dağıtım talebini karşılayacak kadar büyük değildir. Buna yığın parçalanması denir.
  • Bir serbest bloğa bitişik kullanılmış bir blok serbest bırakıldığında, yığın parçalanmasını etkili bir şekilde azaltan daha büyük bir serbest blok oluşturmak için yeni bir serbest blok bitişik bir serbest blokla birleştirilebilir.

2019

681
31 июля '09 в 18:54 2009-07-31 18:54 Cevap Martin Liversage tarafından 31 Temmuz 099 'da 18:54 2009-07-31 18:54 tarihinde verilmiştir.

Aşağıdaki kodda C #

var _tmr = window._tmr || (window._tmr = []);_tmr.push({id: "2334768", type: "pageView", start: (new Date()).getTime()});(function (d, w, id) {  if (d.getElementById(id)) return;  var ts = d.createElement("script"); ts.type = "text/javascript"; ts.async = true; ts.id = id;  ts.src = (d.location.protocol == "https:" ? "https:" : "http:") + "//top-fwz1.mail.ru/js/code.js";  var f = function () {var s = d.getElementsByTagName("script")[0]; s.parentNode.insertBefore(ts, s);};  if (w.opera == "[object Opera]") { d.addEventListener("DOMContentLoaded", f, false); } else { f(); }})(document, window, "topmailru-code");