오늘 제가 말씀드린 메모리 모델을 정리합니다.
32비트 2단계 메모리 모델에서
10비트 페이지 디렉토리 1개와 10비트 페이지 테이블 1개를 사용한다면
1개의 프로세스에서 사용하는 전체 크기는 최소 4K + 4K에서 최대 4K + 4M 입니다.
10비트 페이지 디렉토리 1개가 관리할 수 있는 메모리 크기는
10비트 페이지 디렉토리 x 10비트 페이지 테이블 x 페이지 크기,
1024 x 1024 x 4K = 4G 입니다.
즉, 1개의 프로세스마다 1개의 페이지 디렉토리를 사용해야 하고
task_struct 구조체 내에 있는 struct mm_struct *mm구조체 내의 pgd_t *pgd; 멤버 변수가
그 프로세스의 메모리를 관리하는 페이지 디렉토리의 주소를 가리킵니다.
따라서 프로세스마다 다른 값을 갖고 있으며
컨텍스트 스위칭이 일어날 때 pgd 변수값을 (x86 기준) CR3 레지스터에 세팅해주는 코드가 있습니다.
1개의 프로세스마다 10비트 페이지 디렉토리 1개를 사용하기 때문에
프로세스 개수 만큼 페이지 디렉토리가 필요하고
필요한 전체 크기는 프로세스 개수 x (최소 4K + 4K) 입니다.
위의 설명은 32비트 2단계 메모리 모델에서의 설명입니다.
이에 조금 변칙적으로 응용한 리눅스 32비트에서의 3단계 메모리 모델이나
64비트 3단계 모델과 4단계 모델도 방식은 다 비슷비슷합니다.
댓글 3
-
홍문화
2011.05.01 03:21
-
홍문화
2011.05.01 15:40
아... 생각 해보니 페이지 테이블 하나로 접근 할 수 있는 프로세스 주소 공간이 최소 4KB 에서 최대 4MB네요.
페이지 디렉토리가 프로세스당 하나씩 존재 하는게 맞습니다. ㅋ
-
홍문화
2011.05.01 03:33
그리고 태클이라는 단어 선택은 좀 적절치 않다고 생각하구요. (나쁜 의도는 전혀 없습니다. ^^;)
그만큼 우리 스터디 분위기가 열정적이고 적극적이지 않나 생각합니다.ㅋ
물론 반드시 짚고 넘어가야 할 질문에 대해 정리하고 넘어가야 한다는 생각은 동의 합니다.
방법론에 대해 다 같이 한번 고민 해봤으면 좋겠네요. (100분 토론처럼 사회자를 데리고 할 수는 없겠죠? 농담 ㅋ)
그리고 오늘 장성민님께 죄송했던 부분이 스핀락을 이해하지 못하신 분들을 위해 설명 하려고 하셨던것 같은데
이미 해결 된 이슈를 다시 공론화 시키는 것으로 오해 했습니다. 오늘 high memory 설명 감사 했습니다. ^^;
.
영화 한편 때리고 자려다가 댓글을 달게 되었습니다. ㅋ
저는 좀 생각이 다른데요. 페이지 테이블 하나로 최소 4KB 에서 최대 4GB 크기의 메모리를 가지는 프로세스의
모든 주소에 접근 가능하기 때문입니다. 이렇게 되면 페이지 디렉토리 하나로 1024개의 페이지 테이블의 베이스
주소에 접근 가능 하므로(페이지 디렉토리는 4바이트 크기를 가지는 1024개의 인덱스를 가집니다.) 페이지
디렉토리 하나로 1024개의 프로세스에 접근 가능합니다. 만일 1024개 이상의 프로세스를 생성하고자 한다면
페이지 디렉토리를 하나 더 만들면 되겠죠. 그래서 프로세스 하나당 페이지 디렉토리 하나는 메모리 낭비가
아닌가 생각합니다.