2016-09-12 5 views
4

Google의 TCMalloc 소스 코드 (Windows 포팅)를 읽었습니다. 만약 pagesize 위의 코드 (즉 할당의 단위 인) 중 SE 수 dwPageSize 및 dwAllocationGranularity의 최대로서 산출 될 때dwPageSize와 dwAllocationGranularity 간의 관계

int getpagesize() 
{ 
    static int pagesize = 0; 
    if (pagesize == 0) 
    { 
     SYSTEM_INFO system_info; 
     GetSystemInfo(&system_info); 
     pagesize = std::max(system_info.dwPageSize, system_info.dwAllocationGranularity); 
    } 
    return pagesize; 
} 

. 내가 아는 것은이 두 값 사이의 관계의 종류입니다. 즉, 여기에 설명 된 방식으로 값을 계산해야합니까? 그리고 dwPageSize가 dwAllocationGranularity보다 클 수있는 상황이 있습니까?

+0

관련없는 노트 - jemalloc을 사용하면 모든면에서 tcmalloc보다 성능이 우수합니다. – rustyx

+0

할당 세분성이 페이지보다 작 으면 내가 볼 수있는 한별로 현명한 것이 아니지만 내가 말할 수있는 한 공식적으로 배제되지는 않았다. 아마 Google은 단지 여기에서 조심하고 있습니다. –

+1

이것을 쓴 프로그래머는 "페이지 크기"의 의미를 이해하지 못합니다. 입상 성은 항상 페이지 크기의 정수 배가되어야하며 결코 작을 수는 없다는 점 외에는 관계가 없습니다. 세분성은 주소 공간 조각화에 대한 간단한 대책입니다. 영원히 64KB가되었습니다. 할당의 모든 페이지가 동일한 보호 속성을 갖는 것은 아닙니다. [this post] (http://stackoverflow.com/a/19466079/17034)를 참조하십시오. –

답변

2

면책 조항 :이 답변은 설명서를 기반으로 한 것이 아니라 이러한 상수에 대한 나의 해석에 근거한 것입니다.

페이지 크기가 올바르게보고되었다고 가정합니다. 할당 세분성은 OS 메모리 할당 인터페이스의 세분성을 의미한다고 가정합니다.

이 두 사례 고려 있습니다

  • 할당 단위는 페이지 크기보다 더 크다. 페이지 크기의 메모리 블록을 할당하면 실제로는 더 많은 리소스를 할당하게되므로 예방해야합니다.

  • 할당 단위는 페이지 크기보다 작습니다. 할당 세분성 크기의 메모리 블록을 할당하면 여전히 전체 페이지가 할당/매핑되므로 리드를 방지해야합니다.

기본적으로 두 경우 모두 OS가 요청한 것보다 많은 메모리를 할당하게됩니다. 최대치를 사용함으로써 (사용자 공간) 할당 코드가 실제 메모리 사용량에 대해 (상대적으로) 확실해질 수 있으므로이를 피할 수 있습니다.

+1

추론이 꽤 정확합니다. ** SYSTEM_INFO ** 데이터 구조에 대한 설명서 (https://msdn.microsoft.com/en-us/library/windows/desktop/ms724958(v=vs.85).aspx)에서 ** dwPageSize ** 페이지 크기 및 페이지 보호 및 위임의 세분성입니다. ** VirtualAlloc ** 기능에서 사용하는 페이지 크기입니다. 그런 다음 ** dwAllocationGranularity **는 가상 메모리를 할당 할 수있는 시작 주소의 세분성입니다. 이 두 값이 엄격하게 시스템에 정의되어 있거나 좀 더 유연하고 사용자 정의가 가능한지 의심 스럽습니다. –