2010-12-10 4 views
3

operator new()이 내 C++ 프로그램으로 대체되어 allocates a slightly bigger block to store extra data이됩니다. 따라서 프로그램은 각 할당에서 몇 바이트 더 많은 메모리를 요구한다는 점을 제외하면 똑같은 할당 집합을 정확히 수행합니다. 그렇지 않으면 그것의 행동은 완전히 동일하고 정확히 동일한 데이터를 처리합니다. 이 프로그램은 런타임 동안 다양한 크기의 블록 (수백만 개, 아마도)을 할당합니다.고정 바이트 수로 각 메모리 할당 크기를 늘리면 힙 조각화에 어떤 영향을 줍니까?

고정 크기 바이트 (각 할당마다 동일)만큼 각 할당 크기를 늘리면 힙 조각화에 어떤 영향을 줍니까?

+1

네이티브 malloc/new implementaion이 이미이 작업을 수행합니다. 힙 할당자는 이미 매우 정교하므로 이와 같은 최적화를 시도하면 상황이 악화 될 가능성이 큽니다. –

+0

@Mike Weller : 최적화 작업은 어디에 있습니까? – sharptooth

+0

왜이 변경을 했습니까? –

답변

2

프로그램에서 "가장자리"블록 크기 (예 : 2에 가까움)를 사용하지 않으면 해당 블록 크기 (또는 표준 할당 된 프로그램과 비교하여 블록 크기의 작은 차이)가 표시되지 않을 수 있습니다. 단편화에 영향을 미칩니다. 수백만 배의 할당으로 좋은 할당자가 공간을 채우고 효율적으로 관리합니다.

다른 방법으로 생각해 보면, 프로그램이 원래 수정 된 할당자가있는 블록과 동일한 크기의 블록을 사용했다고 상상해보십시오. 그런 경우에 메모리 조각화에 대해 신경을 쓰시겠습니까?

1

블록 (할당 및 할당 취소 메모리)이 조각화 문제없이 C 라이브러리 할당자가 처리하는 메모리 조각이 여전히 작 으면 메모리 조각화가 발생하지 않아야합니다. 예를 들어 할당 자에 대한 내 자신의 질문을보십시오 : Small block allocator on Linux (or RedHat Linux) to avoid memory fragmentation.

다른 말로하면. 당신은 자신의 :: operator new()를 암시했습니다. 그리고 그것에 malloc()을 호출하고 더 큰 블록 크기를 전달합니다. malloc()은 C 라이브러리에 있으며 할당 및 할당 해제뿐만 아니라 메모리 조각화를 피하는 역할을 담당합니다. 할당 자보다 효율적으로 처리 할 수있는 크기 이상의 블록을 자주 할당하거나 해제하지 않으면 메모리 조각화가 발생할 것으로 예상 할 수 있습니다.

1

일반적으로 힙은 셀의 연결된 목록으로 구현됩니다. 응용 프로그램 시작시 하나의 큰 셀만 있습니다. 첫 번째 할당은 새 할당 된 힙 셀을 만들기 위해 처음에는 작은 조각으로 나누어집니다. 후속 할당도 동일합니다. 잠시 후 할당 된 블록 사이에 빈 공간을 남겨두고 일부 셀이 해제됩니다.

할당을 요청하면 잠시 실행 한 후 할당 기가 요청한 것과 같거나 더 큰 크기의 공백 셀을 찾을 때까지 힙을 처리합니다. 더 큰 셀 할당 크기로 반올림하면 앞에 더 많은 메모리가 필요할 수 있지만 적절한 자유 셀을 찾을 확률이 높아 지므로 새 메모리를 힙 끝에 추가 할 필요가 없습니다. 성능이 향상 될 수 있습니다.

그러나 힙 작업은 비용이 많이 들어가므로 최소화해야합니다. 같은 유형의 개체를 할당하고 할당 취소하는 것이 가장 가능성이 큽니다. 귀하의 개체에 대한 전문적인 무료 목록을 사용하십시오. 이렇게하면 힙 작업이 저장되므로 조각화가 최소화됩니다. 바로이 이유 때문에 STL에 할당자가 있습니다.

1

메모리 할당자를 구동하는 구현에 따라 달라집니다. 예 : 과부에, XP에서 프로세스 힙의 메모리를 가져옵니다.이 힙은 낮은 조각화 구현으로 설정되지 않아 실제로 스패너가 작동합니다.

빈 또는 슬래브 기반 할당 자에서 몇 가지 여분의 바이트가 다음 블록 크기까지 밀어 넣어 메모리를 낭비하고 끔찍한 가상 메모리 스레 싱을 일으킬 수 있습니다.

메모리 사용량에 따라 hared 또는 nedmalloc과 같은 것으로 ::new을 바꾸기 위해 맞춤식 알라세이터를 사용하는 것이 더 나을 것입니다.

관련 문제