각설하고,,
C/ C++ 프로그래머나 Device Driver 작성을 하는 프로그래머에게 있어서
운영체제의 메모리 관리는 아주 중요한 부분이다.
뭐 비주얼 베이직이나 C#같은 걸 하는 사람들은 몰라도 상관없다, 충분한 메모리가 확보되면
아무런 문제도 일어나지 않기 때문이다.
그중 Windows 환경에서 프로그래밍을 하는 프로그래머들은 Windows 메모리 관리의 핵심인
가상 메모리와 페이징에 대해서 잘 알아야한다.
물리 메모리는 1Giga byte정도( 내 컴퓨터는 ㅡ.ㅜ )인 반면, 가상 메모리는 그 물리 메모리 이상을
사용할 수 있게 해준다.
메모리는 1 byte의 데이터가 1차원 배열로 Linear하게 구성되어 있다.
즉 배열의 인덱스를 접근하듯이 인덱스를 매겨서 특정 위치를 Read/Write할 수 있다.
그리고 x86 프로세서의 페이지 테이블에 의한 주소 변환 구조를 보자.
이렇게 된다. 그림을 보면 바로 이해 될 정도로 명확한 그림이다.
10 bit씩 나누고 20bit로 사용하지
않는 이유는 뭐 대충 이런 것 같다.
20bit로 페이지 테이블을 참조하게 되면,, 오버헤드가 크게 생긴다. 프로세스 하나를
생성할때마다,
페이지테이블을 만들게 되면,, 음,, 차라리 10bit로 줄여서 프로세스를 생성하는데 부담을
줄여줄려고
저렇게 설계 했나부다,
당근 빠따지만 페이지의 크기는 4Kbyte이다. 음,
x86
프로세서에서는 32bit 이므로 크기는 2의 32승 4GByte가 된다.
페이지 테이블의 각 엔트리에는 물리 메모리에 대응되면
페이지 인덱스가 설정되어 있다.
그리고 하위 12bit는 오프셋(offset)으로 앞의 bit들과 조합해서
사용한다.
그럼 누가 가상메모리에 존재하고 누가 물리메모리에 존재해야할까?
우리의 Von Neumann님 께서
stored program 방식을 개발하셔서, 물리메모리에 존재하지 않으면
프로그램이 실행되지 못한다. 흘,,
가장
많이 사용하는 메모리를 물리 메모리에 올려놓고, (당연하다, 페이징횟수를 줄이자)
그리고 운영체제는 보통 second chance
방식을 많이 쓴다. bullet 처럼 순차적으로 확인해서
사용됐던 놈이냐? 이렇게 확인하고 check bit를 셋트하고 다시 0으로
만들고 불라불라~~
운영체제 책에 있으니,, 참조를,,
그리고 present 비트가 0이면 꺼지고, 1이면
물리메모리에 존재하게 된다.
present 비트가 0일때 참조를 시도하면 컴퓨터는 0x14 exception을 발생시켜서
페이징이 발생한다.
Swap-in을 시킬 것이다.
다음번에는 VirtualAlloc()과 VirtualCopy()
함수를 알아보자.