Hafıza ile ilgili arena teriminin anlamı nedir?


101

Bir programlama kavramı olarak hafıza üzerine bir kitap okuyorum. Sonraki bölümlerden birinde, yazar arena sözcüğünü yoğun bir şekilde kullanır , ancak onu asla tanımlamaz. Kelimenin anlamını ve hafızayla nasıl ilişkili olduğunu araştırdım ve hiçbir şey bulamadım. Yazarın bu terimi kullandığı birkaç bağlam:

"Bir sonraki serileştirme örneği, belirli bir arenadan bellek ayırma adı verilen bir strateji içerir ."

"... bu, bellek sızıntılarıyla uğraşırken veya belirli bir arenadan ayırma yaparken kullanışlıdır ."

"... eğer hafızayı serbest bırakmak istiyorsak, o zaman tüm arenayı serbest bırakacağız ."

Yazar bu terimi bir bölümde 100'den fazla kez kullanıyor. Sözlükteki tek tanım şudur:

arenadan tahsis - Önce bir arenayı tahsis etme ve ardından arenadaki tahsisi / yeniden tahsisi programın kendisi (daha sonra işlem hafıza yöneticisi tarafından) yönetme tekniği; karmaşık veri yapılarının ve nesnelerinin sıkıştırılması ve serileştirilmesi için veya güvenlik açısından kritik ve / veya hataya dayanıklı sistemlerde belleği yönetmek için kullanılır.

Herkes tanımlayabilir misin arena beni bu bağlamları verilen mı?


Kitabın adı ne?
yaobin

1
Frantisek Franek tarafından C ve C ++ 'da bir Programlama Kavramı Olarak @yaobin Bellek.
Nocturno

Yanıtlar:


111

Bir alan, bir kez ayırdığınız ve daha sonra hafızanın bölümlerini dağıtarak manuel olarak belleği yönetmek için kullandığınız büyük, bitişik bir bellek parçasıdır. Örneğin:

char * arena = malloc(HUGE_NUMBER);

unsigned int current = 0;

void * my_malloc(size_t n) { current += n; return arena + current - n; }

Önemli olan, bellek ayırmanın nasıl çalıştığı üzerinde tam kontrole sahip olmanızdır. Kontrolünüz dışındaki tek şey, ilk tahsis için tek kitaplık çağrısıdır.

Popüler kullanım durumlarından biri, her alanın yalnızca tek bir sabit boyutlu bellek bloklarını tahsis etmek için kullanıldığı durumdur. Bu durumda, çok verimli ıslah algoritmaları yazabilirsiniz. Başka bir kullanım durumu, "görev" başına bir arenaya sahip olmaktır ve görevi tamamladığınızda, tüm alanı tek seferde serbest bırakabilirsiniz ve bireysel ayrılmaları izleme konusunda endişelenmenize gerek kalmaz.

Bu tekniklerin her biri çok özeldir ve genellikle ne yaptığınızı ve normal kütüphane tahsisinin neden yeterince iyi olmadığını tam olarak biliyorsanız işe yarar. İyi bir hafıza ayırıcının zaten çok fazla sihir yapacağını ve hafızayı kendiniz işlemeye başlamadan önce bunun yeterince iyi olmadığına dair makul miktarda kanıta ihtiyacınız olduğunu unutmayın.


26
Bu iyi bir cevap, ancak lütfen son paragrafı silmeyi veya değiştirmeyi düşünün. Gerçekten herhangi bir kanıta ihtiyacın yok. Bildiğiniz Her zaman nasıl sen kullanımı belleğine gidiyoruz, daha "iyi" genel amaçlı ayırıcı daha biliyor ve bu bilgiyi kullanmak durumunda özel ayırıcısı her zaman kazanacak. Ayırıcılar sihir değildir. Bir arena, hepsi aynı anda, iyi tanımlanmış bir noktada ölen çok sayıda öğeniz varsa kullanışlıdır. Bilmeniz gereken neredeyse hepsi bu. Bu roket bilimi değil.
Andreas Haferburg

12
@AndreasHaferburg: Standart kitaplıktaki bellek ayırıcı otomatik olarak kendi özel yazımınıza göre çok büyük bir avantaja sahiptir, yani yazmak / test etmek / hata ayıklamak / bakım yapmak zorunda değilsiniz. kendi tahsisatınızı yöneterek performansı artırabilirsiniz, ancak bu iyileştirmenin ödün vermeye değer olduğuna karar vermeden önce hala iyi kanıtlara ihtiyacınız vardır.
ruakh

18
@ruakh Her yerde milyonlarca kez "bilgelik" olarak tekrarlanan bu kargo kült zihniyetinden hoşlanmıyorum. "C ++ tanrıları onu bize verdi, bu yüzden onu kullanmalıyız." Ve favorim: "Bu sihir." Hayır. Sihir değil. Bu sadece bir bilgisayar bile çalıştırabilecek kadar basit bir algoritmadır. Benim kitabımda bu sihirden oldukça uzak. Tahminim: Bellek tahsisinin performans üzerinde ne kadar etkisi olabileceğini küçümsüyorsunuz ve alanların ne kadar karmaşık olduğunu abartıyorsunuz. Performansın geliştiricinin zamanından daha önemli olup olmadığı, SO üzerinde tartışılması biraz anlamsız olan bir iş kararıdır.
Andreas Haferburg

8
@AndreasHaferburg: Elbette, tcmalloc belirli bir algoritma kullanıyor ve arkasındaki fikir açıklamak için yeterince kolay, ancak uygulama hala karmaşık ve önemsiz değil. En önemlisi, bellek siparişini doğru yapmak için platforma özel bilgi gerektirir. Kullanıcı tarafından taşınabilir bir şekilde yazılamayan şeyler için (etkili bir muteks, tcmalloc veya bir lambda türü adı gibi) veya yalnızca aşırı kahramanlıklarla (std :: function gibi) "sihir" kullanıyorum; "Anlaşılamaz" demek istemiyorum.
Kerrek SB

12
@AndreasHaferburg: Ve son tavsiyem prensipte "varsayılandan daha iyi bilmenin" zor olduğunu söylemiyor, aksine özel bir çözümü sürdürmenin maliyetinin yüksek olduğunu (birinin yazması, belgelemesi, alması gerekiyor doğru, ve bir başkasının hataları düzeltmesi ve herkesin kullanım yayıldıkça orijinal varsayımları gözden geçirmesi ve yeniden doğrulaması ve bu maliyeti haklı çıkarmak için kanıta ihtiyaç duymanız gerekir.
Kerrek SB

10

Bunu olası bir cevap olarak ele alacağım .

•Memory Arena (also known as break space)--the area where dynamic runtime memory is stored. The memory arena consists of the heap and unused memory. The heap is where all user-allocated memory is located. The heap grows up from a lower memory address to a higher memory address.

Wikipedia'nın eş anlamlılarını ekleyeceğim : bölge, bölge, arena, alan veya bellek bağlamı.

Temelde işletim sisteminden aldığınız ve bölündüğünüz hafızadır, daha sonra hepsi bir kerede serbest bırakılabilir. Bunun avantajı, tekrarlanan küçük çağrıların malloc()maliyetli olabilmesidir (Her bellek tahsisinin bir performans maliyeti vardır: programınızın mantıksal adres alanında belleği ayırmak için geçen süre ve bu adres alanını fiziksel belleğe atamak için geçen süre) Burada sanki bir top parkını biliyormuş gibi kendinize büyük bir bellek parçası edinebilir ve sonra bunu değişkenlerinize / ihtiyaç duyduğunuz şekilde dağıtabilirsiniz.


5

Bunu "yığın" ile eşanlamlı olarak düşünün. Normalde, işleminizin yalnızca bir yığın / alanı vardır ve tüm bellek ayırma oradan gerçekleşir.

Ancak bazen, bir dizi tahsisatı birlikte gruplandırmanız gereken bir durumla karşılaşırsınız (örneğin, performans için, parçalanmayı önlemek için, vb.). Bu durumda, yeni bir yığın / alan tahsis etmek daha iyidir ve daha sonra herhangi bir tahsis için, hangi yığından ayıracağınıza karar verebilirsiniz.

Örneğin, aynı boyutta birçok nesnenin sıklıkla tahsis edildiği ve ayrılmasının kaldırıldığı bir parçacık sisteminiz olabilir. Belleğin parçalanmasını önlemek için, her parçacığı yalnızca bu parçacıklar için kullanılan bir yığından ayırabilirsiniz ve diğer tüm ayırmalar varsayılan yığından gelir.


5

Gönderen http://www.bozemanpass.com/info/linux/malloc/Linux_Heap_Contention.html :

Libc.so.x paylaşılan kitaplığı glibc bileşenini içerir ve yığın kodu onun içinde bulunur. Yığının mevcut uygulaması, arena adı verilen birden çok bağımsız alt yığın kullanır. Her arenanın eşzamanlılık koruması için kendi muteksi vardır. Bu nedenle, bir işlem yığını içinde yeterli alan ve iş parçacığı yığın erişimlerini aralarında eşit olarak dağıtacak bir mekanizma varsa, muteksler için çekişme potansiyeli minimum olmalıdır. Bunun tahsisler için iyi çalıştığı ortaya çıktı. Malloc () 'da, mevcut iş parçacığı için geçerli hedef alanı için muteksin ücretsiz olup olmadığını (trylock) görmek için bir test yapılır. Öyleyse, arena şimdi kilitlenir ve tahsis devam eder. Muteks meşgulse, kalan her alan sırayla denenir ve muteks meşgul değilse kullanılır. Hiçbir arenanın engellenmeden kilitlenememesi durumunda, yeni bir arena oluşturulur. Bu alan tanımı gereği zaten kilitli değildir, bu nedenle tahsis artık engellemeden devam edebilir. Son olarak, bir iş parçacığı tarafından en son kullanılan alanın kimliği iş parçacığı yerel deposunda tutulur ve daha sonra bu iş parçacığı tarafından malloc () çağrıldığında denenecek ilk alan olarak kullanılır. Bu nedenle malloc () 'a yapılan tüm çağrılar engellenmeden devam edecektir.

Bu bağlantıya da başvurabilirsiniz:

http://www.codeproject.com/Articles/44850/Arena-Allocator-DTOR-and-Embedded-Preallocated-Buf


3
Bilginize, bağlantılar gönderirken bir özet göndermelisiniz, böylece bağlantılı makale kaybolursa, yayınınız yine de yararlı olur.
stonemetal

5
Bu, bozemanpass.com/info/linux/malloc/Linux_Heap_Contention.html adresinden bir kopyala-yapıştır gibi görünüyor. Lütfen bunları kelimesi kelimesine kullandığınızda kaynaklarınıza atıfta bulunun .
jscs
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.