티스토리 뷰

OS/Windows

Non-Paged Pool

엘키 2010. 8. 12. 14:43
윈도우즈에서 내부적으로, 시스템이 사용하려는 메모리 공간을 제한되게 확보하는 것들이 있는데, 그 중에서 하나가 Non-Paged Pool이다.

Memory Limits for Windows Releases

Non-Paged Pool 메모리는 물리 메모리에만 할당 되는 것으로, 페이지 폴트가 없이 접근하기 위한 메모리 영역이다. 
페이지 폴트가 없다보니, 접근 속도도 물론 빠르다.
이러한 장점으로 인해 고레벨 IRQL 접근이 오류가 없이 가능해진다.

하지만, 이런 장점에도 불구하고, 몇몇 잘못된 드라이버나 프로그램들이 Non-Paged Pool에 할당되는 데이터를 남용해서 문제가 생기곤 한다.

실제로 커널 오브젝트의 일부 (WSASend, WSARecv, bind, connect 등등)과, 커널 드라이버 들이 주로 이 메모리에 할당 된다.
하지만 말했다시피, 메모리 공간을 제한해서 확보해둔 것이기 때문에, 이 공간을 다 사용한다면 할당에 실패하게 된다.

만약 잘못된 비공식 드라이버 내지는, 공식이지만 버그가 있는 경우에는 이 공간이 충분치 않아, 커널 단 동작에 오류가 생겨 알 수 없는 증상이 발생하고, 심지어는 레지스트리나, 파일이 깨지는 증상이 발생하기도 한다 (http://support.microsoft.com/default.aspx?scid=kb;en-us;156316)
 
Non-Paged Pool 에 대한 모니터는 작업 관리자나, perfmon을 통해서 보면 된다. (커널 메모리 부분 참고)

Detail하게 pooltag까지 보고 싶다면 poolmon이나 pooltag을 사용하면 된다. pooltag를 본다면, 어떤 프로그램이 커널 메모리를 과하게 사용하고 있는지 등의 추이를 볼 수 있기 때문에, 여러가지로 유용할 것이다.

Non-Paged Pool 크기 조정시 유의 사항은, 물리 메모리 크기를 염두에 두고 조정해야 한다는 것이다. 너무 크게 설정한다면, 어플리케이션이 사용할 메모리 크기가 영향을 받기 때문이다.

Nonpaged Pool is over the warning threshold


NonPagedPoolSize

IOCP의 커널 레벨 동작 원리

원한다면 어플리케이션 단에서 페이지 아웃이 안되게 설정하는 것도 가능하다.

VirtualLock(), VirtualUnlock() 함수를 이용하면 된다.

여기서 주의할 점은, 물리적인 메모리 자원은 한정되어 있기 때문에 페이지 아웃이 안되는 메모리 영역이 커지면 가상 메모리 (물리 메모리 <-> 하드 디스크간의 이동) 처리를 위한 페이지 인/아웃을 수행하는 메모리 공간이 줄어들기 때문에, 빈번한 페이징이 일어나게 되고, 시스템 퍼포먼스 저하를 일으키게 되기 때문에 매우 신중히 결정해야 할 것이다.


PoolMon.exe 를 이용한 커널 메모리 누수 모니터
http://support.microsoft.com/kb/177415/ko

'OS > Windows' 카테고리의 다른 글

[WINDOWS] Perfmon (성능 모니터)  (0) 2011.02.09
findstr - 파일에서 문자열 찾기  (0) 2010.11.26
MS-DOS 명령어  (0) 2008.07.16
ASCII 테이블  (0) 2008.01.12
어떻게 윈도우 프로시저는 재진입되는가  (0) 2008.01.12
댓글