32bit OS에서 유저 프로세스가 사용할 수 있는 메모리 영역은 4GB이다.
하지만 AWE(Address Windowing Extension)을 이용하면 4GB보다 더 많이 쓸 수 있다.
AWE의 원리는, 기본적으로 Virtual address 가 가르키는 물리 메모리 영역은 1byte 인데.
Address Translation mode 를 바꿈으로써 1byte 이상을 가르키게 할 수 있는 방법이다.
AllocateUserPhysicalPages()를 이용하여 AWE로 사용할 물리 메모리 영역을 할당해놓고,
VirtualAlloc()의 MEM_PHYSICAL 로 VA Range(ex: 0x40000 ~ 0x50000) 에 AWE 물리 메모리 영역을 가르키게 해놓는다.
그러면 기본적으로는 0x40000 ~ 0x50000 이 가르키는 영역은 기본 Virtual Address 영역이지만,
MapUserPhysicalPages() 를 호출하면 VA Range 가 가르키는 영역이 AWE 물리 메모리 영역으로 바뀐다.
즉, MapuserPhysicalPages()를 호출하면 Virtual Address Translation 로직이 다르게 바뀌는 것이다.
원래대로 되돌리려면 MapuserPhysicalPages() 에 인자를 NULL을 넣어서 호출한다.
이렇게 하면 물리적으로 4GB 이상의 메모리를 쓸 수 있지만,
포인터를 이용해서 접근하려면 내가 지금 AWE 용 Address Translation 모드인지 아닌지를 항상 기억해야 한다 -_-
그래서 잘 안쓰는 듯..?
(혹시 잘 쓰시는 분 있으시면 리플 좀 부탁 드립니다 ㅠㅠ)
설명 : http://msdn.microsoft.com/en-us/library/aa366527(v=vs.85).aspx
예제 : http://msdn.microsoft.com/en-us/library/aa366531(v=vs.85).aspx
댓글을 달아 주세요
...일단 주로 사용되는 용어는 physical address extension인 듯 하고 (네가 써 놓은 용어는 오늘 처음 봤다), 64 bit OS를 직접 선택할 수 있는 환경이면 이런 번잡하고 error prone한 방법을 쓸 이유가 없다. 그냥 WoW64 위에 돌리면 해결.
2011.07.16 21:00 [ ADDR : EDIT/ DEL : REPLY ]나머지 중, 4G 이상의 메모리에 특정 Windows boot loader 옵션에 이런 식으로 트릭을 써서 메모리 처리해야하는 프로그램이 많지 않은 이상 (거의 없다고 본다?) 이걸 쓸 일은 없겠지.
한마디로 (현재로써는) 별 쓸모가 없어서 안 쓴다가 아닌가?
PAE 는 32bit OS가 물리적으로 사용할 수 있는 메모리의 한계치를 늘릴 수 있는 방법이고, PAE로 늘어난 메모리를 유저 프로세스에서 사용하는 방법 중 하나가 AWE 로 알고 있어요.
2011.07.17 18:36 [ ADDR : EDIT/ DEL ]말씀하신대로 error 나기가 겁나 쉽고, 복잡한 메모리풀을 만들어야지만 쓸 수 있는데, 32bit OS용 mssql 같은 거는 어쩔 수 없이 쓸 수 밖에 없죠 뭐;;
메모리 부족 이슈에 대해서 제가 생각하는 솔루션도 64bit 고고씽입니다 ㅎㅎ
일단, 64빗으로 포팅할 수 없다면, WoW64에서 돌리더라도 유저 프로세스 주소 공간이 4G로 제한되니, 의미가 없진 않겠네요. 그러나 로직 짤 때 현재 페이지를 신경써가면서 짜야 하는 상황은 절대로 피하고 적절한 추상화 계층을 통해서만 접근하도록 해야 할텐데, 그럴거면 memcached나 redis 같은 외부 프로세스 해결책을 쓰는 걸 먼저 검토해 보는 게 바람직하겠죠.
2011.07.17 11:03 [ ADDR : EDIT/ DEL : REPLY ]memcached 나 redis 에 대해서 한번 알아봐야겠네요.
2011.07.17 18:35 [ ADDR : EDIT/ DEL ]뭘 쓰든지 결국 한시책인 것 같고, 결론적으로 64bit 용으로 포팅하는 것이 올바른 방향이겠죠-
결론은 언제나 그렇듯 "그거(늘어난 메모리) 가지고 어디 쓰려고?"
2011.07.17 11:08 [ ADDR : EDIT/ DEL : REPLY ]