Apa arti istilah arena dalam kaitannya dengan ingatan?


100

Saya membaca buku tentang memori sebagai konsep pemrograman. Dalam salah satu bab selanjutnya, pengarang banyak menggunakan kata arena , tetapi tidak pernah mendefinisikannya. Saya telah mencari arti kata tersebut dan kaitannya dengan ingatan, dan tidak menemukan apa pun. Berikut adalah beberapa konteks di mana penulis menggunakan istilah tersebut:

"Contoh serialisasi berikutnya menggabungkan strategi yang disebut alokasi memori dari arena tertentu ."

"... ini berguna saat menangani kebocoran memori atau saat mengalokasikan dari arena tertentu ."

"... jika kita ingin membatalkan alokasi memori maka kita akan membatalkan alokasi seluruh arena ."

Penulis menggunakan istilah tersebut lebih dari 100 kali dalam satu bab. Satu-satunya definisi dalam glosarium adalah:

alokasi dari arena - Teknik mengalokasikan arena terlebih dahulu dan kemudian mengelola alokasi / deallocation dalam arena oleh program itu sendiri (bukan oleh manajer memori proses); digunakan untuk pemadatan dan serialisasi objek dan struktur data yang kompleks, atau untuk mengelola memori dalam sistem yang kritis terhadap keamanan dan / atau toleransi kesalahan.

Adakah yang bisa mendefinisikan arena untuk saya mengingat konteks ini?


Apa nama bukunya
yaobin

1
@yaobin Memory sebagai Konsep Pemrograman dalam C dan C ++ oleh Frantisek Franek.
Nocturno

Jawaban:


111

Arena hanyalah bagian besar dari memori yang berdekatan yang Anda alokasikan satu kali dan kemudian gunakan untuk mengelola memori secara manual dengan membagikan bagian dari memori itu. Sebagai contoh:

char * arena = malloc(HUGE_NUMBER);

unsigned int current = 0;

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

Intinya adalah Anda mendapatkan kendali penuh atas cara kerja alokasi memori. Satu-satunya hal di luar kendali Anda adalah panggilan perpustakaan tunggal untuk alokasi awal.

Salah satu kasus penggunaan yang populer adalah di mana setiap arena hanya digunakan untuk mengalokasikan blok memori dari satu ukuran tetap tunggal. Dalam hal ini, Anda dapat menulis algoritme reklamasi yang sangat efisien. Contoh penggunaan lainnya adalah memiliki satu arena untuk setiap "tugas", dan setelah Anda selesai dengan tugas tersebut, Anda dapat membebaskan seluruh arena sekaligus dan tidak perlu khawatir tentang pelacakan deallokasi individu.

Masing-masing teknik itu sangat khusus dan umumnya hanya berguna jika Anda tahu persis apa yang Anda lakukan dan mengapa alokasi perpustakaan normal tidak cukup baik. Perhatikan bahwa pengalokasi memori yang baik sudah akan melakukan banyak keajaiban itu sendiri, dan Anda memerlukan sejumlah bukti yang memadai bahwa itu tidak cukup baik sebelum Anda mulai menangani memori sendiri.


25
Itu jawaban yang bagus, tapi mohon pertimbangkan untuk menghapus atau mengubah paragraf terakhir. Anda benar-benar tidak membutuhkan bukti sama sekali. Setiap kali Anda tahu bagaimana Anda akan menggunakan memori, Anda tahu lebih dari sekedar pengalokasi tujuan umum yang "baik", dan jika Anda menggunakan pengetahuan ini pengalokasi khusus Anda akan selalu menang. Alokator bukanlah sihir. Arena berguna jika Anda memiliki banyak item yang semuanya mati pada titik waktu yang sama dan ditentukan dengan baik. Cukup banyak yang perlu Anda ketahui. Ini bukan ilmu roket.
Andreas Haferburg

11
@AndreasHaferburg: Pengalokasi memori dari pustaka standar secara otomatis memiliki keuntungan besar dibandingkan penulisan kustom milik Anda sendiri, yaitu Anda tidak perlu menulis / menguji / debug / memelihara dll. Bahkan jika Anda yakin tanpa bukti bahwa Anda dapat meningkatkan kinerja dengan mengelola alokasi Anda sendiri, Anda masih memerlukan bukti yang baik sebelum memutuskan bahwa peningkatan ini sepadan dengan pengorbanannya.
ruakh

17
@ruakh Saya hanya tidak suka mentalitas pemujaan kargo yang diulang jutaan kali di mana-mana sebagai "kebijaksanaan". "Dewa C ++ memberikannya kepada kami, jadi kami harus menggunakannya." Dan favorit saya: "Ini ajaib." Tidak. Itu bukan sihir. Itu hanyalah algoritme yang sangat sederhana sehingga bahkan komputer pun dapat menjalankannya. Dalam buku saya itu cukup jauh dari sihir. Dugaan saya: Anda meremehkan seberapa besar dampak alokasi memori terhadap kinerja, dan melebih-lebihkan betapa rumitnya arena. Apakah kinerja lebih penting daripada waktu pengembang adalah keputusan bisnis yang agak tidak berguna untuk dibahas di SO.
Andreas Haferburg

8
@AndreasHaferburg: Tentu, tcmalloc menggunakan beberapa algoritma tertentu, dan ide di baliknya cukup mudah untuk dijelaskan, tetapi implementasinya masih kompleks dan tidak sepele. Yang terpenting, ini membutuhkan pengetahuan khusus platform untuk mendapatkan pengurutan memori dengan benar. Saya menggunakan "sihir" untuk hal-hal yang tidak dapat ditulis secara portabel oleh pengguna sama sekali (seperti mutex yang efisien, atau tcmalloc, atau nama jenis lambda), atau hanya dengan heroik ekstrim (seperti std :: function); Saya tidak mengartikannya sebagai "tidak bisa dimengerti".
Kerrek SB

12
@AndreasHaferburg: Dan saran terakhir saya bukanlah mengatakan bahwa pada prinsipnya sulit untuk "mengetahui lebih baik daripada default", tetapi lebih karena biaya pemeliharaan solusi khusus itu tinggi (seseorang harus menulisnya, mendokumentasikannya, mendapatkannya benar, dan orang lain harus memperbaiki bug tersebut, dan setiap orang harus meninjau dan memverifikasi ulang asumsi asli saat penggunaan menyebar), dan Anda memerlukan bukti untuk membenarkan biaya tersebut.
Kerrek SB

10

Saya akan memilih yang ini sebagai jawaban yang mungkin.

•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.

Saya akan menambahkan sinonim Wikipedia : wilayah, zona, arena, area, atau konteks memori.

Pada dasarnya itu adalah memori yang Anda peroleh dari OS, dan dibagi-bagi, lalu bisa dibebaskan sekaligus. Keuntungan dari hal ini adalah bahwa panggilan kecil berulang-ulang malloc()bisa mahal (Setiap alokasi memori memiliki biaya kinerja: waktu yang diperlukan untuk mengalokasikan memori di ruang alamat logis program Anda dan waktu yang diperlukan untuk menetapkan ruang alamat itu ke memori fisik) di mana seolah-olah Anda tahu sebuah taman bola, Anda bisa mendapatkan banyak memori untuk Anda sendiri kemudian membagikannya ke variabel-variabel Anda sesuai / bagaimana Anda membutuhkannya.


5

Anggap saja sebagai sinonim untuk 'heap'. Biasanya, proses Anda hanya memiliki satu heap / arena, dan semua alokasi memori terjadi dari sana.

Namun, terkadang Anda memiliki situasi di mana Anda akan mengelompokkan serangkaian alokasi bersama (misalnya untuk kinerja, untuk menghindari fragmentasi, dll.). Dalam kasus tersebut, lebih baik mengalokasikan heap / arena baru, lalu untuk alokasi apa pun, Anda dapat memutuskan heap mana yang akan dialokasikan.

Misalnya, Anda mungkin memiliki sistem partikel di mana banyak objek dengan ukuran yang sama sering dialokasikan dan dialokasikan. Untuk menghindari memecah memori, Anda dapat mengalokasikan setiap partikel dari heap yang hanya digunakan untuk partikel tersebut, dan semua alokasi lainnya akan datang dari heap default.


5

Dari http://www.bozemanpass.com/info/linux/malloc/Linux_Heap_Contention.html :

Pustaka bersama libc.so.x berisi komponen glibc dan kode heap berada di dalamnya. Implementasi heap saat ini menggunakan beberapa sub-heap independen yang disebut arena. Setiap arena memiliki mutexnya sendiri untuk perlindungan konkurensi. Jadi, jika ada cukup arena dalam proses 'heap, dan mekanisme untuk mendistribusikan akses heap thread secara merata di antara mereka, maka potensi perselisihan untuk mutex harus minimal. Ternyata ini berfungsi dengan baik untuk alokasi. Di malloc (), pengujian dilakukan untuk melihat apakah mutex untuk arena target saat ini untuk thread saat ini gratis (trylock). Jika demikian maka arena sekarang terkunci dan alokasi dilanjutkan. Jika mutex sedang sibuk maka setiap arena yang tersisa dicoba secara bergantian dan digunakan jika mutex tidak sibuk. Jika tidak ada arena yang dapat dikunci tanpa pemblokiran, arena baru yang baru dibuat. Arena ini menurut definisi belum dikunci, sehingga alokasi sekarang dapat dilanjutkan tanpa pemblokiran. Terakhir, ID arena yang terakhir digunakan oleh utas disimpan di penyimpanan lokal utas, dan selanjutnya digunakan sebagai arena pertama untuk mencoba ketika malloc () selanjutnya dipanggil oleh utas itu. Oleh karena itu semua panggilan ke malloc () akan dilanjutkan tanpa pemblokiran.

Anda juga dapat merujuk ke tautan ini:

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


3
FYI saat posting link sebaiknya posting ringkasan agar jika link artikel hilang posting anda tetap berguna.
stonemetal

5
Tampaknya ini adalah salinan-tempel dari bozemanpass.com/info/linux/malloc/Linux_Heap_Contention.html Harap beri kredit pada sumber Anda saat Anda menggunakannya secara verbatim.
jscs
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.