- lumenFC 축구 동호회
- 마샤블
- 웍스프레소
- 소셜@나눔<소셜미디어나눔연구소>
- 리버스코어
- LAIN
- LAIN 이사한 블로그
- TeamCR@K
- Sunnyday
- 보안 걱정이
- 리버싱 학습
- securityfirst_jo
- Practical Security Blog
- 세상, 그 유쾌한 전장
- 악성코드관련블로그
- Back to the Mac
- 패킷분석입문
- PacketInside / 네트워크 패킷 분석 블로그
- 침해사고분석 :: 네이버 블로그
- 소프트웨어 기술자경력관리시스템
- JK.Moon
- 자바 온라인학습
- Ezbeat의 도서관
- Dreams of a Final Journey
- IT eBooks - Free Download - Bi…
- Index of /madchat/coding/rever…
- Security Insight
- Reversing war game
- 고길고기
- clamav
- zerowine
- FORENSIC-PROOOF
- jquery 예제
- 조대협의블로그
- 국가과학기술인력개발원 교육포털 사이트
- 빅데이터, splunk
- 지식을 연주하는 사람
- malware analysis system
- 건국대토익스피킹
- 소프트웨어개발 및 협업도구
kisoo
Windows 2000의 메모리 관리 본문
Windows 2000은 32bit 주소 공간을 기반으로 하는 메모리 방식인데 이를 관리 하기위해 Virtual Memory Management(VMM)시스템을 사용한다. -> 이미 64비트 윈도우도 나와있다.
이는 실제 메모리에서 처리 될 수 있는 것 보다 더 많은 프로그램을 동시에 처리할 수 있으며, 각 프로세스 별로 독립된 보호모드의 메모리 공간을 할당하기 때문에 한 프로세스에서 일어나는 에러나 문제가 다른 프로세스에 영향을 줄 수 없도록 설계되어 있다.->그러나 커널 프로그램밍은 다르다. 자세한 이유는 나중에 따로 커널 프로그램밍에 대해서 블로그에 정리할 예정입니다. 그때까지 기둘려 주셈^8^
물리적 메모리 주소는 설치된 메모리의 양에 따라서 한계가 있지만 가상 메모리 주소는 32 bit 이기에 4 GB의 가상 메모리 공간을 이용할 수 있다-> 여기서 질문하나 그러면 64bit 윈도우에서는 64bit 이기 때문에 가상메모리를 얼마나 사용할 수있을가요? 아시는 분을 밑에 덧글로 남겨주세요^^
VMM은 다음 두 가지 역할을 한다.
l 각 프로세스별로 사용하는 가상 주소와 이 가상 주소가 나타내는 데이터가 실제로 위치한 주소를 연결하는 메모리 매핑 테이블을 관리한다. 쓰레드는 메모리에 대한 액세스를 요청하게 되면 이 가상 메모리 주소로 요청을 하는 데, 이 때에 VMM이 해당 가상 주소를 가지고 실제로 이에 해당하는 물리적 주소를 메모리 매핑 테이블에서 조회하여 이를 쓰레드에게 넘겨 주는 것이다.
l 이렇게 디스크와 물리 메모리 사이에 메모리의 내용을 주고 받는 것을 페이징(Paging)이라고 한다. -> User Mode 프로그램을 할떄는 서버용 프로그램을 제외하고는 크게 고려하지 않아도 된다. 그러나 커널 프로그램을 개발할때는 페이징과 VMM에대해서 확실하게 알고 있어야 한다.
가상 주소란 Windows 2000에 응용 프로그램이 메모리 참조 때 사용하는 32bit주소 공간으로서, VMM은 이 4 GB의 주소 공간을 2 GB 씩 나누어 상위 2GB와 하위 2GB로 나눈다.
l 상위 2 GB는 Kernel mode의 쓰레드만 사용할 수 있는 데, 이 상위 2 GB의 아래 부분은 실제 메모리 번지와 하드웨어적으로 직접 매핑되어 있기 때문에 굉장히 빠른 액세스 속도를 가진다.
l 하위 2 GB는 User mode와 Kernel mode의 쓰레드 둘 다 사용할 수 있는 데, VMM은 이를 4 KB단위로 필요한 상황에 따라 디스크로 스와핑(swapping)을 하기도 한다.
페이징이란 실제 메모리가 한계에 도달한 상황에서 쓰레드가 현재 실제 메모리에 없는 코드와 데이터를 액세스하려고 할 때에, VMM이 페이지 몇 개를 실제 메모리에서 디스크에 있는 pagefile이라고 불리는 저장장소에 옮겨 놓아서 실제 메모리의 여유를 가진 다음, 여기에 쓰레드가 요구한 코드와 데이터를 옮겨 놓는 작업을 말하는 것이다.
이 가상 주소 공간은 valid page와 invalid page로 나누는데, Valid page는 해당 영역이 실제 메모리에 있을 경우이며, Invalid page는 해당 페이지가 실제 메모리에 없는 경우를 말한다. 쓰레드가 Invalid page를 읽으려 하면 CPU는 page fault라는 시스템 메시지를 내놓게 되며, 이를 받은 VMM은 당장 해당 Invalid page의 내용이 들어 있는 디스크로 가서 이를 읽어서 비어 있는 실제 메모리로 가져오는 것이다.-> 만약 대용량 서버 프로그램을 개발할때는 이 부분을 최대한 고려해야 한다. 내 경험상 MemoryPool을 꼭 이용해야 한다. 여기에 대해서도 다음에 ThreadPool과 MemoryPool을 정리해요 기둘리셈~~~
VMM은 페이징을 할 때 다음의 3 과정을 수행한다.
l 디스크에서 실제 메모리로 페이지를 가져 온다. 이를 페칭(fetching)이라고 한다. VMM은 페칭을 할 때에 Invalid page 뿐만 아니라 그 아래위의 다른 페이지도 같이 가져 오는 데, 이렇게 함으로서 여러 번 가져 와야 되는 수고를 한 번으로 줄일 수 있기 때문이다. 이런 방법을 demand paging with clustering이라고 한다.
l 디스크에서 가져온 페이지를 어디에 둘 것인가를 결정한다. 실제 메모리에 여유가 있을 경우에는 VMM은 제일 첫 빈 페이지에 두게 된다. 실제 메모리에 여유가 없을 경우엔 어떤 페이지를 디스크로 옮겨 놓을 것인 가를 결정한다.
l 어떤 페이지를 디스크로 옮겨 놓을 지를 결정한다. VMM은 각 프로세스가 이용하는 페이지에 대한 기록을 가지고 있는 데 이를 프로세서의 working set이라고 부른다. 여기에서는 선입선출의 원칙대로 맨 먼저 들어 왔던 메모리 페이지가 디스크로 옮겨 갈 대상이 된다. Page fault가 발생하면 VMM은 요청한 쓰레드가 속한 프로세스의 working set를 조사하여 실제 메모리에 가장 오래 있었던(가장 먼저 들어 왔던) 페이지를 디스크로 옮겨 가는 것이다 -> 이 내용이 중요하다. 자기가 만든 프로그램이 윈도우 운영체제에서 성능을 올리고 싶으면 이개념을 꼭 파악해야 한다.