당신이 만든 가상 메모리 시스템이 제대로 돌아가기 위해서는 가상메모리 페이지(virtual pages)와 물리메모리 페이지 프레임(physical frames)를 효과적으로 관리해야 합니다. 즉, 임의의 가상 혹은 물리 메모리 영역을 누가 사용했고, 어떤 목적으로 사용했는지 등을 기억하고 있어야 합니다.
보조 페이지 테이블은 프로세스의 가상 메모리 공간과 물리 메모리 간의 매핑 정보를 관리하는 데이터 구조입니다. 1보조 페이지 테이블에는 가상 페이지 번호, 물리 페이지 번호, 페이지 상태 등의 정보가 저장됩니다.보조 페이지 테이블은 배열, 연결 리스트, 해시 테이블, 비트맵 등 다양한 방식으로 구현할 수 있습니다.
보조 페이지 테이블을 관리하는 6개의 핵심 함수를 구현해야 합니다. 2페이지 매핑 추가/제거, 페이지 상태 변경, 페이지 조회 등의 기능을 수행합니다.이 외에도 lazy_load_segment와 같은 추가 함수를 구현해야 합니다. 2
핀토스에서 커널 가상 메모리 공간은 물리 메모리와 1:1로 매핑됩니다. 따라서 커널 가상 메모리 접근 시 별도의 페이지 테이블 조회 없이 직접 물리 메모리에 접근할 수 있습니다.
가상 메모리 시스템을 구현할 때 여러 스레드의 동시 접근을 적절히 처리해야 합니다. 4세마포어, 뮤텍스 등의 동기화 기법을 활용하여 경쟁 상태를 해결해야 합니다.
핀토스 기준 , 리눅스랑 다름
💡
커널 가상 메모리 공간:
커널 가상 메모리 공간은 물리 메모리와 1:1로 매핑
따라서 커널은 별도의 페이지 테이블 조회 없이 직접 물리 메모리에 접근 가능
사용자 프로세스 가상 메모리 공간:
사용자 프로세스의 가상 메모리 공간은 물리 메모리와 1:1로 매핑되어 있지 않음
사용자 프로세스가 가상 주소를 사용할 때는 페이지 테이블을 조회하여 해당 가상 주소를 물리 주소로 변환
이러한 페이지 테이블 조회는 사용자 프로세스의 메모리 접근 시 발생하는 페이지 폴트(page fault) 처리 과정에서 이루어짐
핀토스에서 페이지 테이블은 사용자 프로세스의 가상 주소 공간에 존재
주소공간은 실행중인 프로그램의 모든 메모리 상태를 가지는데, 여러 프로그램이 메모리에 동시에 존재하려면 protection 이 필요하다.
주소 공간의 각 가상 페이지에 대한 물리 메모리 위치 기록을 위하여 운영체제는 프로세스 마다 페이지 테이블(page table) 이라는 자료 구조를 유지한다. 페이지 테이블의 주요 역할은 주소 공간의 가상 페이지 주소 변환(address translation)정보를 저장하는 것이다
물리 주소로의 변환 정보와 다른 필요한 정보를 저장하기 위하여 페이지 테이블 항목(page table entry, PTE) 마다 8바이트가 필요하다고 가정하면, 각 페이지 테이블을 저장하기 위하여 8 MB의 메모리가 필요하게 된다.
페이지 테이블이 매우 크기 때문에 현재 실행 중인 프로세스의 페이지 테이블을 저장할 수 있는 회로를 MMU 안에 유지하지 않을 것이다. 대신 각 프로세스의 페이지 테이블을 메모리에 저장한다
Why ?
다른 프로그램의 영역을 침범할 수 있는 명령어나, 논리 주소 범위를 벗어나는 명령어 실행을 방지하고 실행 중인 프로그램이 다른 프로그램에 영향을 받지 않도록 보호할 방법이 필요하다.
How ?
한계 레지스터 를 사용한다.
베이스 레지스터가 프로그램의 가장 작은 물리 주소를 저장한다면, 한계 레지스터는 논리 주소의 최대 크기를 저장한다.
즉, 프로그램의 물리 주소 범위 는
베이스 레지스터 값 이상
베이스레지스터 값 + 한계레지스터 값 미만
물리주소는
베이스 레지스터 + 논리주소
메모리에 적재된 프로세스들 중 실행되지 않는 프로세스가 있는 경우도 있다.
→ 스와핑 : 메모리 상의 빈공간에 또 다른 프로세스를 적재하여 실행하는 메모리 관리 방식
메모리에서 사용되지 않는 일부 프로세스를 보조 기억장치의 일부 영역(스왑 영역)으로 내보내고, 실행할 프로세스를 메모리로 들여 보낸다.
스왑 아웃되었던 프로세스가 다시 스왑 인될 때는 스왑 아웃되기 전의 물리 주소와는 다른 주소에 적재될 수 있다.
프로세스를 메모리에 연속적으로 할당하게 되면 메모리 외부 단편화가 생길 수 있다는 점이다.
또한, 물리 메모리보다 큰 프로세스를 실행할 수 없다.
이를 해결하기 위해 등장한 가상 메모리 관리법인 페이징을 알아보자
들어가기 전
가상 페이지의 집합
실행하고자 하는 프로그램을 일부만 메모리에 적재하여 실제 물리 메모리 크기보다 더 큰 프로세스를 실행할 수 있게 하는 기술이다.
💡 가상 메모리 관리 기법페이징 2. 세그멘테이션
페이징
메모리와 프로세스를 일정한 단위로 자르고, 메모리에 불연속적으로 할당할 수 있다면 외부 단편화는 발생하지 않을 것이다.
→ 메모리에 불연속적으로 할당하는 기법
페이징은 프로세스의 논리 주소 공간을 페이지 단위로 일정하게 자르고 메모리 물리 주소 공간을 프레임 단위 (페이지와 동일한 크기)로 자르고 페이지를 프레임에 할당하는 가상 메모리 기법이 바로 ‘페이징’
페이징을 사용하는 시스템에서는 프로세스 전체가 스왑 아웃/ 스왑 인이 되는 것이 아니라 페이지 단위로 스왑 아웃/ 스왑 인이 된다.
프로세스가 메모리에 불연속적으로 배치되어 있다면 CPU입장에서는 순차적으로 실행할 수가 없다.
프로세스가 메모리에 불연속적으로 배치되면 CPU입장에서 ‘다음에 실행할 명령어의 위치’를 찾기가 어려워 진다.
💡 해결 방법→ 물리 주소에 불연속적으로 배치되더라도 cpu가 바라보는 논리 주소에는 연속적으로 배치되도록 페이지 테이블을 이용한다.
CPU에게 페이지 번호만 보고 해당 페이지가 적재된 프레임을 찾을 수 있도록 한다.
하나의 페이지 혹은 프레임은 여러 주소를 포괄 → 특정 주소에 접근하기 위해서는 아래의 정보가 필요