2013-03-19 4 views
2

나는 의심의 여지가있다.tbb :: memory_pool <tbb :: scalable_allocator <char>> 올바르게 사용하는 방법?

tbb :: memory_pool의 경우 < tbb :: scalable_allocator> shared_memory_pool_;

주 스레드에서 인스턴스화되는 경우 그리고 저는 worker_memory_pool_.malloc (sizeof (my_class))를 worker 쓰레드에서 호출했습니다. tbb는 메인 힙으로부터 그 크기의 메모리를 할당 할 것인가, 아니면 "도메인"으로부터 할당하여 일반적인 malloc()에 의한 잠금 경합이 여전히 피할 수 있도록 할 것인가?

+0

스레드 별 힙이 있습니까? 스레드는 일반적으로 자체 스택 공간을 갖지만 힙을 생성 한 프로세스와 힙을 공유합니다. – Praetorian

+0

도큐멘트가 명확하게 진술하지 않았으므로 명확하지 않지만 scalable_allocator가 동적 힙에서 직접 메모리를 할당하지 않으므로 melloc() 시스템 호출에 의해 블록되지 않습니다. –

+0

동적 힙이라고하면, 그런 것은 없습니다. 내가 말한 것은 malloc()이 사용하는 "share heap"이었다. –

답변

2

tbb::memory_pooltbb::scalable_allocator과 동일한 내부 구조를 기반으로합니다. 따라서 일단 메모리 풀이 처음에 메모리를 잡으면 (지정한 경우, tbb::scalable_allocator에서도 마찬가지 임) 동일한 메커니즘을 사용하여 스레드간에 배포하고 다시 사용합니다. 나는. 확장 성이 있으며 가능하면 전역 잠금을 피합니다. 메모리가 여전히 일반적인 리소스이기 때문에 일부 스레드 동기화는 어쨌든 불가피합니다. 특히, 스레드 당 캐시가 아직 따뜻하지 않기 때문에 초기 메모리 요청에 대해 더 많은 경쟁이 예상됩니다. 또한 scalable_allocator는 확장 성과 메모리 소비 사이의 균형을 유지하려고 시도하므로 thread끼리의 캐쉬가 쓰레드간에 일종의 스레드 동기화 (비록 잠금보다 확장 성이 높지만) 사이의 메모리를 재배포하는 데 열중하지 않습니다.

scalable_allocator에 의한 [초기] 메모리 할당은 malloc이 아닌 충분한 메모리 청크의 경우 mmap 또는 VirtualAlloc을 거칩니다.

0

Here은 메모리 풀을 올바르게 구현하는 방법에 대한 유용한 설명입니다. 그에 따르면 :

구현시 스레드 안전하고 확장 가능한 방식으로보다 일반적인 기능 을 제공하려고했습니다. 이를 위해 메모리 풀 중 구현은 TBB 확장 가능 메모리 할당자를 기반으로하므로 은 비슷한 속도와 메모리 소비 속성을가집니다.

희망이 도움이됩니다.