4GB 제한의 진실, 32비트 Windows (XP, Vista, 7)클라이언트

지난 ‘Windows 메모리 FAQ’에서 Windows 메모리에 대한 이야기를 드렸는데요, 특히 Windows 클라이언트의 4GB 제한에 대해서 여러분들의 아주 뜨거운(?) 반응이 있었습니다. 그래서 오늘은 ‘4GB 제한의 진실, 32비트 Windows 클라이언트‘ 라는 주제로 Q&A 형식으로 이야기를 나누도록 하겠습니다.

 

Q1) 왜 Windows 클라이언트는 4GB까지만 지원하나요?

 

1. Windows XP가 처음 출시된 초기만 해도 4GB 메모리라는 게 서버에서도 거의 사용되지 않는 고사양의 메모리였으므로 4GB를 이상 지원을 고려할 필요가 없었습니다. (당시는 일반적으로 사용하는 서버의 메모리가 512MB 혹은 그 이하였던 시절 이였습니다, 64MB 서버도… ^^)

 

2. Windows XP SP2가 출시될 시점에 윈도우 클라이언트도 4GB 메모리 필요성의 조짐이 보였습니다, 그래서 당시 Windows 개발팀에서는 윈도우 클라이언트에서 4GB 이상 메모리 지원을 검토하였습니다.

 

3. 그런데 윈도우 클라이언트에서 4GB 이상의 메모리를 관리(Memory Management)하면 블루스크린(Crash), 시스템 행(System Hang), 부팅이 되지 않거나 혹은 비디오 카드 같은 장치의 드라이버 문제로 장치를 인식하지 못하는 문제가 빈번하게 발생하는 것이 확인 확인되었습니다. (대부분 Memory corruption)

 

4. 이는 윈도우 클라이언트를 위해 만들어진 디바이스 장치 드라이버(Driver)가 4GB 이상 메모리 환경을 고려하지 않고 만들어졌기 때문에 발생한 문제였습니다.

 

5. 이와 같은 장치 드라이버 호환성의 문제 때문에 4GB까지만 윈도우에서 메모리 관리(Memory Management)를 할 수 있도록 한 것 입니다.

 

Q2) 4GB메모리가 전부 인식되지 않고 3.xx로 보여요, 왜 그런가요?

 

아래 그림은 제 Windows 7에서 시스템 정보(msinfo32.exe)를 실행시켜 얻을 결과입니다, 실제 설치된 메모리는 4GB지만 윈도우가 이용할 수 있는 실제 메모리는 3GB로 인식하고 있습니다.

 

clip_image002

 

하나 더 아래 그림은 작업 관리자에서 나타난 값입니다, 마찬가지로 3GB 정도만 인식하고 있는 것을 볼 수 있습니다.

 

clip_image004

 

결론부터 말씀 드리면 이 현상은 컴퓨터의 칩셋(Chipset)과 연결된 장치들(비디오 카드, Lan 카드 같은) 때문에 실제 장착된 메모리보다 적게 나타나기 때문입니다.

 

[이유는 아래와 같습니다]

 

어려운 이야기가 될 수 있으니 쉬운 이해를 위해 먼저 아래 그림을 보시죠. Windows는 하드웨어에서 보여주는 Physical Address Map(이하 PAM) 범위의 메모리만 Access 할 수 있습니다. 그런데 PAM이 RAM만 포함하는 것이 아니고 모든 종류의 디바이스(비디오 카드, Lan 카드 같은)가 가진 메모리까지 포함하게 됩니다. PAM이 RAM 뿐만 아니라 컴퓨터에 연결된 장치까지도 함께 섞이다 보니 중간에 끼여 들은 장치 RAM 때문에 RAM의 일부가 밀려서 4GB 범위 밖으로 밀려나는 것입니다. x86 Standard Memory management Mode를 사용하는 32-bit Windows는 4GB 뒤로 밀려난 나머지 영역에는 Access 할 수 없습니다. 이 이슈는 하드웨어 이슈입니다

 

clip_image006

 

위 그림은 총 4GB메모리 환경에서 디바이스 메모리가 총 500MB이기 때문에 사용할 수 있는 총 메모리가 3.5GB로 줄은 예입니다. 밀려난 500MB는 윈도우가 Access 할 수 없기 때문에 사용할 수 없습니다.

 

Windows 서버 관련한 이야기는 이전에 Sankim’s Blog에  ‘누가 내 메모리를 훔쳤나?’라는 글로 PAE 활성화에 대해서 포스팅한 적이 있습니다, 서버에 관심 있으신 분들은 참고로 읽어 보시기 바랍니다.

 

Q3) 정말 디바이스 장치들이 메모리 중간에 끼어 들어 메모리가 밀려났는지를 어떻게 해야 볼 수 있죠?

 

이전에 어떻게 해야 볼 수 있을까 고민 많이 했는데(디버거 봐야 하나.. 등등 ^^;) 의외로 장치 관리자(devmgmt.msc)에서 간단하게 보실 수 있었습니다. 아래 내용은 32비트 클라이언트뿐만 아니라 64비트와의 비교를 보여드리기 위해 제 테스트 머신에 듀얼 부팅으로 Windows Vista 32비트와 64비트를 설치해 테스트를 진행하였습니다.

 

32 비트 Windows 클라이언트

 

아래 그림은 32비트 Vista 작업 관리자(taskmgr.exe)에서 보이는 Physical Memory의 모습입니다, 4GB를 장착했지만 전체가 3.3GB정도가 나옵니다.

 

clip_image008

 

그렇다면 ‘작업 관리자’가 말하는 Windows가 실제 인식한 Physical Memory 범위는 어떤 모습일까요? 아래 그림은 Meminfo.exe를 이용하여 Windows가 실제 인식하는 Physical Memory 범위를 출력한 결과입니다. (meminfo는 전에 소개해 드렸던 Windows Internals 5’th Edition을 쓴 Alex Ionescu가 만들었습니다)

 

clip_image010

 

메모리를 표기할 때 16진수로 표현하고 이를 00000000~FFFFFFFF로(0MB에서 4GB)로 표현합니다. 위 결과를 보시면 Physical Memory 범위가 ‘00001000~0009F000’과 ‘00100000~CFDFF000’ 두 범위로 나눠져 있으며 대략 3.4GB 정도의 크기 입니다.

 

그럼 두 범위에 중간에 빠진 ‘0009F000~00100000’과’CFDFF000~FFFFFFFF’ 사이 영역은 왜 Windows에서 인식하지 못한 것 일까요? 앞에서 말씀 드렸듯이 디바이스가 해당 영역을 점유해 윈도우가 사용(Access)할 수 있는 메모리가 아니기 때문입니다.

 

디바이스가 점유한 모습은 ‘장치 관리자(devmgmt.msc)’를 통해 확인 하실 수 있습니다, ‘장치 관리자(devmgmt.msn) > 보기 > 리소스(연결별) > 메모리’를 선택합니다, 그러면 아래 그림과 같이 비디오 카드 Radeon X13000이 ‘D0000000~DFFFFFFF’(대략 268MB)과 ‘FE900000~FEAFFFFF’(대략 2MB) 영역, 즉 Physical Memory 범위에서 제외되었던 곳에 자리 잡고 있음을 확인 할 수 있습니다.

 

clip_image012

 

32비트에서는 4GB에서 밀려난 메모리를 볼 수 없습니다, 그럼 밀려난 나머지를 보기 위해 우리 64비트를 살펴보도록 하죠~

 

64비트 Windows 클라이언트

 

아래는 64비트 Vista 작업 관리자(taskmgr.exe)에서 보이는 Physical Memory의 모습입니다, 4GB 모두 보입니다.

 

clip_image014

 

Meminfo로 본 Physical Memory 범위입니다, 64비트라 Address 범위부터가 다르죠? Memory Address가 4GB를 넘고 메모리 또한 4GB 범위 모두 나타납니다.

 

clip_image016

 

장치 관리자에서 본 모습입니다.

 

clip_image018

 

32비트에서 본 것과 마찬가지로 위 빨간 박스의 부분은 268MB정도 되고 아래가 2MB정도가 됩니다. 중간에 비디오 카드가 끼어 들었지만  4GB 이후 주소인 ‘0000000100000000~000000012C000000’에서 나머지 720896KB(대략 720MB)를 인식한 것을 볼 수 있습니다. 즉 디바이스가 메모리를 4GB 영역 밖으로 밀어냈다고 해도 128GB까지 인식하는 64bit Addressing 때문에 문제없이 모든 Physical Memory가 보입니다.

 

처음에 드렸던 예로 이런 상황에서 64비트를 그림으로 표현 하면 아래와 같습니다.

 

image

 

Q4) 그럼 32비트 클라이언트가 4GB 이상을 사용(Access, Addressing)하려면 어떻게 해야 할까요?

 

정답은 64-bit Windows 클라이언트를 사용하십시오.

 

현재는 32-bit 환경에서 64-bit 환경으로 넘어가기 위해서는 우선 64비트로의 인식전환이 필요할 것입니다. 다음으로 64비트 전용 응용프로그램들이 많이 나와야 할 것 입니다, 32비트 응용프로그램을 에뮬레이션 하기 위한 WOW 64 Subsystem이 있기는 하지만 모든 응용프로그램에 호환성을 보장하지 않고 32비트 응용프로그램 구조상 64비트 Windows에서 실핼 할 때 64비트가 제공하는 무한(?)한 메모리를 이용할 수 없는 제한이 있습니다.

 

또 한가지 하드웨어 벤더에 연락해 최신 Bios와 드라이버로 업데이트 하십시오. 경우에 따라 어느 정도 해결 되는 경우가 있습니다.

 

64비트 윈도우와 응용프로그램에 대한 이야기는 관련 글이 있습니다, 읽어 보시고 추가적인 이해에 도움이 되셨으면 합니다.

 

Windows 64bit Computing에 대한 오해 혹은 잘못된 상식
http://blogs.technet.com/sankim/archive/2007/12/28/windows-64bit-computing.aspx

 

Q5) Windows XP를 보면 PAE를 지원하는데 이는 XP도 PAE를 사용하면 4GB 이상을 사용할 수 있다는 의미 아닌가요?

 

Windows XP SP2 부터 나온 DEP(Data Execution Prevention)를 사용하기 위해서는 기본적으로 PAE가 활성화(Enable)되어 있어야 합니다, 그래서 PAE 기능을 활성화 할 수 있도록 한 것입니다.

 

To use these processor features, the processor must be running in Physical Address Extension (PAE) mode. However, Windows will automatically enable PAE mode to support DEP. *해당 문서를 보시려면 여기를 클릭하세요.

 

참고로 PAE를 활성화 하는 경우와 반대의 경우 윈도우가 시작 시 로드하는 커널 파일은 아래와 같습니다.

 

CPU 수에 따른 환경

기본

PAE 활성

Uniprocess(단일 CPU)

Ntoskrnl.exe

Ntkrnlpa.exe

Multiprocess(다중 or 코어 CPU)

Ntkrnlmp.exe

Ntkrpamp.exe

 

Q6) 번 외 질문인데요, 도구마다 메모리 측정 결과가 각기 조금씩 다른 경우가 있어요 왜 그렇죠?

 

위 그림에서 작업관리자는 3.3인데 왜 meminfo는 3.4냐고 반문하실 수도 있습니다 또한 제가 종종 받는 질문 중 하나가 작업 관리자에서 ‘사용가능’ 항목과 성능 모니터에서 ‘Available %메모리%’의 값이 다르다는 것입니다. 이는 각 도구마다 메모리를 계산하기 위한 항목 수집 기준이 조금씩 달라서입니다, 크게 차이가 나는 것이 아니므로 이번 포스팅에서는 무시하셔도 좋습니다. 언제 작업 관리자에 나온 항목에 대한 자세한 설명을 드리겠습니다. (약속만 드리고 지키지 못하는 것들이 많지만 이번 약속은 !!)

 

그럼 여러분 좋은 하루 되세요~