close

Yığın taşması

Gezinmeye atla Aramaya atla

Bilgi işlemde , yığında çok fazla bellek gerektiğinde yığın taşması meydana gelir .

Birçok programlama dilinde , çağrı yığını , genellikle program başlangıcında sabitlenen sınırlı miktarda bellek içerir. Yığın boyutu, programlama dili, makinenin mimarisi , çoklu iş parçacığı kullanımı ve sistemdeki belleğin kullanılabilirliği dahil olmak üzere birçok faktöre bağlıdır. Yığında çok fazla bellek kullanıldığında, bir taşma meydana geldiği ve bir program çökmesinin [1] meydana geldiği söylenir . Bu hata sınıfına genellikle iki tür programlama hatasından biri neden olur [2] : sonsuz özyineleme ve çok büyük yığın değişkenlerinin kullanımı.

Sonsuz özyineleme

Yığın taşmasının en yaygın nedeni, aşırı veya sonsuz derinlikte yinelemedir .

Scheme dili gibi kuyruk özyineleme tekniğini uygulayan diller , yığın taşması olmadan gerçekleştirilebilen belirli bir sonsuz özyinelemeye izin verir. Bunun nedeni, kuyruk özyineleme kullanan çağrıların ek yığın alanı gerektirmemesidir [3] .

Çok büyük yığın değişkenleri

Yığın taşmasının diğer önemli nedeni, yığında mevcut olandan daha fazla bellek ayırma girişimidir. Bu, çok büyük bir yerel değişken dizisi oluşturduğunuzda olur . Bu nedenle, birkaç kilobayttan büyük diziler , onları yerel değişkenler olarak tahsis etmek yerine dinamik olarak tahsis edilmelidir [4] .

Kullanılabilir yığın boyutunu azaltabilecek ve böylece yığın taşmasını daha olası hale getirebilecek nedenler

Yığın taşmaları , bir programın etkin yığın boyutunu küçülten herhangi bir şeyle birleştirilir .

Örneğin, tek bir iş parçacığı olarak çalışan bir program düzgün çalışabilir, ancak aynı program birden çok iş parçacığı ile çalışıyorsa, bir program çökmesi meydana gelir , çünkü iş parçacığı kullanan birçok program, her bir iş parçacığı için bir programdan daha küçük bir yığına sahiptir. ip kullanmaz.

Benzer şekilde, çekirdek geliştirme üzerine çalışanlara yığında özyinelemeli algoritmalar ve çok büyük arabellekler kullanmamaları tavsiye edilir [5] [6] .

C / C++ dilinden örnekler

Tek işlevli sonsuz özyineleme

 boşluk f () {  
   f ();
 }
 int ana ( boşluk ) {  
   f ();
   0 döndür ; 
 }

Bu kod parçacığı, işlevi f() çağırır ve işlev f()de kendisini çağırır, böylece sonsuz bir özyineleme oluşturur.

İki işlevli sonsuz özyineleme

 void f ( boşluk ); void g ( void );  
  
 
 int ana ( boşluk ) {  
   f ();
  
   0 döndür ; 
 }
 
 void f ( void ) {  
   g ();
 }
 
 void g ( void ) {  
   f (); }  
 

Yığın taşması gerçekleşene kadar işlev f()ve işlev g()sürekli olarak birbirini çağırır.

Yığındaki değişken çok büyük

 int ana ( boşluk ) {  
   çift ​​n [ 10000000 ]; 0 döndür ;  
    
 }

Bu kod parçacığında belirtilen dizi, yığında bulunandan daha fazla bellek gerektirir ve bu nedenle yığın taşmasına neden olur.

Notlar

  1. ^ James Craig Burley, Use and Porting GNU Fortran , sunsite.ualberta.ca üzerinde , 1 Haziran 1991 ( orijinalinden 5 Ekim 2012 tarihinde arşivlenmiştir ) .
  2. ^ Kalev Danny, Yığın Taşmasını Anlamak , devx.com , 5 Eylül 2000.
  3. ^ An Introduction to Scheme and its Implementation , federated.com'da , 19 Şubat 1997 ( orijinalinden 10 Ağustos 2007'de arşivlenmiştir ) .
  4. ^ Howard Feldman, Modern Memory Management, Part 2 , onlamp.com'da , 23 Kasım 2005. Erişim tarihi: 10 Kasım 2009 ( orijinalinden 20 Eylül 2012'de arşivlendi ) .
  5. ^ Çekirdek Programlama Kılavuzu: Performans ve Kararlılık İpuçları , geliştirici.apple.com adresinde , Apple Inc. , 7 Kasım 2006 ( 7 Aralık 2008 tarihinde orijinalinden arşivlenmiştir ) .
  6. ^ Randy Dunlap, Linux Çekirdeği Geliştirme: Başlarken ( PDF ), xenotime.net'te , 19 Mayıs 2005 ( 27 Şubat 2012'de orijinalinden arşivlendi ) .

İlgili öğeler