Maystyle :
Admin : New post
Guestbook
Local
media
Catergories
Recent Articles
Recent Comments
Recent Trackbacks
Calendar
Tag
Archive
Link
Search
 
  Windows Internals 다시보기 07 
작성일시 : 2010. 2. 18. 17:33 | 분류 : Windows Server/Kernel

* 아직은 많이 부족하기 때문에 제가 자신이 생길 때 까지 본 글은 제 블로그에 대한 링크만 허용합니다.

Working Set 과 Committed Memory

실제 프로세스가 동작에 필요한 총 메모리는 Committed memory 라 하는데, 이 Committed memory는 실제 Physical Memory 상에 상주 하는 부분과 Paging 된 부분으로 나눠 집니다. 그리고 이 중 Physical RAM에 상주하는 메모리를 Working Set이라 합니다. 그리고 그 중에서도 해당 프로세스만이 사용하는 메모리를 Private Memory 라 합니다. 우리는 PTE의 내용을 확인 하여 이 VAD가 페이징 여부 등을 확인 할 수 있습니다.

페이지 목록 다이나믹

앞서 살펴본 notepad.exe 의 경우 가상 메모리 사용량과 Working Set의 크기가 상당히 차이가 나는 것을 볼 수 있습니다. 이는 Working Set 이 해당 프로세스의 메모리 중 실제 물리 메모리에 로딩된 페이지들을 의미하기 때문입니다.
Working Set Sizes (now,min,max) (1554, 50, 345) (6216KB, 200KB, 1380KB)
PeakVirtualSize 48 Mb
다시 말해 Committed Memory. 즉 프로세스가 사용하겠다고 선언한 메모리는 물리 메모리에 있을 수 도 있고, 하드 디스크에 있을 수 도 있습니다. 그리고 우리는 그 중 물리 메모리에 있는 페이지들을 Working Set이라 부르며, 이 중 다른 프로세스와 공유하지 않는 해당 프로세스만을 위한 메모리를 Private 메모리라 합니다. 페이지 프레임들은 아래의 그림과 같은 방법으로 페이지 목록 사이에서 이동하게 됩니다.

image

작업 세트가 가득 찼거나 (시스템 초기화때에 계산되어 MmMaximumWorkingSetSize – 512 한 값 / x86의 Windows 2003 의 경우 1984MB가 최대 값) 메모리 관리자가 작업 세트를 정리하는 등의 활동으로 인해 Working Set 중 일부 페이지가 해제 되어야 하는 경우 수정되지 않았다면 스탠바이 페이지 리스트로 가고 수정되었다면 모디파이드 페이지 목록으로 이동합니다. 만약 프로세스가 종료되게 되면 모든 프라이빗 페이지들은 프리 리스트로 이동합니다. 또한 페이지 파일에 저장되는 섹션에 대한 마지막 참조가 종료되면 이 페이지들 역시 프리 리스트로 이동합니다.

제로 페이지 폴트가 발생 하면 메모리 메니저는 0으로 초기화된 메모리를 요청합니다. 만약 0 으로 초기화된 페이지가 없는 경우에는 프리 페이지 리스트의 페이지 중 하나를 0으로 초기화 한 후 사용합니다. 물론 이 프리 페이지 역시 비어 있다면 스텐드 바이 페이지 리스트 중 하나를 0으로 초기화 한 후 사용하게 됩니다.

- 제로 페이지 폴트 : 모두 0으로 초기화된 페이지에 대한 참조 및 한번도 참조 되지 않은 메모리에 대한 유저 모드 Committed Private 페이지에 대한 참조
- 제로 페이지 폴트 발생 > 메모리 메니저 : 0으로 초기화된 메모리 요청
n 1, 0으로 초기화된 페이지 요청
n 2, 프리 페이지 리스트중 하나를 0으로 초기화 한 이후 사용
n 3, 스텐바이 페이지 리스트 중 하나를 0으로 초기화 한 후 사용
- 유저 모드 프로세스의 사용 메모리를 0으로 초기화 하는 이유 : C2 보안 규정을 충족하기 위해
n 디스크로부터 읽는 경우 0으로 초기화 하지 않고 사용하는 것을 선호함
n 디스크나 원격 저장소로부터 데이터를 가져오는 과정에서 초기화 함 (이해 않됨)

제로 페이지 쓰래드 (시스템 프로세스의 0번 쓰래드)는 프리 리스트에서 제로 페이지 리스트로 페이지를 이동시킵니다. 이 제로 페이지 쓰래드는 게이트 객체의 시작 신호를 받은 후 동작하게 됩니다. 프리 리스트에 8개 이상의 페이지가 있는 경우 게이트 객체는 이 시그널을 보냅니다. 하지만 제로 페이지 쓰래드의 경우 쓰래드 우선 순위가 0이기 때문에 다른 유저 쓰래드가 동작하지 않을 경우에만 동작할 수 있습니다 .(일반적인 유저 쓰래드의 최하 우선 순위는 1입니다. 스래드 우선 순위에 대해서는 이후 쓰래드에서 설명하도록 하겠습니다. )

- 프리 리스트에서 패이지가 8개 이상, 유휴 상태일 때 제로 페이지 쓰래드를 통해 프리 리스트의 페이지의 데이터가 0으로 변경됨

메모리 관리자가 0으로 초기화된 페이지를 원하지 않는다면 먼저 프리 리스트에서 페이지를 요청하게 됩니다. 만약 프리 리스트가 비어 있다면 다시 제로로 초기화된 페이지 리스트에서 요청하게 되고, 다시 이 리스트 마저 비어 있다면 스텐드 바이리스트에 요청하게 됩니다. 메모리 메니저가 스텐드 바이 리스트의 메모리를 사용하기 위해서는 반드시 해당 메모리 를 지시하고 있는 PTE를 찾아 참조를 제거하는 등의 적절한 조치를 해줘야 합니다.

페이징 정책

페이징은 물리 메모리의 페이지를 페이징 파일 즉 하드 디스크에 저장하는 것을 의미합니다. 즉 페이징 정책은 어떤 페이지를 페이징 할지 결정하는 정책을 의미합니다. 윈도우는 페이징이 될 페이지를 선택할 때 지역성과 FIFO LRU 방식을 이용합니다.

- 지역성 : 프로세스가 메모리를 참조할 때 특정 부분을 주로 참조하고 있다는 경험적 사실을 토대로 한 페이징 선별 방식
- LRU (Least Recently Used) : 가장 오랫동안 사용하지 않는 페이지를 교체하는 선별 방식
- FIFO (First In First Out) : 가장 먼저 사용된 메모리를 페이징 시키는 선별 방식

|