* 아직은 많이 부족하기 때문에 제가 자신이 생길 때 까지 본 글은 제 블로그에 대한 링크만 허용합니다. 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 이 해당 프로세스의 메모리 중 실제 물리 메모리에 로딩된 페이지들을 의미하기 때문입니다. 작업 세트가 가득 찼거나 (시스템 초기화때에 계산되어 MmMaximumWorkingSetSize – 512 한 값 / x86의 Windows 2003 의 경우 1984MB가 최대 값) 메모리 관리자가 작업 세트를 정리하는 등의 활동으로 인해 Working Set 중 일부 페이지가 해제 되어야 하는 경우 수정되지 않았다면 스탠바이 페이지 리스트로 가고 수정되었다면 모디파이드 페이지 목록으로 이동합니다. 만약 프로세스가 종료되게 되면 모든 프라이빗 페이지들은 프리 리스트로 이동합니다. 또한 페이지 파일에 저장되는 섹션에 대한 마지막 참조가 종료되면 이 페이지들 역시 프리 리스트로 이동합니다. 제로 페이지 폴트가 발생 하면 메모리 메니저는 0으로 초기화된 메모리를 요청합니다. 만약 0 으로 초기화된 페이지가 없는 경우에는 프리 페이지 리스트의 페이지 중 하나를 0으로 초기화 한 후 사용합니다. 물론 이 프리 페이지 역시 비어 있다면 스텐드 바이 페이지 리스트 중 하나를 0으로 초기화 한 후 사용하게 됩니다. - 제로 페이지 폴트 : 모두 0으로 초기화된 페이지에 대한 참조 및 한번도 참조 되지 않은 메모리에 대한 유저 모드 Committed Private 페이지에 대한 참조 제로 페이지 쓰래드 (시스템 프로세스의 0번 쓰래드)는 프리 리스트에서 제로 페이지 리스트로 페이지를 이동시킵니다. 이 제로 페이지 쓰래드는 게이트 객체의 시작 신호를 받은 후 동작하게 됩니다. 프리 리스트에 8개 이상의 페이지가 있는 경우 게이트 객체는 이 시그널을 보냅니다. 하지만 제로 페이지 쓰래드의 경우 쓰래드 우선 순위가 0이기 때문에 다른 유저 쓰래드가 동작하지 않을 경우에만 동작할 수 있습니다 .(일반적인 유저 쓰래드의 최하 우선 순위는 1입니다. 스래드 우선 순위에 대해서는 이후 쓰래드에서 설명하도록 하겠습니다. ) - 프리 리스트에서 패이지가 8개 이상, 유휴 상태일 때 제로 페이지 쓰래드를 통해 프리 리스트의 페이지의 데이터가 0으로 변경됨 메모리 관리자가 0으로 초기화된 페이지를 원하지 않는다면 먼저 프리 리스트에서 페이지를 요청하게 됩니다. 만약 프리 리스트가 비어 있다면 다시 제로로 초기화된 페이지 리스트에서 요청하게 되고, 다시 이 리스트 마저 비어 있다면 스텐드 바이리스트에 요청하게 됩니다. 메모리 메니저가 스텐드 바이 리스트의 메모리를 사용하기 위해서는 반드시 해당 메모리 를 지시하고 있는 PTE를 찾아 참조를 제거하는 등의 적절한 조치를 해줘야 합니다. 페이징 정책 페이징은 물리 메모리의 페이지를 페이징 파일 즉 하드 디스크에 저장하는 것을 의미합니다. 즉 페이징 정책은 어떤 페이지를 페이징 할지 결정하는 정책을 의미합니다. 윈도우는 페이징이 될 페이지를 선택할 때 지역성과 FIFO LRU 방식을 이용합니다. - 지역성 : 프로세스가 메모리를 참조할 때 특정 부분을 주로 참조하고 있다는 경험적 사실을 토대로 한 페이징 선별 방식 |