Яке значення терміна арена стосовно пам’яті?


100

Я читаю книгу про пам'ять як концепцію програмування. В одному з пізніших розділів автор широко використовує слово арена , але ніколи не визначає його. Я шукав значення цього слова та його відношення до пам’яті, і нічого не знайшов. Ось кілька контекстів, у яких автор використовує термін:

"Наступний приклад серіалізації включає стратегію, яку називають розподілом пам'яті з певної сфери ."

"... це корисно при роботі з витоками пам'яті або при виділенні з певної арени ."

"... якщо ми хочемо розмістити пам'ять, тоді ми розберемо всю арену ".

Автор використовує в одній главі термін понад 100 разів. Єдине визначення у словнику:

виділення з арени - техніка виділення спочатку арени, а потім управління розподілом / угодами на арені самою програмою (а не менеджером пам'яті процесів); використовується для ущільнення та серіалізації складних структур даних та об'єктів, або для управління пам'яттю в критично важливих для безпеки та / або стійких до відмов системах.

Чи може хтось визначити арену для мене з огляду на ці контексти?


Як називається книга?
яобін

1
Пам'ять @yaobin як концепція програмування в C і C ++ від Франтишека Франека.
Nocturno

Відповіді:


111

Арена - це просто великий, суміжний фрагмент пам'яті, який ви виділяєте один раз, а потім використовуєте для управління пам’яттю вручну, роздаючи частини цієї пам’яті. Наприклад:

char * arena = malloc(HUGE_NUMBER);

unsigned int current = 0;

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

Справа в тому, що ви отримуєте повний контроль над тим, як працює розподіл пам'яті. Єдине, що не є вашим контролем, - це єдиний виклик бібліотеки для початкового розподілу.

Один популярний випадок використання - це те, коли кожна арена використовується лише для виділення блоків пам'яті одного, фіксованого розміру. У цьому випадку ви можете написати дуже ефективні алгоритми рекультивації. Інший випадок використання - мати одну арену на "завдання", і коли ви закінчите це завдання, ви можете звільнити всю арену за один раз і не потрібно турбуватися про відстеження окремих угод.

Кожна з цих методик є дуже спеціалізованою і, як правило, стане у нагоді лише у тому випадку, якщо ви точно знаєте, чим займаєтесь, і чому звичайний розподіл бібліотеки недостатньо хороший. Зауважте, що хороший розподільник пам'яті вже зробить багато магії, і вам потрібно пристойну кількість доказів того, що це недостатньо добре, перш ніж самостійно розпочати обробку пам'яті.


25
Це гарна відповідь, але, будь ласка, подумайте про вилучення чи внесення змін до останнього абзацу. Вам насправді ніяких доказів взагалі не потрібно. Щоразу, коли ви знаєте, як ви збираєтеся використовувати пам'ять, ви знаєте більше, ніж «хороший» розподільник загального призначення, і якщо ви використовуєте ці знання, ваш користувальницький розподільник завжди виграє. Розподільники - це не магія. Арена корисна, якщо у вас багато предметів, які вмирають у той самий, чітко визначений момент часу. Це майже все, що потрібно знати. Це не ракетна наука.
Андреас Хафербург

11
@AndreasHaferburg: Розподільник пам’яті зі стандартної бібліотеки автоматично має величезну перевагу перед власноручним написанням власного, а саме тим, що вам не потрібно писати / тестувати / налагоджувати / підтримувати і т.д. Ви можете покращити ефективність, керуючи власним розподілом, перед тим, як вирішити, що це покращення варте компромісу, вам потрібні хороші докази.
ruakh

17
@ruakh Мені просто не подобається ця штука-культова ментальність, яка мільйони разів повторюється скрізь як "мудрість". "Боги C ++ дали нам це, тому ми маємо його використовувати". І моя улюблена: "Це магія". Ні. Це не магія. Це просто такий алгоритм, який настільки простий, що його може запустити навіть комп'ютер. У моїй книжці це досить далеко від магії. Я здогадуюсь: ви недооцінюєте, який вплив може мати розподіл пам'яті на продуктивність, і переоцінюєте, наскільки складні арени. Чи важливіша продуктивність, ніж час для розробників, - це бізнес-рішення, яке мало доцільно обговорювати на SO.
Андреас Хафербург

8
@AndreasHaferburg: Безумовно, tcmalloc використовує певний алгоритм, і ідею, що стоїть за ним, досить просто пояснити, але реалізація все ще є складною і нетривіальною. Найголовніше, що для правильного впорядкування пам'яті потрібні знання для платформи. Я використовую "магію" для речей, які користувач взагалі не може записати портативно (наприклад, ефективний мутекс, tcmalloc або ім'я лямбда), або лише з крайньою героїкою (наприклад, std :: function); Я не маю на увазі це як "не можна зрозуміти".
Керрек СБ

12
@AndreasHaferburg: І моя остання порада не стільки говорить про те, що в принципі важко "знати краще, ніж за замовчуванням", а швидше, щоб вартість підтримки спеціального рішення була високою (хтось повинен її написати, задокументувати, отримати правильно, а хтось інший повинен виправляти помилки, і всі повинні переглядати та підтверджувати оригінальні припущення щодо поширення використання), і вам потрібні докази, щоб виправдати цю вартість.
Керрек СБ

10

Я піду з цим як можлива відповідь.

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

Я додаю синоніми Вікіпедії : регіон, зона, арена, область чи контекст пам'яті.

По суті, це пам'ять, яку ви отримуєте від ОС, і поділяєте її, а потім можете звільнитися всі відразу. Перевагою цього є те, що неодноразові невеликі дзвінки до malloc()можуть бути дорогими (кожен розподіл пам’яті має вартість продуктивності: час, необхідний для розподілу пам’яті в логічному адресному просторі програми та час, необхідний для призначення цього адресного простору фізичній пам’яті) де, ніби ви знаєте парк кульок, ви можете отримати собі великий шматок пам’яті, тоді передайте його своїм змінним як / як вам це потрібно.


5

Подумайте про це як синонім 'купи'. Зазвичай у вашому процесі є лише одна купа / арена, і все розподілення пам'яті відбувається звідти.

Але іноді виникає ситуація, коли ви б згрупували ряд виділень разом (наприклад, для продуктивності, щоб уникнути фрагментації тощо). У цьому випадку краще виділити нову купу / арену, і тоді для будь-якого розподілу ви можете вирішити, з якої групи виділити.

Наприклад, у вас може бути система частинок, де часто виділяються та розміщуються багато об'єктів одного розміру. Щоб уникнути фрагментації пам’яті, ви можете виділити кожну частинку з купи, яка використовується лише для цих частинок, а всі інші виділення надходитимуть із за замовчуванням.


5

Від http://www.bozemanpass.com/info/linux/malloc/Linux_Heap_Contention.html :

Бібліотека спільного використання libc.so.x містить компонент glibc, і кодовий код знаходиться всередині нього. Поточна реалізація купи використовує кілька незалежних підгруп, які називаються аренами. Кожна арена має свій власний мютекс для захисту паралельності. Таким чином, якщо в процесі "купи" є достатньо арен, і механізм розподілу ниток "купує рівномірний доступ між ними, то потенціал для суперечок для мютексів повинен бути мінімальним. Виявляється, це добре працює для асигнувань. У malloc () проводиться тест, щоб перевірити, чи вільна mutex для поточної цільової арени для поточного потоку (трилок). Якщо так, то арена тепер заблокована, і розподіл триває. Якщо мютекс зайнятий, то по черзі пробується будь-яка залишилася арена та використовується, якщо мютекс не зайнятий. У випадку, якщо жодна арена не може бути заблокована без блокування, створюється нова свіжа арена. Ця арена за визначенням ще не заблокована, тому виділення тепер може тривати без блокування. Нарешті, ідентифікатор арени, який останній використовується потоком, зберігається в локальному сховищі потоку, а згодом використовується як перша арена, щоб спробувати, коли наступний потік викликається malloc (). Тому всі дзвінки на malloc () будуть протікати без блокування.

Ви також можете посилатися на це посилання:

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


3
FYI, коли публікує посилання, ви повинні розмістити резюме, так що якщо пов’язана стаття піде, ваша публікація все ще буде корисною.
каменеметал

5
Здається, це копія-вставка з bozemanpass.com/info/linux/malloc/Linux_Heap_Contention.html Будь ласка, зарахуйте свої джерела, коли ви використовуєте їх дослівно.
jscs
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.