4기가바이트 튜닝: BCDEdit 및 Boot.ini

32비트 버전의 Windows에서 애플리케이션에는 4GB(기가바이트)의 가상 주소 공간을 사용할 수 있습니다. 가상 주소 공간은 애플리케이션에서 2GB를 사용할 수 있고 다른 2GB는 시스템에서만 사용할 수 있도록 분할됩니다. BCDEdit /set increaseuserva 명령으로 사용하도록 설정된 4기가바이트 튜닝(4GT 또는 4GT RAM 튜닝) 기능은 애플리케이션에서 사용할 수 있는 가상 주소 공간을 최대 3GB까지 늘리고 시스템에서 사용할 수 있는 양을 1~2GB로 줄입니다.

DBMS(데이터베이스 관리 시스템)와 같이 메모리를 많이 사용하는 애플리케이션의 경우 더 큰 가상 주소 공간을 사용하면 상당한 성능 및 확장성 이점을 제공할 수 있습니다. 그러나 파일 캐시, 페이징 풀 및 비페이지 풀은 더 작으므로 네트워킹 또는 I/O가 많은 애플리케이션에 부정적인 영향을 줄 수 있습니다. 따라서 부하가 있는 애플리케이션을 테스트하고 성능 카운터를 검사하여 애플리케이션이 더 큰 주소 공간에서 이점을 얻을 수 있는지 여부를 확인할 수 있습니다.

4GT를 사용하도록 설정하려면 BCDEdit /set 명령을 사용하여 increaseuserva 부팅 항목 옵션을 2048(2GB)에서 3072(3GB) 사이의 값으로 설정합니다.

Windows Server 2003 이하: 4GT를 사용하도록 설정하려면 Boot.ini 파일에 /3GB 스위치를 추가합니다. /3GB 스위치는 다음 시스템에서 지원됩니다.

  • Windows Server 2003
  • Windows XP Professional

/3GB 스위치는 애플리케이션에서 사용할 수 있는 전체 3GB의 가상 주소 공간을 만들고 시스템에서 사용할 수 있는 양을 1GB로 줄입니다. Windows Server 2003에서는 Boot.ini /USERVA 스위치를 2048에서 3072 사이의 값으로 설정하여 애플리케이션에서 사용할 수 있는 주소 공간의 양을 조정할 수 있으므로 시스템에서 사용할 수 있는 주소 공간의 양이 늘어나게 됩니다. 이렇게 하면 애플리케이션에 2GB 이상이 필요하지만 주소 공간이 3GB 미만인 경우 전반적인 시스템 성능을 유지하는 데 도움이 될 수 있습니다.

애플리케이션이 더 큰 주소 공간을 사용할 수 있도록 하려면 이미지 헤더에서 IMAGE_FILE_LARGE_ADDRESS_AWARE 플래그를 설정합니다. Microsoft Visual C++ 포함된 링커는 /LARGEADDRESSAWARE 스위치를 지원하여 이 플래그를 설정합니다. 이 플래그를 설정한 다음 4GT 지원이 없는 시스템에서 애플리케이션을 실행하는 것은 애플리케이션에 영향을 주지 않아야 합니다.

64비트 버전의 Windows에서는 IMAGE_FILE_LARGE_ADDRESS_AWARE 플래그로 표시된 32비트 애플리케이션에 4GB의 주소 공간을 사용할 수 있습니다.

Windows Server 2003의 Itanium 버전: SP1 이전에는 32비트 프로세스에 2GB의 주소 공간만 사용할 수 있습니다.

다음 지침을 사용하여 애플리케이션에서 4GT를 지원합니다.

  • 2GB 경계 근처의 주소는 일반적으로 다양한 시스템 DLL에서 사용됩니다. 따라서 전체 4GB 주소 공간을 사용할 수 있더라도 32비트 프로세스는 2GB 이상의 연속 메모리를 할당할 수 없습니다.
  • 총 사용자 가상 공간의 양을 검색하려면 GlobalMemoryStatusEx 함수를 사용합니다. 가능한 가장 높은 사용자 주소를 검색하려면 GetSystemInfo 함수를 사용합니다. 항상 런타임에 실제 값을 검색하고 과 같은 #define HIGHEST_USER_ADDRESS 0xC0000000하드 유선 상수 정의를 사용하지 마세요.
  • 4GT 사용 시스템에서 애플리케이션이 충돌할 수 있으므로 포인터와 서명된 비교를 방지합니다. 2GB if (pointer > 40000000)를 초과하는 포인터의 경우 다음과 같은 조건이 false입니다.
  • 애플리케이션 정의 용도로 포인터의 가장 높은 비트를 사용하는 코드는 4GT를 사용하도록 설정하면 실패합니다. 예를 들어 32비트 단어는 0x80000000 미만인 경우 사용자 모드 주소로 간주되고 위의 경우 오류 코드로 간주될 수 있습니다. 4GT에서는 그렇지 않습니다.

VirtualAlloc 은 일반적으로 높은 주소 전에 낮은 주소를 반환합니다. 따라서 많은 메모리를 할당하거나 조각화된 가상 주소 공간이 없는 한 프로세스에서 매우 높은 주소를 사용하지 못할 수 있습니다. 테스트를 위해 더 낮은 주소 전에 더 높은 주소에서 할당을 강제로 할당하려면 VirtualAlloc을 호출할 때 MEM_TOP_DOWN 지정하거나 다음 레지스트리 값을 0x100000 설정합니다.

Hkey_local_machine\시스템\CurrentControlSet\컨트롤\세션 관리자\메모리 관리\AllocationPreference

Windows 릴리스에 대한 메모리 제한

물리적 주소 확장

4GT 기술 참조