메뉴 건너뛰기


Developer > Operating System

Windows Windows 메모리 한계 및 해결 방법

2013.12.28 05:16

푸우 조회 수:11128

Windows 메모리 한계 및 해결 방법
 
윈도우즈에서 OS의 메모리 인식 한계는 다음의 URL에 가면 알아 볼 수 있습니다.
윈도우즈 자체가 32bit 혹은 64bit 윈도우즈냐로 나눠서 생각을 해야 하구요.
또 Application 자체도 32bit냐 64bit냐로 나눠서 생각을 해야 합니다.
 
우선 OS자체에서 물리 메모리 인식의 한계는 다음과 같습니다.

1.png
2.png
3.png
4.png
5.png

6.png
7.png
 
여기까지는 윈도우즈가 물리적 메모리를 어디까지 인식할 수 있는가 입니다.
예로 Windows XP 32bit OS는 4G까지 메모리를 꽂아야 한다는 것입니다.
하지만 실제로 Windows XP 32bit OS를 사용하면서 메모리를 4G까지 꽂는다면 실제로는 3Giga만 인식합니다.
위의 표는 PAE(Physical Address Extentions)가 활성화 되었다는 가정하에 내 놓은 예시입니다. 
 
□ PAE(Physical Address Extentions) 활성화 하기
PAE(Physical Address Extentions)는 가상 메모리내의 포인터 테이블로 "별도 메모리 영역"을 매개함으로 프로세스가 사용할 수 있는 실제 메모리 크기를 확장하는 것 입니다.
PAE를 활성화 시키는 방법은 다음과 같습니다.
Windows XP/2000/2003 의 경우 C:\boot.ini 파일의 "/fastdetect" 뒤에 "/PAE"를 추가 하여 리부팅 하면됩니다.
 
8.png
 
 
Windows VISTA/2008/7 의 경우는 관리자 권한으로 cmd 창에서 "bcdedit /set pae forceenable" 이라고 입력하고 엔터 치면 됩니다.
이와 같이 하면 32bit Windows XP에서 4Giga의 물리적 메모리를 모두 사용할 수 있습니다.
관련자료는 http://msdn.microsoft.com/en-us/library/aa366796(VS.85).aspx 에서 볼 수 있습니다.
 
이번에는 응용프로그램을 한번 생각해 보도록 하겠습니다.
응용프로그램이 실제로 돌아갈때 OS는 커널이 사용할 메모리공간과 사용자가 사용할 수 있는 메모리 공간을 나눠 놓고 있습니다.
 
9.png
 
64bit OS에서는 커널이 기본 8TB까지 사용할 수 있고 32bit OS에서는 커널이 2GB까지 사용할 수 있습니다. 뭐 이건 OS가 알아서 사용하는 거니깐 우린 별 관심이 없겠죠.
우리가 관심있는 것은 내가 구동시킬 Application 즉, 개발한 프로그램이 사용할 수 있는 메모리가 얼마나 되느냐가 주요 관심사 이겠죠.
 
위의 표로 보면 32bit windows에서 32bit Application은 2GB까지 사용할 수 있다고 나와 있네요.
32bit Application이라면 64bit Windows에서도 크게 다르진 않네요.
64bit Windows에서 64bit Application은 최대 8TB까지 사용이 가능하네요.
 
제가 32bit XP에서 테스트 해 본 결과 실제로는 메모리 사용량이 2G가 좀 못 되서 malloc이 메모리 할당을 하지 못하더군요. 2G가 못되는 이유는 그 때 당시의 메모리 사용 상황에 영향을 받는 듯 합니다.
 
그런데 위에 표를 보면 IMAGE_FILE_LARGE_ADDRESS_AWARE 라는 글이 자꾸 보이는 군요.
 
□ 응용프로그램을 2G이상의 메모리를 사용할 수 있도록 컴파일 하기
IMAGE_FILE_LARGE_ADDRESS_AWARE 는 실행파일의 로드 이미지 구조중에 특정 bit를 의미합니다.
실행파일에 IMAGE_FILE_LARGE_ADDRESS_AWARE 비트가 설정되게 하려면 컴파일 할때 Link옵션으로 /LARGEADDRESSAWARE 를 주어 컴파일하면 됩니다. 
즉, Application을 컴파일 할 때 Link 옵션으로 /LARGEADDRESSAWARE 를 주면 메모리를 더 사용할 수 있다는 이야기입니다.
64bit Application은 기본으로 IMAGE_FILE_LARGE_ADDRESS_AWARE 비트가 설정되어 컴파일되게 되어 8TB까지 사용이 가능하고 그렇지 않으면 2TB까지만 사용이 가능합니다.
32bit Application은 기본으로 IMAGE_FILE_LARGE_ADDRESS_AWARE 비트가 Clear되어 2GB까지만 사용할 수 있고 옵션을 설정하면 3GB까지 사용할 수 있습니다.
단, OS에게도 이러한 응용프로그램이 OS가 제한하는 한계를 넘어서 메모리를 사용할 수 있도록 허용하여야 가능합니다.
 
□ Windows 32bit OS에서 응용프로그램이 2G이상의 메모리 사용을 허가하기
Windows 32bit OS에서 IMAGE_FILE_LARGE_ADDRESS_AWARE 비트가 설정된 응용프로그램이 2GB이상의 메모리를 사용할 수 있도록 허용하는 방법은 다음과 같습니다.
Windows XP/2000/2003 의 경우 C:\boot.ini 파일의 "/3GB" 를 추가 하여 리부팅 하면됩니다.
Windows VISTA/2008/7 의 경우는 관리자 권한으로 cmd 창에서 "bcdedit /set increaseuservapae ####" 이라고 입력하고 엔터 치면 됩니다.
여기서 ####은 2048과 3072 사이의 값으로 적어야 하며 2048은 2GB, 3072는 3GB를 의미합니다.
 관련된 내용은 다음의 링크를 참조하세요.
 
 
□ 4GB이상 메모리 처리를 위한 API
위와 같이 하여 결국은 하나의 Application이 2G를 초과하여 운영될 수 있게 되었습니다.
하지만 64bit OS에서 4GB이상의 메모리를 잡아서 사용하기 위해서는 또 다른 문제가 있습니다.
하나의 프로세스가 4GB를 초과하여 메모리를 할당하여 사용하기 위해서는 AWE(Address Windowing Extensions) API를 사용하여야 합니다.
API의 종류로는 VirtualAlloc(), VirtualAllocEx(), AllocateUserPhysicalPages(), MapUserPhysicalPages(), MapUserPhysicalPagesScatter(), FreeUserPhysicalPages() 가 있습니다.
즉, malloc(), free() 대신에 위의 함수들을 써서 개발해야 한다는 것이죠.
이미 malloc()으로 개발되어 있는 응용프로그램을 가지고 이렇게 저렇게 해볼려고 했는데.. 좌절입니다. ㅠㅠ
결과 저는 목적하는 바를 성공 하질 못했지만 여러분은 꼭 성공하시길 바라며 이글을 정리합니다.
 
AWE에 대한 내용은 http://msdn.microsoft.com/en-us/library/aa366527(VS.85).aspx 를 참조하세요.
 
 
아래에 위의 내용과 관련하여 읽어볼 만한 글이 있더군요 참고 하세요.
 
 
 
Creative Commons License
Creative Commons License이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-동일조건변경허락 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
Copyright 조희창(Nicholas Jo). Some rights reserved. http://bbs.nicklib.com