[PintOS] Project3-0 가상메모리는 DRAM의 추상화다
Virtual Memory
가상메모리는 DRAM의 추상화다. 이게 무슨 말일까? CPU가 데이터를 읽고 쓰려면 물리메모리 즉, DRAM에 적재되어야 사용할 수 있다. 이때 우리는 이런 경우를 신경쓸 필요가 있나?
- 파일을 로드하거나 동적으로 메모리를 할당할때 물리메모리의 어느곳에 적재되어야하는지
- 물리메모리의 크기보다 데이터의 크기가 클때 어떻게 해야하는지
- 현재 실행중인 프로세스가 다른 프로세스가 사용중인 메모리 영역을 침범하지는 않는지
우리는 이런 경우를 신경 쓰지 않고 정적 파일을 물리메모리에 로드하거다 동적으로 메모리를 할당 받는다. 이런 궂은 일은 운영체제가 하고 우리에게는 API를 제공해주는 거다. 우리는 DRAM을 추상화한 가상메모리를 사용하는거다.
처음 운영체제를 설계할때 디자인 컨셉중에 하나는 하나의 프로세스는 하나의 머신과도 같다는 말이다. 무슨 말이냐면 우리가 실행시키는 프로그램을 하나의 컴퓨터로 추상화를 해 탄생한 개념이 프로세스다. 컴퓨터는 자신의 물리메모리를 사용한다. 프로세스는 자신의 가상 메모리를 사용한다. 즉 프로세스는 자신만을 위한 물리메모리를 갖는다는 착각을 하도록하는것이다.
그렇다면 어떻게 자신만을 위한 물리메모리라고 착각을하게 만들까? DRAM을 추상화한 가상메모리를 사용해 특정 데이터를 접근할때 운영체제는 해당 페이지를 물리메모리에 프레임을 할당하고 매핑한다. 우리는 물리메모리로 직접 접근하는것이 아닌 가상메모리주소로 접근해 매핑된 물리주소를 간접적으로 사용하는 것이다. 이렇게 되면 공유 데이터가 아닌 이상 프로세스끼리 같은 물리메로리를 접근해 서로 간섭할 수 없다.
만약 물리메모리가 꽉차면 어떻게 될까? 운영체제는 어떠한 페이지 교체 정책에 의해 희생 페이지를 선정하고 swap out을 하고 필요한 페이지를 물리메모리에 적재하여 swap in한다.
가상메모리는 프로세스 자신이 자신만을 위한 물리메모리를 가지고 있고 무한한 영역을 갖도록 착각을 심어준다.
프로세스에게 착각을 심어주려면 몇개의 자료구조와 알고리즘이 필요하다
- 가상메모리 페이지와 물리메모리 프레임의 매핑정보를 기록하는 페이지 테이블 엔트리(Page Table Entry)의 집합 페이지 테이블(Page Table)
- 페이지에 대한 추가적인 정보를 가지고있는 Suplement Page Table Entry의 집합 Suplement Page Tabe
- 프레임에 할당하고 페이지 교체할때 사용할 프레임 테이블(Frame Table)
- 페이지를 Swap하여 Swap out된 페이지를 디스크 Swap Area에 보관할때 사용할 Swap Table
- 페이지를 스왑할때 희생 페이지를 정할때 사용할 페이지 교체 정책
Virtual Address Space
+---------------------+
| |
| Page Table |
| |
+---------------------+
| VPN | PFN | FLAGS |
+---------------------+
|
|
v
+---------------------+
| |
| Supplemental Page |
| Table |
+---------------------+
| VPN | FLAGS | ... |
+---------------------+
|
|
v
+--------------------+ +---------------------+
| | | |
| Frame Table | | Swap Table |
| | | |
+--------------------+ +---------------------+
| Frame | STATUS | | SWPID | VPN |
+--------------------+ +---------------------+
| | | |
| | | |
| | | |
| | | |
v v v v
+--------------------+ +---------------------+
| | | |
| Physical Memory | | Swap Space |
| | | |
+--------------------+ +---------------------+
이와 같은것이 필요하고 우리는 이제 이것을 PintOS에서 구현한다. 레쓰꼬~!