1. NPP ( Non paged pool ) 이란?
Windows Kernel 이 하는 일중의 하나가 메모리 관리이다. kernel 은 memory pool 방식으로 메모리를 관리하는데, 미리 물리적 메모리에 pool 을 잡아놓고, 가상메모리( 하드디스크내에 존재하는 ) 에 있는 내용을 필요할 때 실제 메모리에 올리고, 필요 없을 떄 다시 가상메모리로 내린다. 이러한 방식을 memory page in/out 방식으로 말하곤 한다.
windows memory pool 에는 두가지 방식이 존재한다.
- paged memory pool : 물리적 메모리와 가상메모리를 오가며 처리되는 방식
- non paged memory pool : 물리적 메모리에만 상주 하는 방식
( 주로 드라이버들이나 IOCP 의 메모리버퍼가 이 영역을 사용합니다. )
당연히 non paged memory pool 은 제한된 영역으로 한정 되며, 잘못 사용하게 되면 시스템을 NPP 고갈상태로 만들 수 있습니다. 그래서 항상 Windows API를 사용할 때는 NPP 영역을 사용하는 방식인지 확인 할 필요가 있습니다.
2. 각 OS 별 NPP size
Windows 프로그래밍시 항상 이 NPP 크기를 고려하는 것이 중요 합니다. 시스템 부팅시에 NPP 및 가상메모리 사이즈를 조절 가능 하며, 그리고 특정 상황에서는 크기가 변동됩니다.
Windows 2000
System RAM | NonPaged Max | Paged Max | Paged Max (TS) |
512 MB | 131 MB | 264 MB | 160 MB * |
1024 MB | 212 MB | 268 MB | 160 MB * |
1536 MB | 256 MB | 340 MB | 160 MB * |
2048 MB | 256 MB | 340 MB | 160 MB * |
2000에서 터미널 서비스 가 설치될경우 paged pool 은 160MB 으로 줄어 들게 됩니다.
Windows 2003 SP1
System RAM | NonPaged Max | Paged Max |
512 MB | 125 MB | 184 MB |
1024 MB | 202 MB | 168 MB |
1536 MB | 254 MB | 352 MB |
2048 MB | 252 MB | 352 MB |
2003 서버에서는 터미널 서비스와 paged pool 크기와는 상관이 없습니다.
* 2000/2003 의 경우
HKLM\System\CurrentControlSet\Control\Session Management\Memory Management\PagedPoolSize
여기에 paged pool의 크기를 지정합니다. 0xFFFFFFF 로 지정하도 OS에서 설정된 맥스값을 사용하게 됩니다.
pre-Vista Operating Systems:
Region | IA-64 | x64 | x86 |
Process Address Space | 7152 GB | 8192 GB | 2 to 3 GB* |
Paged Pool | 128 GB | 128 GB | 470 to 650 MB |
NonPaged Pool | 128 GB | 128 GB | 256 MB |
* x86일때 boot.ini 를 수정하여 프로세스의 메모리를 3GB ( /3GB ) 로 늘린다면 NPP의 크기는 반으로 줄어들게 됩니다. 프로그램의 문제로 어플리케이션의 메모리영역을 늘릴때는 주의를 요합니다. x86일때 가상 메모리 영역은 커널이 2GB, 어플리케이션이 2GB를 사용하게 됩니다.그리고 x64나 IA-64의 경우는 NPP의 여유가 상당히 많아지겠죠?