기억과 관련하여 경기장이라는 용어의 의미는 무엇입니까?


100

프로그래밍 개념으로 기억에 관한 책을 읽고 있습니다. 이후 장 중 하나에서 저자는 arena 라는 단어를 많이 사용 하지만 정의하지는 않습니다. 나는 그 단어의 의미와 그것이 기억과 어떤 관련이 있는지 검색했지만 아무것도 찾지 못했습니다. 저자가 용어를 사용하는 몇 가지 컨텍스트는 다음과 같습니다.

"다음 직렬화 예에서는 특정 분야의 메모리 할당이라는 전략을 통합합니다 ."

"... 이것은 메모리 누수를 처리하거나 특정 분야 에서 할당 할 때 유용합니다 ."

"... 메모리 할당을 해제하려면 전체 경기장 을 할당 해제합니다 ."

저자는 한 장에서이 용어를 100 번 이상 사용합니다. 용어집의 유일한 정의는 다음과 같습니다.

아레나에서 할당 -아레나를 먼저 할당 한 다음 프로그램 자체가 아레나 내에서 할당 / 할당 해제를 관리하는 기술 (이후 프로세스 메모리 관리자가 아님) 복잡한 데이터 구조 및 개체의 압축 및 직렬화에 사용되거나 안전에 중요한 시스템 및 / 또는 내결함성 시스템의 메모리 관리에 사용됩니다.

누구든지 이러한 맥락에서 나를 위해 경기장 을 정의 할 수 있습니까 ?


책의 이름은 무엇입니까?
yaobin

1
@yaobin Memory as a Programing Concept in C and C ++ by Frantisek Franek.
Nocturno

답변:


111

아레나는 한 번 할당 한 다음 해당 메모리의 일부를 나누어 메모리를 수동으로 관리하는 데 사용하는 크고 연속적인 메모리 조각입니다. 예를 들면 :

char * arena = malloc(HUGE_NUMBER);

unsigned int current = 0;

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

요점은 메모리 할당이 작동하는 방식을 완전히 제어 할 수 있다는 것입니다. 제어 할 수없는 유일한 것은 초기 할당에 대한 단일 라이브러리 호출입니다.

한 가지 인기있는 사용 사례는 각 경기장이 하나의 고정 된 크기의 메모리 블록을 할당하는 데만 사용되는 경우입니다. 이 경우 매우 효율적인 교정 알고리즘을 작성할 수 있습니다. 또 다른 사용 사례는 "작업"당 하나의 경기장을 갖는 것입니다. 작업이 끝나면 전체 경기장을 한 번에 해제 할 수 있으며 개별 할당 해제 추적에 대해 걱정할 필요가 없습니다.

각 기술은 매우 전문적이며 일반적으로 수행중인 작업과 일반 라이브러리 할당이 충분하지 않은 이유를 정확히 알고있는 경우에만 유용합니다. 좋은 메모리 할당자는 이미 많은 마법 자체를 수행 할 것이며 메모리를 직접 처리하기 시작하기 전에 충분하지 않다는 상당한 양의 증거가 필요합니다.


25
좋은 대답이지만 마지막 단락을 삭제하거나 수정하는 것을 고려하십시오. 증거가 전혀 필요하지 않습니다. 당신이 알고있는 모든 시간을 어떻게 당신이 사용하는 메모리거야, 당신은 더 "좋은"범용 할당보다 더 알고, 당신은이 지식을 사용하는 경우 사용자 정의 할당은 항상 이길 것이다. 할당자는 마술이 아닙니다. 경기장은 같은 시점에 모두 죽는 아이템이 많을 때 유용합니다. 그게 당신이 알아야 할 전부입니다. 로켓 과학이 아닙니다.
Andreas Haferburg

11
@AndreasHaferburg : 표준 라이브러리의 메모리 할당자는 사용자 지정 작성에 비해 자동으로 큰 이점이 있습니다. 즉, 작성 / 테스트 / 디버그 / 유지 관리 등을 할 필요가 없다는 것입니다. 자신의 할당을 관리하여 성능을 향상시킬 수 있지만,이 개선이 절충할만한 가치가 있다고 결정하기 전에 여전히 좋은 증거가 필요합니다.
ruakh

17
@ruakh 난 그냥 "지혜"로 모든 곳에서 수백만 번 반복되는이화물 숭배 사고 방식을 좋아하지 않습니다. "C ++의 신들이 우리에게 주 었으니 우리는 그것을 사용해야합니다." 그리고 내가 가장 좋아하는 것은 "마법이다." 아뇨. 마술이 아닙니다. 컴퓨터도 실행할 수있을 정도로 매우 간단한 알고리즘입니다. 내 책에서 그것은 마술과는 거리가 멀다. 내 생각 엔 : 메모리 할당이 성능에 미치는 영향을 과소 평가하고 경기장이 얼마나 복잡한 지 과대 평가합니다. 성능이 개발자 시간보다 더 중요한지 여부는 SO에 대해 논의하기에는 약간의 의미가없는 비즈니스 결정입니다.
Andreas Haferburg 2016 년

8
@AndreasHaferburg : 물론, tcmalloc은 특정 알고리즘을 사용하며 그 뒤에 숨은 아이디어는 설명하기 충분히 쉽지만 구현은 여전히 ​​복잡하고 사소하지 않습니다. 가장 중요한 것은 올바른 메모리 순서를 얻기 위해 플랫폼 별 지식이 필요하다는 것입니다. 사용자가 이식 할 수없는 것 (효율적인 뮤텍스, tcmalloc 또는 람다의 유형 이름 등) 또는 극도의 영웅 (예 : std :: function)에만 "마법"을 사용합니다. "이해할 수 없다"는 뜻이 아닙니다.
Kerrek SB

12
@AndreasHaferburg : 마지막 조언은 원칙적으로 "기본값보다 더 잘 아는 것"이 ​​어렵다는 말이 아니라 맞춤형 솔루션을 유지하는 데 드는 비용이 높다는 것입니다 (누군가가 작성하고 문서화하고 다른 사람이 버그를 수정해야하며, 사용이 확산됨에 따라 모든 사람이 원래 가정을 검토하고 재 검증해야하며, 그 비용을 정당화하기위한 증거가 필요합니다.
Kerrek SB

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.

위키 백과의 동의어 인 region, zone, arena, area, memory context를 추가하겠습니다 .

기본적으로 OS에서 얻은 메모리이며 분할 한 다음 한 번에 모두 해제 할 수 있습니다. 이것의 장점은 반복되는 소규모 호출 malloc()이 비용이 많이들 수 있다는 것입니다 (모든 메모리 할당에는 성능 비용이 있습니다. 프로그램의 논리적 주소 공간에 메모리를 할당하는 데 걸리는 시간과 해당 주소 공간을 물리적 메모리에 할당하는 데 걸리는 시간) 야구장을 아는 것처럼 큰 메모리 덩어리를 얻은 다음 변수에 필요한대로 / 어떻게 나눠 줄 수 있습니다.


5

'힙'의 동의어로 생각하십시오. 일반적으로 프로세스에는 힙 / 아레나가 하나만 있으며 모든 메모리 할당은 여기에서 발생합니다.

그러나 때로는 일련의 할당을 함께 그룹화해야하는 상황이 있습니다 (예 : 성능, 조각화 방지 등). 이 경우 새 힙 / 아레나를 할당하는 것이 더 낫습니다. 그런 다음 할당에 대해 할당 할 힙을 결정할 수 있습니다.

예를 들어 같은 크기의 많은 오브젝트가 자주 할당되고 할당 해제되는 파티클 시스템이있을 수 있습니다. 메모리 조각화를 방지하려면 해당 입자에만 사용되는 힙에서 각 입자를 할당 할 수 있으며 다른 모든 할당은 기본 힙에서 가져옵니다.


5

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

libc.so.x 공유 라이브러리에는 glibc 구성 요소가 포함되어 있으며 그 안에 힙 코드가 있습니다. 힙의 현재 구현은 아레나라고하는 여러 개의 독립적 인 하위 힙을 사용합니다. 각 아레나에는 동시성 보호를위한 자체 뮤텍스가 있습니다. 따라서 프로세스의 힙 내에 충분한 아레나가 있고 스레드의 힙 액세스를 이들 사이에 균등하게 분배하는 메커니즘이 있다면 뮤텍스에 대한 경합 가능성이 최소화되어야합니다. 이것은 할당에 잘 작동한다는 것이 밝혀졌습니다. malloc ()에서는 현재 스레드의 현재 대상 아레나에 대한 뮤텍스가 사용 가능한지 (trylock) 테스트가 수행됩니다. 그렇다면 이제 경기장이 잠기고 할당이 진행됩니다. 뮤텍스가 사용 중이면 나머지 각 경기장이 차례로 시도되고 뮤텍스가 사용 중이 아니면 사용됩니다. 막히지 않고 아레나를 잠글 수없는 경우 새로운 아레나가 생성됩니다. 정의상이 경기장은 아직 잠겨 있지 않으므로 이제 차단없이 할당을 진행할 수 있습니다. 마지막으로 스레드가 마지막으로 사용한 아레나의 ID는 스레드 로컬 저장소에 유지되고 이후 해당 스레드에 의해 malloc ()이 다음에 호출 될 때 시도 할 첫 번째 아레나로 사용됩니다. 따라서 malloc ()에 대한 모든 호출은 차단없이 진행됩니다.

이 링크를 참조 할 수도 있습니다.

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


3
참고로 링크를 게시 할 때 링크 된 기사가 사라지더라도 게시물이 여전히 유용하도록 요약을 게시해야합니다.
stonemetal.

5
bozemanpass.com/info/linux/malloc/Linux_Heap_Contention.html 에서 복사하여 붙여 넣은 것 같습니다. 소스를 그대로 사용할 때 출처 를 밝히 십시오.
jscs
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.