SORU
22 EYLÜL 2010, ÇARŞAMBA


Bellek parçalanması nedir?

"Bellek parçalanması" C dinamik bellek ayırma bağlamında birkaç kez kullandım. ben bu terimi duymuştum Bellek parçalanması ile nasıl başa çıkılacağı hakkında birkaç soru buldum ama kendisi ile ilgili doğrudan bir soru bulamıyorum. Yani:

  • Bellek parçalanması nedir?
  • Nasıl bellek parçalanma benim uygulama için bir sorun olup olmadığını söyleyebilir miyim? Ne çeşit bir program zarar olasılığı nedir?
  • Bellek parçalanma ile başa çıkmak için en iyi yolu nedir?

Ayrıca:

  • Dinamik Ayırma çok kullanarak bellek parçalanması artırabilir duydum. Bu doğru mu? C bağlamında , tüm standart konteyner anlıyorum (:: std string, std::vector, vb) dinamik bellek ayırma kullanın. Eğer bu bir program kullanılır (özellikle std::string), bellek parçalanma bir sorun olması daha muhtemel?
  • Nasıl bellek parçalanması STL-ağır bir uygulama olarak ele alınabilir?

CEVAP
22 EYLÜL 2010, ÇARŞAMBA


Bir düşünün "" (32 bayt) bellek ücretsiz genişlik: . büyük

----------------------------------
|                                |
----------------------------------

Şimdi, bazıları tahsis (5 ayırma):

----------------------------------
|aaaabbccccccddeeee              |
----------------------------------

Şimdi, ilk dört ayırmalarını ama beşincisi: ücretsiz

----------------------------------
|              eeee              |
----------------------------------

Şimdi, 16 bayt ayırmaya çalışın. Oops, neredeyse iki katı kadar boş olsa da kalmadı.

Sanal bellek sistemlerinde, parçalanma büyük ayırmalarını sadece bitişik olmak zorunda, çünkü o, senin düşündüğünden daha az sorun olursanaladres alanı içinde değilfizikseladres alanı. Eğer 2 bayt sayfa boyutu sanal bellek olsaydım yani benim örnekte, o zaman hiçbir sorun ile 16 bayt benim tahsisi yapabilir. Fiziksel bellek bu gibi görünecektir:

----------------------------------
|ffffffffffffffeeeeff            |
----------------------------------

sanal bellek (çok daha büyük) ise bu gibi görünebilir:

------------------------------------------------------...
|              eeeeffffffffffffffff                   
------------------------------------------------------...

Bellek parçalanması klasik belirtisi, büyük bir blok tahsis etmek denemen ve yeterli boş bellek var görünse de değil. Başka bir olası sonucudur yetersizlik süreci için serbest hafıza geri OS (çünkü bir nesne hala kullanımda tüm blokları bulunmaktadır ayrılan OS, olsa bile o taşları şimdi çoğunlukla kullanılmayan).

C bellek parçalanmasını önlemek için taktik büyüklüğü ve/veya beklenen ömre göre farklı alanlardan ayrılırken nesneleri ile çalışmak. Eğer çok sayıda nesne oluşturmak ve onları bir arada sonra yok edeceksin, bir bellek havuzundan onları ayırmak. Havuzdan, bu yüzden onları durdurmayacaktır arasında yaptığınız herhangi bir bellek ayırma onları arasında yer olmayacak, bellek sonucunda parçalanmış olmayacaktır.

Genelde programı çalıştırmadan uzun ve ayırma ve boşaltma yapıyor sürece endişelenecek çok daha fazla ihtiyacın yok. En fazla risk altında olduğunu kısa ömürlü ve uzun ömürlü nesneler karışımları varsa, ama o zaman bile malloc onun en iyi şekilde yardımcı olacaktır. Temelde, programın ayırma hatası veya beklenmedik bir şekilde sistemin yetersiz bellek (tercih için test bu yakala!) çalıştırmak için neden bu kadar görmezden geliyor.

Kütüphaneler bellek, standart konteyner ayıran başka bir şey daha kötü standart kesinlikle gerekli olduğunda ince ayar ayırma stratejileri kullanmak Alloc şablon parametresi.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • hitcreatormusic2

    hitcreatormu

    21 Mayıs 2010
  • Alexey - servant of Christ

    Alexey - ser

    15 EYLÜL 2007
  • Tahir Jahi

    Tahir Jahi

    6 Mart 2006