2012-02-28 5 views
5

malloc/free 함수를 많이 사용하는 프로그래밍 프로젝트가 있습니다. 매우 다이내믹하고 큰 숫자의 세 가지 유형의 구조가 있습니다. 이 방법으로 malloc과 free가 많이 사용되며 초당 수천 회라고합니다. SLAB의 사용자 공간 버전으로 표준 메모리 할당을 대체하면이 문제를 해결할 수 있습니까? 그러한 알고리즘의 구현이 있습니까?SLAB와 유사한 기술로 C 프로그램 최적화

P.

  1. 시스템은 Linux 지향적입니다.
  2. 구조체의 크기가 100 바이트 미만입니다.
  3. 마지막으로, 메모리 관리가 실제로 어려운 주제이기 때문에 준비된 구현 방법을 선호합니다.
+0

광산을 확인하십시오. https://github.com/bbu/Userland-slab-allocator –

+0

@BlagovestBuyukliev : 감사합니다. 내 SLAB를 구현하면 매우 유용 할 것입니다. 일부 아이디어는 intresting이고 나는 메모리 관리에 너무 강하지 않아 도움이 될 것입니다. –

+0

+1 메모리 관리를 인식하는 것은 어렵고 기존 구현을 요구합니다. –

답변

8

3 가지가 다른 경우 풀 할당 자 (맞춤 설정되었거나 boost::pool과 비슷하지만 C의 경우)를 사용하면 크게 얻을 수 있습니다. Doug Lea's binning based malloc은 풀 할당 자 (glibc에서 사용됨)를위한 아주 좋은 기초 역할을합니다.

그러나 멀티 스레딩과 메모리 재사용과 같은 다른 요소도 고려해야합니다 (개체 할당, 해제, 재 할당 또는 할당 해제 후 해제)? 이 각도에서 tcmalloc (극단적 인 할당, 수량 및 메모리 사용량 용으로 설계된), nedmalloc 또는 보물을 확인할 수 있습니다. 이러한 할당자는 모두 오픈 소스이므로 사용자가 할당하는 객체의 크기를 쉽게 변경할 수 있습니다.

+0

질문에 'C'태그가 지정되었습니다. 아마도 부스트를 사용할 수 없습니다. (죄송합니다, 당신은 'boost :: pool'과 같이 말했습니다. 죄송합니다.) 좋은 링크. – Kaganar

+0

@Kaganar : 내가 '좋아요'라고 말한 이유는, 불행히도'boost :: pool' 외의 다른 풀 할당자를 모르겠습니다. 그러나 나는 그것을 고쳐 줄 것이다. – Necrolis

+0

@Necrolis : 고마워, 내 자신의 구현에 대해, 내 목표에 맞게, 메모리 재사용 및 큰 곡물 할당과 함께 생각하고있어. 그러나 그것은 자전거의 재발 명과 같을 것입니다. –

1

당신에게 좋은 대답을 줄 수는 없다는 것을 알지 못하지만 네 자신의 메모리를 관리하면 (대개 큰 블록을 할당하고 그 큰 블록에서 자신의 할당을함으로써) 일반과 관련된 높은 비용을 피할 수 있습니다 범용 메모리 관리자. 예를 들어, Windows에서 많은 작은 할당은 무릎에 성능을 가져올 것입니다. 기존의 구현은 거의 모든 유형의 메모리 관리자에 대해 존재하지만 정확히 어떤 종류의 것을 요구하고 있는지 확실하지 않습니다 ...

Windows에서 프로그래밍 할 때 malloc/free를 호출하는 것이 성능면에서 거의 죽음과 같습니다. 일괄 처리로 메모리 할당을 상각하는 모든 인앱 메모리 할당은 할당/해제 할 때 프로세서 시간을 절약 할 수 있으므로 기본 할당자를 호출하지 않는 한 사용하는 방식이 그다지 중요하지 않을 수 있습니다.

This 엄격 슬래브 관리자 아니지만, 그것은 좋은 균형을 달성하기 위해 보인다 일반적으로 사용됩니다

말했다되는 것을 여기에 몇 가지 간단한 멀티 스레딩 - 순진한 생각이다.

필자는 종종 동일한 크기의 메모리 블록에 대해 구현하기가 매우 간단한 메모리 재사용 관리자를 사용합니다. 고정 된 크기의 사용되지 않은 메모리 목록을 유지 관리하고 새로운 블록을 할당합니다. 메모리가 필요할 때. 여기에있는 트릭은 링크 목록에 대한 포인터를 사용하지 않는 메모리 블록에 저장하는 것입니다. 이렇게하면 4 바이트의 매우 작은 오버 헤드가 생깁니다. 전체 프로세스는 메모리를 재사용 할 때마다 O (1)입니다. 메모리를 할당해야 할 때 슬래브 할당자를 호출합니다 (그 자체는 자명합니다).

순수 할당 전용 슬래브 할당 자의 경우 시스템에 많은 양의 메모리를 할당하고 아직 사용하지 않은 공간 (사용하지 않은 영역의 시작 부분과 끝 부분에 대한 포인터를 유지하십시오). 요청 된 크기를 할당 할 공간이 충분하지 않으면 새 슬랩을 할당하십시오. 큰 청크의 경우 시스템 할당 자로 전달하십시오.)

이러한 접근 방식을 연결하는 데 문제가 있습니까? 응용 프로그램은 메모리를 전혀 사용하지 않지만 성능이 중요한 응용 프로그램은 종종 원샷 처리 응용 프로그램이거나 같은 크기의 많은 개체를 만든 다음 사용을 중단합니다.

위의 방법을 사용하면 원자 적 연산만으로도 멀티 스레드를 쉽게 사용할 수 있습니다.

1

최근에 내 자신의 사용자 공간 슬래브 할당자를 구현했으며 많은 양의 고정 크기 할당에 대해 malloc/free보다 훨씬 더 효율적 (속도 및 메모리 방식)으로 입증되었습니다. 당신은 그것을 here 찾을 수 있습니다.

할당 및 해제는 O (1) 시간 동안 작동하며 빈/전체 슬롯을 나타내는 데 사용되는 비트 벡터로 인해 속도가 빨라집니다. 할당 할 때 __builtin_ctzll GCC 내장 함수는 비트 벡터 (빈 슬롯을 나타냄)의 첫 번째 세트 비트를 찾는 데 사용되며, 이는 현대 하드웨어에서 단일 명령어로 변환되어야합니다. 해제 할 때, 해당 슬랩의 헤더를 찾고 해당 슬롯을 자유롭게 표시하기 위해 포인터 자체를 사용하여 영리한 비트 연산이 수행됩니다.